AgentCore Code Interpreter を boto3 で直接操作して Excel レポートを生成してみた

AgentCore Code Interpreter を boto3 で直接操作して Excel レポートを生成してみた

2026.04.09

はじめに

こんにちは!AI 事業本部のこーすけです。

今回は AgentCore Code Interpreter を boto3 で直接操作して、ファイルの入出力を伴うデータ分析と Excel ファイルの生成を試してみました。セッション管理から、CSV アップロード+ pandas での分析、さらに Excel の レポートを生成して取り出すところまでを一通り検証します。

Amazon Bedrock AgentCore とは

Amazon Bedrock AgentCore は、AI エージェントを本番環境で安全かつ大規模に運用するためのマネージド基盤です。特定のフレームワークやモデルに依存せず、エージェントの開発からデプロイ、運用監視までをカバーしています。

https://dev.classmethod.jp/articles/amazon-bedrock-agentcore/

今回は Built-in Tools に含まれる Code Interpreter を使います。

AgentCore Code Interpreter とは

概要

AgentCore Code Interpreter は、AI エージェントが 安全なサンドボックス環境でコードを実行できるマネージドサービスです。

https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/code-interpreter-tool.html

AgentCore 内のコンテナ化された環境で実行されるため、隔離された環境でコードの実行を行うことができます。エージェントが生成したコードを実行しても、ホスト環境やほかのセッションに影響を与えることがないため、セキュリティを損なうことなく、複雑なワークフローやデータ分析を遂行するエージェントの開発に集中できます。
Python と Node.js の両方に対応したライブラリがプレインストールされているほか、大容量のファイルサポートもあるので、個人的には、データ分析系のタスク実行とそのレポーティングとの相性がよさそうな感じがします。

プリインストール済みライブラリ

https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/code-interpreter-preinstalled-libraries.html

Python 環境には 200 以上のライブラリがプリインストールされています。カテゴリ別に主要なものを紹介します。

カテゴリ 主要ライブラリ
データ分析・可視化 pandas, numpy, matplotlib, plotly, scipy
機械学習・AI scikit-learn, torch, torchvision, openai
ファイル処理・ドキュメント openpyxl, XlsxWriter, PyPDF2, pdfplumber, reportlab, fpdf
Office 系 python-docx, python-pptx, docx2txt, odfpy
画像・メディア Pillow, opencv-python, ffmpeg-python, imageio
Web・API requests, fastapi, uvicorn, Jinja2
AWS boto3, AWS CLI

一通り主要なライブラリがそろっていますね。
Lambda でこれらのライブラリを使える環境をセットしようとすると手間がかかるのでありがたいです。

セッションの仕組み

https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/code-interpreter-session-characteristics.html

Code Interpreter はセッションベースで動作します。

項目
セッションタイムアウト デフォルト:15 分、最大:8 時間
利用可能ファイルサイズ インラインアップロード:最大 100MB、S3 経由:最大 5GB
ファイル永続性 セッション終了時に消えます
セッションの有効期間 30 日

セッション内であれば、前に実行したコードの変数やインポートを引き継げます。ただし、セッションが終了するとファイルも含めてすべてリセットされるため、実行結果をファイルとして活用したい際は、そのセッション中に S3 などに取り出しておく必要があります。

使ってみる

今回は以下の 3 ステップで検証を進めます。
エージェンティックなことは本ブログでは行わず、できる操作を確認し動作検証することが目的です。

ステップ 内容
検証 1 Hello World
検証 2 CSV アップロードと分析
検証 3 Excel 生成と取り出し

前提条件

  • AWS 認証情報が設定済み
  • Python 3.10 以上

プロジェクトのセットアップ

今回は uv でプロジェクトのセットアップを行いました。
プロジェクトに必要なライブラリをインストールします。

uv init code-interpreter-demo
cd code-interpreter-demo
uv add bedrock-agentcore boto3

検証 1: Hello World

まずは、boto3 の bedrock-agentcore クライアントを使って、セッションの開始からコード実行、終了までの一連の流れを試します。

コードはこちらのハンズオンを参考にしています。

https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/code-interpreter-using-directly.html

test_boto3.py
import boto3

# 実行するコード
code_to_execute = """
print("Hello World!!!")
"""

# クライアントの作成
client = boto3.client(
    "bedrock-agentcore",
    region_name="ap-northeast-1"
)

# セッションの開始
session_response = client.start_code_interpreter_session(
    codeInterpreterIdentifier="aws.codeinterpreter.v1",
    name="my-code-session",
    sessionTimeoutSeconds=900
)
session_id = session_response["sessionId"]

print(f"Started session: {session_id}\n\n")

try:
    # セッションIDを指定してコードの実行
    execute_response = client.invoke_code_interpreter(
        codeInterpreterIdentifier="aws.codeinterpreter.v1",
        sessionId=session_id,
        name="executeCode",
        arguments={
            "language": "python",
            "code": code_to_execute
        }
    )

    # ストリームレスポンスから結果の取得
    for event in execute_response['stream']:
        if 'result' in event:
            result = event['result']
            if 'content' in result:
                for content_item in result['content']:
                    if content_item['type'] == 'text':
                        print(content_item['text'])

finally:
    # セッションの終了
    client.stop_code_interpreter_session(
        codeInterpreterIdentifier="aws.codeinterpreter.v1",
        sessionId=session_id
    )
    print(f"\n\nStopped session: {session_id}")

実行結果はこちらになります。
スクリーンショット 2026-04-08 165127

やっていることはシンプルで、セッション開始 → コード文字列を送信 → 結果を受け取る → セッション終了という流れです。実行するコードは自分で文字列として指定します。

ここで invoke_code_interpretername パラメータに指定できる操作を整理しておきます。

name 説明
executeCode Python / JavaScript / TypeScript のコードを実行
executeCommand シェルコマンドを実行
writeFiles セッション内にファイルを書き込む(アトミック操作)
readFiles セッション内のファイルを読み取る
listFiles 指定パスのファイル一覧を取得
removeFiles セッション内のファイルを削除
startCommandExecution 長時間コマンドを非同期タスクとして開始
getTask 非同期タスクの状態を取得
stopTask 非同期タスクを停止

https://docs.aws.amazon.com/boto3/latest/reference/services/bedrock-agentcore/client/invoke_code_interpreter.html

コード実行だけでなく、ファイル操作やシェルコマンドにも対応していることが分かります。次の検証では writeFiles を使ってファイルをアップロードしてみます。

検証 2: CSV をアップロードして分析する

続いて、writeFiles で CSV ファイルをアップロードし、executeCode で pandas を使って分析してみます。商品の単価と数量を管理する csv ファイルをアップロードし、それをプログラムから参照できるかを検証します。

test_boto3_analysis.py
import boto3

client = boto3.client(
    "bedrock-agentcore",
    region_name="ap-northeast-1"
)

session_response = client.start_code_interpreter_session(
    codeInterpreterIdentifier="aws.codeinterpreter.v1",
    name="analysis-session",
    sessionTimeoutSeconds=900
)
session_id = session_response["sessionId"]
print(f"Started session: {session_id}\n")

# CSVファイルの内容
csv_content = """商品,単価,数量
りんご,150,10
みかん,100,20
バナナ,200,5
ぶどう,350,8
もも,400,3"""

# 分析用コード
analysis_code = """
import pandas as pd

df = pd.read_csv('sales_data.csv')
df['金額'] = df['単価'] * df['数量']

print(df.to_string(index=False))
print(f'\\n合計金額: {df["金額"].sum():,}円')
print(f'平均単価: {df["単価"].mean():.0f}円')
"""

try:
    # 1. CSVファイルをアップロード
    client.invoke_code_interpreter(
        codeInterpreterIdentifier="aws.codeinterpreter.v1",
        sessionId=session_id,
        name="writeFiles",
        arguments={
            "content": [
                {
                    "path": "sales_data.csv",
                    "text": csv_content
                }
            ]
        }
    )
    print("Uploaded: sales_data.csv")

    # 2. 分析コードを実行
    execute_response = client.invoke_code_interpreter(
        codeInterpreterIdentifier="aws.codeinterpreter.v1",
        sessionId=session_id,
        name="executeCode",
        arguments={
            "language": "python",
            "code": analysis_code
        }
    )

    for event in execute_response['stream']:
        if 'result' in event:
            result = event['result']
            if 'content' in result:
                for content_item in result['content']:
                    if content_item['type'] == 'text':
                        print(content_item['text'])

finally:
    client.stop_code_interpreter_session(
        codeInterpreterIdentifier="aws.codeinterpreter.v1",
        sessionId=session_id
    )
    print(f"\nStopped session: {session_id}")

実行結果はこちらになります。

スクリーンショット 2026-04-08 192845

writeFilessales_data.csv というファイル名でファイルをアップロードして、そのファイルをプログラムから操作できることを確認できました!

検証 3: Excel 生成して取り出す

最後に、Code Interpreter 内で Excel ファイルを生成し、ローカルに保存するところまでやってみます。

プリインストール済みライブラリの中には openpyxl が含まれているため、追加のインストールなしで Excel ファイルを生成できます。

処理の流れは以下のとおりです。

  1. writeFiles で売上 CSV をアップロード
  2. executeCode で openpyxl を使い、集計シート+グラフ付きの Excel ファイルを生成
  3. readFiles で生成した .xlsx を取り出す(バイナリ → ローカル保存)
test_boto3_excel.py
import boto3

client = boto3.client(
    "bedrock-agentcore",
    region_name="ap-northeast-1"
)

session_response = client.start_code_interpreter_session(
    codeInterpreterIdentifier="aws.codeinterpreter.v1",
    name="excel-session",
    sessionTimeoutSeconds=900
)
session_id = session_response["sessionId"]
print(f"Started session: {session_id}\n")

# 売上CSVデータ
csv_content = """商品,単価,数量
りんご,150,10
みかん,100,20
バナナ,200,5
ぶどう,350,8
もも,400,3"""

# Excel生成コード(openpyxl + グラフ付き)
excel_code = """
import pandas as pd
from openpyxl import Workbook
from openpyxl.chart import BarChart, Reference
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side

# CSVを読み込んで集計
df = pd.read_csv('sales_data.csv')
df['金額'] = df['単価'] * df['数量']

# ワークブック作成
wb = Workbook()
ws = wb.active
ws.title = '売上レポート'

# ヘッダースタイル
header_font = Font(bold=True, color='FFFFFF', size=12)
header_fill = PatternFill(start_color='4472C4', end_color='4472C4', fill_type='solid')
header_alignment = Alignment(horizontal='center')
thin_border = Border(
    left=Side(style='thin'),
    right=Side(style='thin'),
    top=Side(style='thin'),
    bottom=Side(style='thin')
)

# ヘッダー行
headers = ['商品', '単価', '数量', '金額']
for col, header in enumerate(headers, 1):
    cell = ws.cell(row=1, column=col, value=header)
    cell.font = header_font
    cell.fill = header_fill
    cell.alignment = header_alignment
    cell.border = thin_border

# データ行
for row_idx, row in df.iterrows():
    for col_idx, value in enumerate([row['商品'], row['単価'], row['数量'], row['金額']], 1):
        cell = ws.cell(row=row_idx + 2, column=col_idx, value=value)
        cell.border = thin_border
        if col_idx >= 2:
            cell.number_format = '#,##0'

# 合計行
total_row = len(df) + 2
ws.cell(row=total_row, column=1, value='合計').font = Font(bold=True)
ws.cell(row=total_row, column=4, value=df['金額'].sum()).font = Font(bold=True)
ws.cell(row=total_row, column=4).number_format = '#,##0'
for col in range(1, 5):
    ws.cell(row=total_row, column=col).border = thin_border

# 列幅調整
ws.column_dimensions['A'].width = 12
ws.column_dimensions['B'].width = 10
ws.column_dimensions['C'].width = 10
ws.column_dimensions['D'].width = 12

# 棒グラフ追加
chart = BarChart()
chart.type = 'col'
chart.title = '商品別売上金額'
chart.y_axis.title = '金額(円)'
chart.x_axis.title = '商品'

data = Reference(ws, min_col=4, min_row=1, max_row=len(df) + 1)
categories = Reference(ws, min_col=1, min_row=2, max_row=len(df) + 1)
chart.add_data(data, titles_from_data=True)
chart.set_categories(categories)
chart.shape = 4
chart.width = 15
chart.height = 10

ws.add_chart(chart, 'F2')

# 保存
output_path = 'sales_report.xlsx'
wb.save(output_path)
print(f'Excel ファイルを生成しました: {output_path}')
print(f'\\nレポート内容:')
print(df.to_string(index=False))
print(f'\\n合計金額: {df["金額"].sum():,}円')
"""

try:
    # 1. CSVファイルをアップロード
    client.invoke_code_interpreter(
        codeInterpreterIdentifier="aws.codeinterpreter.v1",
        sessionId=session_id,
        name="writeFiles",
        arguments={
            "content": [
                {
                    "path": "sales_data.csv",
                    "text": csv_content
                }
            ]
        }
    )
    print("Uploaded: sales_data.csv")

    # 2. Excel生成コードを実行
    execute_response = client.invoke_code_interpreter(
        codeInterpreterIdentifier="aws.codeinterpreter.v1",
        sessionId=session_id,
        name="executeCode",
        arguments={
            "language": "python",
            "code": excel_code
        }
    )

    for event in execute_response['stream']:
        if 'result' in event:
            result = event['result']
            if 'content' in result:
                for content_item in result['content']:
                    if content_item['type'] == 'text':
                        print(content_item['text'])

    # 3. 生成したExcelファイルを取り出す
    read_response = client.invoke_code_interpreter(
        codeInterpreterIdentifier="aws.codeinterpreter.v1",
        sessionId=session_id,
        name="readFiles",
        arguments={
            "paths": ["sales_report.xlsx"]
        }
    )

    for event in read_response['stream']:
        if 'result' in event:
            result = event['result']
            if 'content' in result:
                for content_item in result['content']:
                    if content_item['type'] == 'resource':
                        # バイナリファイルは resource.blob に bytes で直接格納されている
                        file_data = content_item['resource']['blob']
                        with open('sales_report.xlsx', 'wb') as f:
                            f.write(file_data)
                        print(f"\nダウンロード完了: sales_report.xlsx ({len(file_data):,} bytes)")

finally:
    client.stop_code_interpreter_session(
        codeInterpreterIdentifier="aws.codeinterpreter.v1",
        sessionId=session_id
    )
    print(f"\nStopped session: {session_id}")

実行結果はこちらになります。

スクリーンショット 2026-04-08 201806

ダウンロードされた Excel ファイルを確認してみると、このようにいい感じに作成してくれていました。
スクリーンショット 2026-04-08 214939

おわりに

本記事では、boto3 で AgentCore Code Interpreter を直接操作し、以下の 3 つの検証を行いました。

  1. Hello World — セッション管理とコードの実行
  2. CSV アップロードと分析writeFilesでのファイル書き込み と pandasでのファイル操作
  3. Excel 生成と取り出し — openpyxlでのファイル作成 と readFilesでのファイル読み取り

今回は Code Interpreter の動作を理解することを目的に、もっとも低レベルな boto3 で直接操作しました。実際の業務では、AgentCore SDK や Strands Agents などのエージェントフレームワークから Code Interpreter をツールとして呼び出す形が主なユースケースになりそうです。

次回は Strands Agents を使って、今回 boto3 で手動で行った処理をエージェントに自律的にやらせてみます。お楽しみに!

この記事をシェアする

関連記事