📦

AIエージェントに任意コード実行させても安心!?Amazon Bedrock AgentCoreで実現する完全分離環境試してみた

に公開

AIエージェントが生成したコードやShellコマンドをそのまま実行したくなる場面、ありますよね?
特に本番環境となると、セキュリティや分離など考慮点が多く、実装のハードルは高めでした。
これまでも Azure Container AppsのDynamic Sessions、E2Bのようなサービス、自前でMicroVMを管理するなどでサンドボックス環境を用意する必要がありましたが、いずれもそれなりのコストと運用負荷を覚悟する必要がありました。

本記事では、Amazon Bedrock AgentCoreのRuntimeとCode InterpreterでAIエージェントが作成したコードとShellを実行してみます。
また本記事は、AIエージェント開発の経験があり、Amazon Bedrock AgentCoreに興味を持っているエンジニアを対象としています。

1. Amazon Bedrock AgentCoreとは?

Amazon Bedrock AgentCore (Preview)は2025年7月16日に公開されたサービスでAIエージェントを安全・簡単にデプロイするためのプラットフォーム型のサービスです。
AIエージェントを開発する際に必要となる機能が下記のモジュール単位で提供されています。

  • AgentCore Runtime: エージェントフレームワークの実行環境(MicroVM上で実行される)でセッションIDが払い出されて、IDごとに環境が分離される
  • AgentCore Memory: セッションと長期メモリを管理
  • AgentCore Observability: メタデータのタグ付け、カスタムスコアリング、軌跡の検査、トラブルシューティング/デバッグフィルター
  • AgentCore Identity: AIエージェントがAWS サービス、および GitHub、Salesforce、Slack などのサードパーティーツールやサービスに安全にアクセスできるようにする
  • AgentCore Gateway: 既存のAPIと AWS Lambda関数をエージェント対応ツールに変換し、MCP などのプロトコルやランタイム検出にわたる統合アクセスを提供
  • AgentCore Browser: エージェントのウェブオートメーションワークフローをスケールするためのマネージドウェブブラウザインスタンスを提供
  • AgentCore Code Interpreter: エージェントが生成したコードを実行するための独立した環境を提供

モジュール単位で提供されているため、AgentCoreのモジュールを用いるか開発者が使い慣れた外部サービスを用いるかを選べる点が魅力ですね。

2. RuntimeにAIエージェントをデプロイする

AgentCore RuntimeはDockerイメージをMicroVM上で最長8時間まで同一セッション上で稼働してくれる環境です。

現状RuntimeにAIエージェントをデプロイするためには2種類の方法があります。

  1. bedrock-agentcore-starter-toolkitをインストールしてagentcoreコマンドからデプロイ
  2. AgentCore Runtimeの要件を満たすDockerイメージをECRにpushして、マネージメントコンソールからデプロイ

今回は1のstarter toolkitを用いた方法でサクッとデプロイを行います。

2.1 アプリケーションを作成

今回はAIエージェントが作成したコードやShellコマンドを実行させることが目的なので、AIエージェント搭載の計算処理を行うアプリを作成します。
今回はstarter toolkitのドキュメントを参考に実装します。
Strandsフレームワークは慣れていないので、LangGraphを使います。
作成したコードはこちらから確認ができます。
ReActエージェントにCodeInterpreterを呼び出すことができるinvoke_sandbox toolを持たせています。
LLMのモデルはAmazon Nova Premierを利用しています。

2.2 AgentCore Runtime用のエンドポイントを設定

bedrock-agentcoreパッケージのBedrockAgentCoreAppインスタンスを作成して@app.entrypointデコレーターを起動させたい関数につけることで、AgentCore Runtimeで動作するエージェントを作成できます。
本来であればPORT番号8080を開けて[POST] /invocations, [GET] /pingのエンドポイントを用意する必要があるのですが、bedrock_agentcore.runtimeパッケージがこれらを自動で設定してくれます。

curlでローカルからも検証ができます。
ローカルから実行した結果

2.3 AgentCore CodeInterpreterをtoolから利用する

CodeInterpreterモジュールをインポート・クライアントを作成して、invoke関数を叩くのみでsandbox環境が利用できるようになっています。
https://github.com/t-maeda-monox/agentcore_runtime_codeinterpreter_test/blob/d7ac95c24f31b640410354a639022cc262cb5a22/ai-agent/main.py#L3
https://github.com/t-maeda-monox/agentcore_runtime_codeinterpreter_test/blob/d7ac95c24f31b640410354a639022cc262cb5a22/ai-agent/main.py#L11-L12
https://github.com/t-maeda-monox/agentcore_runtime_codeinterpreter_test/blob/d7ac95c24f31b640410354a639022cc262cb5a22/ai-agent/main.py#L32-L35

結果は下記のような形で返ってきました。

{
    'result': {
        'content': [{'type': 'text', 'text': '60'}], 
        'structuredContent': {
            'stdout': '60', 
            'stderr': '', 
            'exitCode': 0, 
            'executionTime': 0.01470184326171875
        }, 
        'isError': False
    }
}

2.4 アプリケーションをデプロイ

Bedrock AgentCore Starter Toolkitをインストールして、AgentCore Runtimeにデプロイをします。

$ pip install bedrock-agentcore-starter-toolkit

まずは、agentcoreコマンドでデプロイ設定を行います。
CLIツールからExecution Role、ECR、依存関係のファイル、認証方法の追加を行うことで、自動的に.bedrock_agentcore.yamlとDockerfileが作成されます。
agentcore config実行後の結果

自動作成されたIAM Roleに対して、CodeInterpreterへのアクセス権限をマネージメントコンソール上から付与しました。
ドリフトが怖かったので、新規で下記のポリシーをアタッチしました。

{
    "Version": "2012-10-17",
  "Statement": [
      {
          "Sid": "AllowAgentCoreCodeInterpreterSession",
      "Effect": "Allow",
      "Action": [
          "bedrock-agentcore:StartCodeInterpreterSession",
        "bedrock-agentcore:InvokeCodeInterpreter",
        "bedrock-agentcore:GetCodeInterpreterSession",
        "bedrock-agentcore:StopCodeInterpreterSession"
      ],
      "Resource": [
          "arn:aws:bedrock-agentcore:us-east-1:aws:code-interpreter/aws.codeinterpreter.v1"
      ]
    }
  ]
}

設定ファイルが作成できたら、下記コマンドでデプロイを行います。

$ agentcore launch --codebuild

AgentCore RuntimeのDockerイメージの要件がARM64なので、手元からビルドするのは少し面倒ですが、Code Build上でビルドをかけてくれているようで、CPUのアーキテクチャに左右されることがなく便利ですね。

デプロイが終わると下記のようなinvokeコマンドやCloudWatchのtail log取得コマンドなどが表示されていました。
agentcore launch後の結果

3. デプロイしたエージェントを起動する

デプロイ終了時に提示されたサンプルコマンドを参考に、リクエストを投げてみました。
今回はCodeInterpreterを利用させたかったので、計算をする指示を与えています。
リクエストを投げるとSession IDとResponseが返ってきます。
agentcore invoke実行時の結果

agentcoreコマンドから実行した結果のresponseの中身はエスケープ地獄になっているため、現段階だとCloudWatch上でprintデバッグを行い確認するのが楽そうです。
CloudWatchから確認した結果です。
CloudWatchから確認した結果
結果は67で正解していることと、複数回invoke_sandboxツールを呼び出してSyntax Errorを修正している様子がわかります。

4. まとめ

Amazon Bedrock AgentCoreを使ってAIエージェントが生成したコードを安全に実行できることを確認しました。

特に良かった点:

  • MicroVM上での実行環境分離により、本番環境でも安心して使える
  • starter toolkitによるデプロイが簡単で、インフラ管理の手間が最小限
  • CodeInterpreterの統合により、数行のコードでサンドボックス実行が可能
  • ARM64のビルドもCodeBuild上で自動化されていて地味に便利

GAまでに改善されていると嬉しい点

  • agentcore invokeのレスポンス内容を見やすく表示できる
  • Amplify(gen1)のようにCodeInterpreter等のリソースを追加した場合、リソースへのIAM権限を自動追加して欲しい。

また、starter toolkitの手触りはAIエージェント版のAmplify(Gen1)という感じで、インフラの複雑さを意識せずにリソースが立ち上がりかつスケールする構成になっているというのは魅力的に感じました。
現在はまだPreview版ですが、GAに向けて積極的に触って、より実践的なユースケースを探っていきたいと思います。

参考

https://aws.amazon.com/jp/blogs/news/introducing-amazon-bedrock-agentcore-securely-deploy-and-operate-ai-agents-at-any-scale/
https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/what-is-bedrock-agentcore.html
https://github.com/aws/bedrock-agentcore-starter-toolkit

Discussion