
AgentCore Code Interpreter を boto3 で直接操作して Excel レポートを生成してみた
はじめに
こんにちは!AI 事業本部のこーすけです。
今回は AgentCore Code Interpreter を boto3 で直接操作して、ファイルの入出力を伴うデータ分析と Excel ファイルの生成を試してみました。セッション管理から、CSV アップロード+ pandas での分析、さらに Excel の レポートを生成して取り出すところまでを一通り検証します。
Amazon Bedrock AgentCore とは
Amazon Bedrock AgentCore は、AI エージェントを本番環境で安全かつ大規模に運用するためのマネージド基盤です。特定のフレームワークやモデルに依存せず、エージェントの開発からデプロイ、運用監視までをカバーしています。
今回は Built-in Tools に含まれる Code Interpreter を使います。
AgentCore Code Interpreter とは
概要
AgentCore Code Interpreter は、AI エージェントが 安全なサンドボックス環境でコードを実行できるマネージドサービスです。
AgentCore 内のコンテナ化された環境で実行されるため、隔離された環境でコードの実行を行うことができます。エージェントが生成したコードを実行しても、ホスト環境やほかのセッションに影響を与えることがないため、セキュリティを損なうことなく、複雑なワークフローやデータ分析を遂行するエージェントの開発に集中できます。
Python と Node.js の両方に対応したライブラリがプレインストールされているほか、大容量のファイルサポートもあるので、個人的には、データ分析系のタスク実行とそのレポーティングとの相性がよさそうな感じがします。
プリインストール済みライブラリ
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 でこれらのライブラリを使える環境をセットしようとすると手間がかかるのでありがたいです。
セッションの仕組み
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 クライアントを使って、セッションの開始からコード実行、終了までの一連の流れを試します。
コードはこちらのハンズオンを参考にしています。
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}")
実行結果はこちらになります。

やっていることはシンプルで、セッション開始 → コード文字列を送信 → 結果を受け取る → セッション終了という流れです。実行するコードは自分で文字列として指定します。
ここで invoke_code_interpreter の name パラメータに指定できる操作を整理しておきます。
| name | 説明 |
|---|---|
executeCode |
Python / JavaScript / TypeScript のコードを実行 |
executeCommand |
シェルコマンドを実行 |
writeFiles |
セッション内にファイルを書き込む(アトミック操作) |
readFiles |
セッション内のファイルを読み取る |
listFiles |
指定パスのファイル一覧を取得 |
removeFiles |
セッション内のファイルを削除 |
startCommandExecution |
長時間コマンドを非同期タスクとして開始 |
getTask |
非同期タスクの状態を取得 |
stopTask |
非同期タスクを停止 |
コード実行だけでなく、ファイル操作やシェルコマンドにも対応していることが分かります。次の検証では writeFiles を使ってファイルをアップロードしてみます。
検証 2: CSV をアップロードして分析する
続いて、writeFiles で CSV ファイルをアップロードし、executeCode で pandas を使って分析してみます。商品の単価と数量を管理する csv ファイルをアップロードし、それをプログラムから参照できるかを検証します。
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}")
実行結果はこちらになります。

writeFiles で sales_data.csv というファイル名でファイルをアップロードして、そのファイルをプログラムから操作できることを確認できました!
検証 3: Excel 生成して取り出す
最後に、Code Interpreter 内で Excel ファイルを生成し、ローカルに保存するところまでやってみます。
プリインストール済みライブラリの中には openpyxl が含まれているため、追加のインストールなしで Excel ファイルを生成できます。
処理の流れは以下のとおりです。
writeFilesで売上 CSV をアップロードexecuteCodeで openpyxl を使い、集計シート+グラフ付きの Excel ファイルを生成readFilesで生成した.xlsxを取り出す(バイナリ → ローカル保存)
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}")
実行結果はこちらになります。

ダウンロードされた Excel ファイルを確認してみると、このようにいい感じに作成してくれていました。

おわりに
本記事では、boto3 で AgentCore Code Interpreter を直接操作し、以下の 3 つの検証を行いました。
- Hello World — セッション管理とコードの実行
- CSV アップロードと分析 —
writeFilesでのファイル書き込み と pandasでのファイル操作 - Excel 生成と取り出し — openpyxlでのファイル作成 と
readFilesでのファイル読み取り
今回は Code Interpreter の動作を理解することを目的に、もっとも低レベルな boto3 で直接操作しました。実際の業務では、AgentCore SDK や Strands Agents などのエージェントフレームワークから Code Interpreter をツールとして呼び出す形が主なユースケースになりそうです。
次回は Strands Agents を使って、今回 boto3 で手動で行った処理をエージェントに自律的にやらせてみます。お楽しみに!









