Upgrade to Pro — share decks privately, control downloads, hide ads and more …

今更ながらLambda + Bedrockを検証してみた

Avatar for Takuya Ishikawa Takuya Ishikawa
September 24, 2025
96

今更ながらLambda + Bedrockを検証してみた

Avatar for Takuya Ishikawa

Takuya Ishikawa

September 24, 2025

Transcript

  1. Copyright © 2025 BeeX Inc. All Rights Reserved. Copyright ©

    2025 BeeX Inc. All Rights Reserved. 今更ながらLambda + Bedrockを検証 してみた Ver 1.0 2025年9月17日(水) 石川 卓弥
  2. Copyright © 2025 BeeX Inc. All Rights Reserved. 2 目次

    1. 自己紹介 2. なぜこのテーマにしたのか ➢ なんでこのテーマにしたのか ➢ このテーマで話したいこと ➢ AIクライアント(Cline)とは 3. Lambda + Bedrock ➢ 構成図 ➢ 軽くLambdaとBedrockの紹介 ➢ 画像を読み込ませるには ➢ Excelを読み込ませるには ➢ 複数ファイルを出力するには 4. Clineではどうやってるのか 5. まとめ
  3. Copyright © 2025 BeeX Inc. All Rights Reserved. 3 経歴

    : バス会社事務(高卒入社) ⇒ 大学 ⇒ アプリ開発へ(5年くらい) ⇒ BeeX入社(2024年8月) 趣味 : ・ゲーム … するゲームは様々です 集まる人数多いときはダーツとか麻雀とか ・ギター … そんなに上手くはないです ・サウナ … 週1で行ってます 今興味あること: ・バイク(免許とるところから) ・ドラム(初心者) ・AWSの資格年内にいくつか取ろうかと思ってます 自己紹介 石川 卓弥(30) いしかわ たくや 出身:福岡県姪浜市 家族構成 ・妻(28) 2人で横浜に在住 ・弟(25) 川崎に住んでます 兄弟 プロフィール
  4. Copyright © 2025 BeeX Inc. All Rights Reserved. Copyright ©

    2025 BeeX Inc. All Rights Reserved. なぜこのテーマにしたのか
  5. Copyright © 2025 BeeX Inc. All Rights Reserved. 5 なんでこのテーマにしたのか?

    ✓ 案件の中で検証する機会が最近あったから ✓ AIクライアント(ClineとかClaude Code)は少し触っていたので、 クラウド(Lambda + Bedrock)での違いとかが印象に残った ✓ やってみたら分かったハマりどころを共有したかった ✓ 試したことある人からは共感得やすいと思った
  6. Copyright © 2025 BeeX Inc. All Rights Reserved. 6 このテーマで話したいこと

    AIの難しい話はしないです • ベクトルとか精度とか • RAGとかファインチューニングとか • 運用上の観点や、セキュリティとか 単純にLambdaでBedrockを触ってみた話をします 逆に言えば自分と同じであまりAI触ってない方がいたら嬉しいなと思ったので、 何かの気づきとかきっかけになればいいかなと思います
  7. Copyright © 2025 BeeX Inc. All Rights Reserved. 8 AIコーディングエージェント(Cline)とは

    簡単なpythonのコードを作成してほしいです 簡単なPythonコードを作成いたします!どのような 機能のコードをご希望でしょうか? 例えば: - 計算機(電卓) - ファイル操作(読み書き) - データ処理(CSV、JSON等) - ゲーム(じゃんけん、数当てゲーム等) - ウェブスクレイピング - GUI アプリケーション - その他 じゃんけんのゲームのpythonをお願いします。
  8. Copyright © 2025 BeeX Inc. All Rights Reserved. 9 AIコーディングエージェント(Cline)とは

    「janken_game.py」pythonの使い方をreamd.me ファイルを作って記載してもらえますか? ※Clineは他にもローカル上にある画像ファイルや、Excelファイル をINPUTにしてAIにコードなどを生成依頼をすることも可能です
  9. Copyright © 2025 BeeX Inc. All Rights Reserved. Copyright ©

    2025 BeeX Inc. All Rights Reserved. Lambda + Bedrock
  10. Copyright © 2025 BeeX Inc. All Rights Reserved. 12 ・サーバレスで実行できる関数の実行サービス

    ・BedrockへAPIをAWS SDKで呼び出せる (簡単な)Lambda、Bedrock紹介 AWS Lambda Amazon Bedrock client = boto3.client("bedrock-runtime", region_name="us-west-2") response = client.invoke_model( modelId="apac.anthropic.claude-sonnet-4-20250514-v1:0", body=json.dumps({ "anthropic_version": "bedrock-2023-05-31", "max_tokens": 500, "temperature": 0, "messages": [ {“role”: “user”, “content”: “こんにちは、自己紹介してください"} ] }), contentType="application/json", accept="application/json" ) ・Amazonが提供する生成AIのプラットフォーム ・色んな会社のAIモデルをAPI経由で使えるサービス
  11. Copyright © 2025 BeeX Inc. All Rights Reserved. 13 Lambda

    + BedrockでAIクライアントみたいにしたい ✓ 画像ファイルどうしたらいいの? ✓ AIには文字しか渡せないのでは ✓ Excelファイルはどうしたらいいの? ✓ そもそもExcelファイルはインプットファイルとして対応してるの? ✓ 複数ファイルを出力させるには? ✓ AIへの返答は基本的に1リクエストで1レスポンス
  12. Copyright © 2025 BeeX Inc. All Rights Reserved. 14 画像を読み込ませたいとき

    # base64に変換 img_b64 = base64.b64encode(img_bytes).decode("utf-8") # Bedrockクライアント client = boto3.client("bedrock-runtime", region_name="us-east-1") # Claude 3 のマルチモーダル入力例 body = { "anthropic_version": "bedrock-2023-05-31", "max_tokens": 512, "messages": [ { "role": "user", "content": [ {"type": "text", "text": "この画像に写っているものを説明してください"}, { "type": "image", "source": { "type": "base64", "media_type": "image/png", "data": img_b64 } } ] } ] } response = client.invoke_model( modelId=" apac.anthropic.claude-sonnet-4-20250514-v1:0 ", contentType="application/json", accept="application/json", body=json.dumps(body) ) ✓ 画像ファイルをBase64にエンコード ➢ iVBORw0KGgoAAAANSUhEU… ➢ エンコードして画像データを文字に ✓ エンコードした情報をbodyに格納 ✓ 配列のjsonのため複数入れることもできる ✓ 例) Typeに画像は2種類です ✓ 例) Base64の情報を2つ入れる ✓ Client.Invoke_model()でBedrockに入れる 画像データを直接Bedrockに送信することはできないため Base64とかで文字データに変換して渡してあげる必要がある
  13. Copyright © 2025 BeeX Inc. All Rights Reserved. 15 Excelファイルを読み込ませたいとき

    # 各シートを処理 for sheet_name, sheet_data in excel_sheets.items(): logger.info(f"シート '{sheet_name}' の処理を開始") # データの基本情報を取得 total_rows = len(sheet_data) total_columns = len(sheet_data.columns) # 基本的なデータ処理 sheet_processed_data = [] # 各行を処理 for index, row in sheet_data.iterrows(): # 空の行をスキップ if row.isnull().all(): continue # 行データを辞書形式に変換(データ型を保持) row_dict = {} for column in sheet_data.columns: value = row[column] # NaN値の処理 if pd.isna(value): row_dict[column] = None else: # データ型を保持したまま格納 row_dict[column] = value sheet_processed_data.append(row_dict) # シートごとの処理結果を保存 processed_data[sheet_name] = sheet_processed_data total_rows_processed += len(sheet_processed_data) ✓ 空行はいらないのでスキップ ✓ シートごとの結果を保存する Excelファイルは特殊で工夫が必要 ✓ シートが分かれてる ✓ 関数が入力されてる ✓ Excelファイル内の全シートで行う ✓ データを以下のように変換しているイメージ { "sheet1": [ ["くだもの", "価格", "産地"], [“りんご", 100, "東京"], [“みかん", 200, "大阪"], [“ばなな”, 300, “名古屋"] ] }
  14. Copyright © 2025 BeeX Inc. All Rights Reserved. 16 複数ファイル出力させたいとき(1/2)

    リクエストには複数のINPUTファイルを含めることは出来る 返ってくるのは一つのレスポンス 設計書とか画像ファイル(構成図)とかから出力するとき Terraformのコードとかだと複数に分かれてた方が見やすい 設計書 構成図 INPUTファイル output/main.tf /variables.tf /outputs.tf OUTPUTファイル
  15. Copyright © 2025 BeeX Inc. All Rights Reserved. 17 複数ファイル出力させたいとき(2/2)

    リクエストには複数のINPUTファイルを含めることは出来る 返ってくるのは一つのレスポンス 設計書 構成図 INPUTファイル output/main.tf /variables.tf /outputs.tf OUTPUTファイル 設計書と構成図からTerraformのコードを作成してください。 レスポンスはXML形式で返してください。 <file name=¥"main.tf¥">メインリソース定義</file>¥n <file ¥r¥n name=¥"variables.tf¥">変数定義</file>¥n <file name=¥"outputs.tf¥">出力定義</file> プロンプト 返ってきた内容を Lambda内で整形する Bedrock内で XMLに分けて一つの レスポンスを返す
  16. Copyright © 2025 BeeX Inc. All Rights Reserved. Copyright ©

    2025 BeeX Inc. All Rights Reserved. Clineではどうやっているのか
  17. Copyright © 2025 BeeX Inc. All Rights Reserved. 19 もしかしてClineでも同じようなことしてるのでは…

    ✓ 画像ファイルをBase64に変換してる箇所 ✓ エクセルファイルはどうしているのか ✓ 複数ファイルを制御している箇所
  18. Copyright © 2025 BeeX Inc. All Rights Reserved. 21 Bedrockにリクエストしている箇所があるはず…

    cline-main/src/core/api/providers/bedrock.ts /** * Executes a Converse API stream command and handles the response * Common implementation for both Anthropic and Nova models */ private async *executeConverseStream(command: ConverseStreamCommand, modelInfo: ModelInfo): ApiStream { try { const client = await this.getBedrockClient() const response = await client.send(command) if (response.stream) { // Buffer content by contentBlockIndex to handle multi-block responses correctly const contentBuffers: Record<number, string> = {} const blockTypes = new Map<number, "reasoning" | "text">() ・・・ client = boto3.client("bedrock-runtime", region_name="us-west-2") response = client.invoke_model( modelId="apac.anthropic.claude-sonnet-4-20250514-v1:0", body=json.dumps({ "anthropic_version": "bedrock-2023-05-31", "max_tokens": 500, "temperature": 0, "messages": [ {“role”: “user”, “content”: “こんにちは、自己紹介してください"} ] }), contentType="application/json", accept="application/json" ) Lambdaで記載した箇所 Githubで見ると色々なプロバイダに対応している ことがわかる 例えば… Bedorock Geminiとか
  19. Copyright © 2025 BeeX Inc. All Rights Reserved. 22 画像を変換している箇所があるはず…

    cline-main/src/integrations/misc/extract-images.ts // Convert buffer to base64 const base64 = buffer.toString("base64") const mimeType = getMimeType(filePath) as "image/jpeg" | "image/png" | "image/webp" // Create the image block in Anthropic format const imageBlock: Anthropic.ImageBlockParam = { type: "image", source: { type: "base64", media_type: mimeType, data: base64, }, } # base64に変換 img_b64 = base64.b64encode(img_bytes).decode("utf-8") # Claude 3 のマルチモーダル入力例 body = { "anthropic_version": "bedrock-2023-05-31", "max_tokens": 512, "messages": [ { "role": "user", "content": [ {"type": "text", "text": "この画像に写っているものを説明してください"}, { "type": "image", "source": { "type": "base64", "media_type": "image/png", "data": img_b64 } } ] } ] } Lambdaで記載した箇所 Githubで見るとmarkdownとかもあるので 色々なファイル形式の変換していることが見れる 例えば… pdfとかmarkdown とか
  20. Copyright © 2025 BeeX Inc. All Rights Reserved. 23 Excelを読み込んでる箇所があるはず…

    cline-main/src/integrations/misc/extract-text.ts async function extractTextFromExcel(filePath: string): Promise<string> { const workbook = new ExcelJS.Workbook() let excelText = "" try { await workbook.xlsx.readFile(filePath) workbook.eachSheet((worksheet, _sheetId) => { // Skip hidden sheets if (worksheet.state === "hidden" || worksheet.state === "veryHidden") { return } excelText += `--- Sheet: ${worksheet.name} ---¥n` worksheet.eachRow({ includeEmpty: false }, (row, rowNumber) => { // Optional: limit processing for very large sheets if (rowNumber > 50000) { excelText += `[... truncated at row ${rowNumber} ...]¥n` return false } const rowTexts: string[] = [] let hasContent = false row.eachCell({ includeEmpty: true }, (cell, _colNumber) => { const cellText = formatCellValue(cell) if (cellText.trim()) { hasContent = true } rowTexts.push(cellText) }) // Only add rows with actual content if (hasContent) { excelText += rowTexts.join("¥t") + "¥n" } return true }) excelText += "¥n" // Blank line between sheets ✓ Excelファイル内を読み込んでいる ✓ シートを考慮してる ✓ 非表示のシートはスキップ ✓ シート名をテキストに追加したり ✓ 各行を読み込んでる ✓ 行数が50000を超えたら強制的に打ち切ってる ✓ 各セルを処理 ✓ セルに数値、日付であっても文字化するようにしている ✓ 空白はスキップしている ✓ 各行のテキスト化 ✓ シート間を区切る
  21. Copyright © 2025 BeeX Inc. All Rights Reserved. 24 複数ファイルを制御している箇所があるはず…

    ✓ 1つのファイルを作成→結果を確認→次のファイルを作成を繰り返してる ✓ 複数のファイルがあるときは、1回ずつリクエスト、書き込み、状況の共有 ✓ 一貫性を保つため、前のファイルの内容を記憶する必要性 ✓ 大量ファイルを出力するときは多くのAPI呼び出しが必要 index.tsでリクエストについての制御をしているみたいなのですが、 2000行を超えるコードで全てを紹介することができず… あと詳しくは見れなかったです… cline-main/src/core/task/index.ts ✓ メリットとして ✓ 複数あるうちの1つのリクエストで失敗してもそのファイルだけ作成されない ✓ 1回1回承認をユーザーにしてもらうことで認識ずれを早めに回避できる ✓ 情報共有も1回1回行うため安心
  22. Copyright © 2025 BeeX Inc. All Rights Reserved. Copyright ©

    2025 BeeX Inc. All Rights Reserved. まとめ
  23. Copyright © 2025 BeeX Inc. All Rights Reserved. 26 まとめ

    ✓ BedrockをAPIで利用するときは、扱うデータによって工夫する必要がある ✓ 不便に感じた部分もあるが、工夫次第かなと思います ✓ APIを利用するときは返ってくるまで(30秒くらい)レスポンスがない ✓ ClineだとThinking…(考え中)とか出てくれるのでその辺りも必要かなと思いました ✓ もっとレスポンスが早くなったりすると使いやすくなっていく