Strands AgentsのCode InterpreterビルトインツールでS3と連携してみた

Strands AgentsのCode InterpreterビルトインツールでS3と連携してみた

2026.01.11

はじめに

こんにちは、スーパーマーケットが大好きなコンサルティング部の神野です。

前回の記事でStrands Agentsの ビルトインツールAgentCoreCodeInterpreter を使って、AgentCore Code Interpreterにファイルを明示的に渡す・取り出す方法を紹介しました。

https://dev.classmethod.jp/articles/strands-agents-builtin-tools-code-interpreter-file-upload-download/

前回はローカルファイルをサンドボックスに書き込む方法でしたが、大規模なデータセットを扱う際はS3を使いたいケースもありますよね。

AWS公式ドキュメントを確認すると、カスタムCode Interpreterを作成することでS3と連携できると記載がありました。

You can create a custom Code Interpreter tool with an execution role to upload/download files from Amazon S3.

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

随分前からうろ覚えでできる認識はあったので、今回は試してみたいと思います。
カスタムCode Interpreterを作成して、S3連携をやってみます。

前提

本検証は下記バージョンを使用しました。

項目 バージョン
Python 3.12
strands-agents 1.20.0
strands-agents-tools 0.2.18
AWS CLI 2.28.8

また、AWSリソースを操作できる必要な権限を持っていることを前提とします。

試してみる

S3バケット・Code Interpreterが使用するIAMロールはAWS CLIをベースに、カスタムCode Interpreterはコンソール上で作成する方がわかりやすいかと思い、コンソール上で作成します。

S3バケットの作成

まず、Code InterpreterがアクセスするためのS3バケットを作成します。

S3バケット作成
# アカウントIDを取得
ACCOUNT_ID=$(aws sts get-caller-identity --query "Account" --output text)
REGION="us-west-2"
BUCKET_NAME="code-interpreter-artifacts-${ACCOUNT_ID}"

# S3バケットを作成
aws s3 mb s3://${BUCKET_NAME} --region ${REGION}

# プレフィックスとしてオブジェクトを配置
aws s3api put-object --bucket ${BUCKET_NAME} --key input/
aws s3api put-object --bucket ${BUCKET_NAME} --key output/

input/ にはCode Interpreterに渡すファイルを、output/ にはCode Interpreterが生成したファイルを保存する想定です。

IAMロールの作成

Code InterpreterがS3にアクセスするためのIAMロールを作成します。
まず、信頼ポリシーをファイルに保存します。

trust-policy.jsonの作成
cat << 'EOF' > trust-policy.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "bedrock-agentcore.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
EOF

次に、S3アクセス用の権限ポリシーを作成します。
先ほど設定した BUCKET_NAME 環境変数を使って、アカウントIDが自動で埋め込まれるようにしています。

s3-access-policy.jsonの作成
cat << EOF > s3-access-policy.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "S3Access",
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:PutObject",
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::${BUCKET_NAME}",
        "arn:aws:s3:::${BUCKET_NAME}/*"
      ]
    }
  ]
}
EOF

環境変数 BUCKET_NAME はS3バケット作成時に設定したものをそのまま使用しています。ターミナルのセッションが切れた場合は、再度設定してから実行してくださいね。

IAMロールを作成し、ポリシーをアタッチします。

IAMロール作成
# IAMロールを作成
aws iam create-role \
  --role-name CodeInterpreterS3Role \
  --assume-role-policy-document file://trust-policy.json

# インラインポリシーをアタッチ
aws iam put-role-policy \
  --role-name CodeInterpreterS3Role \
  --policy-name S3AccessPolicy \
  --policy-document file://s3-access-policy.json

# ロールARNを確認
aws iam get-role --role-name CodeInterpreterS3Role --query "Role.Arn" --output text

ロールARNが表示されればOKです。ロール名は後で使用します。

カスタムCode Interpreterの作成

AWSコンソールからカスタムCode Interpreterを作成します。

  1. Amazon Bedrock AgentCore のコンソールを開き、左メニューからBuilt-in toolsCode Interpreterを選択します
  2. Createボタンをクリックします
    CleanShot 2026-01-10 at 21.05.48@2x
  3. 下記の情報を入力し、Createボタンを選択します。
    • Tool name: s3-enabled-interpreter(任意の名前)
    • Security: Public を選択
    • Service Role Name: 先ほど作成した CodeInterpreterS3Role を選択

CleanShot 2026-01-10 at 23.39.34@2x

今までデフォルトのAgentCore Code Interpreterしか触ったことがなかったので、カスタムで作ることもできてネットワークの設定やIAMロールの設定はここから行えるんだと発見です。

Network modeについて

公式ドキュメントを確認すると、Network modeについて下記の記載があります。
セキュリティ要件や連携したいサービスなどに応じてモードを選択する必要がありますね。

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

モード 説明 ユースケース
Public パブリックインターネットへのアクセスが可能 外部APIとの連携、pip installが必要な場合
Sandbox 外部ネットワークへのアクセスは制限 セキュリティ要件が厳しい場合
VPC VPC内のプライベートリソース(DB、内部APIなど)へアクセス可能 プライベートサブネット内のリソースにアクセスしたい場合

作成したらCode Interpreter tool IDを控えておきます。後に使用します。

CleanShot 2026-01-10 at 23.41.33@2x

テスト用データセットの準備

今回はニューヨーク市が公開している NYC Taxi Trip データを使用します。このデータセットはニューヨーク市のタクシー乗車記録です。

https://www.nyc.gov/site/tlc/about/tlc-trip-record-data.page

上記のリンクから Yellow Taxi Trip Records の 2025年1月分(Parquetファイル)をダウンロードしてください。

CleanShot 2026-01-10 at 21.39.25@2x

ダウンロードしたら、下記コマンドでS3にアップロードします。

データセットのアップロード
# バケットにアップロード
aws s3 cp yellow_tripdata_2025-01.parquet s3://${BUCKET_NAME}/input/

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

Strands AgentsのビルトインツールでカスタムCode Interpreterを使う

Strands Agentsのビルトインツールである AgentCoreCodeInterpreter で、identifier パラメータにカスタムCode InterpreterのIDを指定してS3連携を試してみます。

strands_s3_integration.py
from strands import Agent
from strands.models import BedrockModel
from strands_tools.code_interpreter import AgentCoreCodeInterpreter
import os

# カスタムCode Interpreter ID
CODE_INTERPRETER_ID = "XXXXXXXXXXXX"  # 作成したIDに置き換え
ACCOUNT_ID = os.popen("aws sts get-caller-identity --query Account --output text").read().strip()
BUCKET_NAME = f"code-interpreter-artifacts-{ACCOUNT_ID}"

model = BedrockModel(
    model_id="us.anthropic.claude-sonnet-4-5-20250929-v1:0",
    region_name="us-west-2"
)

# カスタムCode InterpreterのIDを指定
code_interpreter = AgentCoreCodeInterpreter(
    region="us-west-2",
    identifier=CODE_INTERPRETER_ID  # ここがポイント!
)

agent = Agent(
    model=model,
    tools=[code_interpreter.code_interpreter],
    system_prompt=f"""あなたはデータアナリストです。
Code InterpreterはS3へのアクセス権限を持っています。
executeCommandでaws s3 cpコマンドを使ってファイルのダウンロード・アップロードが可能です。
バケット名: {BUCKET_NAME}
"""
)

response = agent(f"""
s3://{BUCKET_NAME}/input/yellow_tripdata_2025-01.parquet をダウンロードして、
NYCタクシーデータを分析してください。

以下の分析を行ってください:
1. データの基本統計(レコード数、期間など)
2. 時間帯別の乗車数の傾向
3. 平均運賃と平均乗車距離

分析結果をCSVファイルにまとめて s3://{BUCKET_NAME}/output/ にアップロードしてください。
""")

identifier パラメータにカスタムCode InterpreterのIDを指定することで使用できるんですね!
逆にidentifierに何も指定しないと、aws.codeinterpreter.v1が使われる仕組みになっています。

フォルトのaws.codeinterpreter.v1にはIAMロールが紐づいていないため、S3へのアクセス権限がありません。そのため、S3連携したい場合はカスタムCode Interpreterを作成してIAMロールを紐づける必要があるといった流れが今回やったことですね。

システムプロンプトではS3アクセス可能なことと、executeCommand でaws cliが使用でき、NYC Taxi データの分析を依頼し、結果をS3にアップロードするようお願いしてみます。

実行してみると下記のように出力されました。

NYCタクシーデータの分析を行います。まずS3からデータをダウンロードして、分析を実施します。
Tool #1: code_interpreter
データのダウンロードが完了しました。次に、データを読み込んで分析を行います。
Tool #2: code_interpreter
良いですね!データが正常に読み込まれました。次に、詳細な分析を行います。
Tool #3: code_interpreter

Tool #4: code_interpreter

Tool #5: code_interpreter
素晴らしい!次に、これらの分析結果をCSVファイルにまとめます。
Tool #6: code_interpreter

Tool #7: code_interpreter

Tool #8: code_interpreter

Tool #9: code_interpreter

Tool #10: code_interpreter

Tool #11: code_interpreter
完璧です!次にこれらのファイルをS3にアップロードします。
Tool #12: code_interpreter

Tool #13: code_interpreter

Tool #14: code_interpreter

Tool #15: code_interpreter

Tool #16: code_interpreter

Tool #17: code_interpreter
完璧です!最後に分析結果のサマリーを作成します。
Tool #18: code_interpreter
## 分析完了しました!🎉

NYCタクシーデータ(2025年1月)の分析が完了しました。以下が主な結果です:

### 📊 主要な発見

**1. データ概要**
- 総レコード数:**3,475,226回**の乗車
- 分析期間:32日間(2024/12/31 ~ 2025/02/01)
- 有効データ率:93.63%

**2. 時間帯別の傾向**
- **ピーク時間帯**:18時(夕方6時)に267,951回で最多
- **オフピーク**:早朝4時が最少(20,033回)
- ピークとオフピークの差は約**13.4倍**

**3. 運賃と乗車距離**
- 平均運賃:**$17.95**(中央値:$12.80)
- 平均合計金額:**$26.81**(中央値:$20.35)
- 平均乗車距離:**3.17マイル**(中央値:1.70マイル)
- 平均乗車時間:**15.11分**

**4. 興味深い発見**
- 早朝5時の乗車は運賃が最も高く($25.42)、距離も最長(5.78マイル)
- 木曜日が最も乗車数が多い(571,830回)
- 1人乗車が全体の**69.2%**を占める

### 📁 出力ファイル

以下の5つのCSVファイルをS3にアップロードしました:

1. **01_basic_statistics.csv** - 基本統計サマリ
2. **02_hourly_trips.csv** - 時間帯別乗車数
3. **03_hourly_statistics.csv** - 時間帯別平均統計
4. **04_weekday_statistics.csv** - 曜日別統計
5. **05_passenger_statistics.csv** - 乗客数別統計

すべてのファイルは `s3://code-interpreter-artifacts-xxx/output/` に保存されています。## 分析完了しました!🎉

S3バケットを見るとしっかりとファイルがアップロードされています。

CleanShot 2026-01-10 at 22.54.45@2x

試しに01_basic_statistics.csvをダウンロードして確認すると分析結果が記載されていますね!

01_basic_statistics.csv
項目,
総レコード数,"3,475,226"
期間開始,2024-12-31 20:47:55
期間終了,2025-02-01 00:00:44
期間日数,32
クリーニング後データ数,"3,253,701"
クリーニング後データ率,93.63%
平均運賃(USD),$17.95
中央運賃(USD),$12.80
平均合計金額(USD),$26.81
中央合計金額(USD),$20.35
平均乗車距離(マイル),3.17
中央乗車距離(マイル),1.70
平均乗車時間(分),15.11
ピーク時間帯,18時
ピーク時乗車数,"267,951"
オフピーク時間帯,4時
オフピーク時乗車数,"20,033"

おわりに

Strands AgentsのCode InterpreterビルトインツールでS3連携を試してみました!
大容量のファイルなどを使用する際は活用したいですね。

カスタムでCode Interpreterを作成する必要がある、ビルトインツールではidentifierを指定する必要がありますが、そこまで難しくなく連携できましたね!

本記事が少しでも参考になりましたら幸いです。最後までご覧いただきありがとうございましたー!!

この記事をシェアする

FacebookHatena blogX

関連記事