はじめに - AIエージェントの進化
これまで AI は、ChatGPT のようにユーザーが質問すると答えを返すという「対話型」の使い方が中心でした。
しかし最近では、AIエージェントという新しい形の AI が注目を集めています。
開発者が直面する課題
AI エージェントのプロトタイプを作ることは、オープンソースのフレームワーク(LangGraph、Strands Agents など)のおかげで比較的簡単になりました。
しかし、実際に会社で使える本格的なシステムにするには、以下のような技術的な課題がありました:
- セキュリティ
- セッション管理
- メモリシステム
- 監視機能
- アクセス制御
これらを一から構築するには、開発者は数ヶ月の時間を費やす必要がありました。
Amazon Bedrock AgentCore の登場
AWS が Amazon Bedrock AgentCore のプレビュー版を発表しました。これは、上記の課題をすべて解決する包括的なサービス群です。
2025 年 7 月 16 日現在プレビュー版
AgentCore の 7 つの主要サービス
AgentCore は、AI エージェントの本格運用に必要な機能を 7 つのコンポーネントに分けて提供しています:
サービス | 役割 |
---|---|
Runtime | AI エージェントのサーバレス実行環境 |
Memory | 短期・長期の記憶のマネージド環境 |
Observability | AI エージェントの動作状況を可視化・監視 |
Identity | AI エージェントの認証認可の機能を提供 |
Gateway | 既存 API や Lambda をエージェントを MCP サーバーに変換して提供 |
Browser | 完全なクラウドベースのブラウザ |
Code Interpreter | サンドボックス環境での安全なコード記述と実行 |
利用可能地域と料金
- 提供地域:米国東部、米国西部、アジアパシフィック(シドニー)、欧州(フランクフルト)
- 無料トライアル:2025 年 9 月 16 日まで
- 本格料金:2025 年 9 月 17 日から開始
AgentCore の利点
開発者にとって
- 開発時間の大幅短縮:インフラ構築に数ヶ月かかっていた作業が数行のコードで完了
- 既存フレームワークとの互換性:お気に入りのオープンソースツールをそのまま使用可能
- 段階的な機能追加:必要な機能だけを選んで追加可能
企業にとって
- エンタープライズレベルのセキュリティ:暗号化、アクセス制御、監査機能
- スケーラビリティ:数千のユーザーに対応可能
- 運用監視:本番環境でのパフォーマンス監視とトラブルシューティング
① Runtime 編
まずは、触れたものから随時記事にしたいと思いますので、① Runtime 編ということで動かしながら記載していきたいと思います。
特徴
- 最大 8 時間のワークロードに対応
- ペイロードサイズ 100 MB までに対応
- 人気のあるオープンソースフレームワークを利用して、AI エージェントをデプロイ
- PoC から本番稼働までのデプロイまで数行のコードで実現
- MCP サーバーのデプロイもサポート
全体図
モデルアクセスの有効化
今回 Strands ライブラリを使います。
Strands は デフォルトで最新の Claude Sonnet 4 を使うため Amazon Bedrock コンソロールのモデルアクセスから有効化しておきましょう。
パッケージのインストール
requirements.txt
に次の通り記載しパッケージをインストールします。bedrock-agentcore
は勿論必須ですが今回、strands-agents
も利用しているため合わせてインストールしておきます。
bedrock-agentcore
strands-agents
pip3 install -r requirements.txt
成果物を簡単にデプロイするために bedrock-agentcore-starter-toolkit
もインストールしておきます。(CLI のようにお使いいただけます。)
pip3 install bedrock-agentcore-starter-toolkit
IAM ロールの作成
AgentCore Runtime でエージェントまたはツールを実行するためには適切なポリシーを付与した IAM ロールが必要です。
順番にコマンドを実行していきます。
trust-policy.json の作成
cat > trust-policy.json << 'EOF'
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AssumeRolePolicy",
"Effect": "Allow",
"Principal": {
"Service": "bedrock-agentcore.amazonaws.com"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"aws:SourceAccount": "accountId"
},
"ArnLike": {
"aws:SourceArn": "arn:aws:bedrock-agentcore:region:accountId:*"
}
}
}
]
}
EOF
permissions-policy.json の作成
cat > permissions-policy.json << 'EOF'
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ECRImageAccess",
"Effect": "Allow",
"Action": [
"ecr:BatchGetImage",
"ecr:GetDownloadUrlForLayer"
],
"Resource": [
"arn:aws:ecr:region:accountId:repository/*"
]
},
{
"Effect": "Allow",
"Action": [
"logs:DescribeLogStreams",
"logs:CreateLogGroup"
],
"Resource": [
"arn:aws:logs:region:accountId:log-group:/aws/bedrock-agentcore/runtimes/*"
]
},
{
"Effect": "Allow",
"Action": [
"logs:DescribeLogGroups"
],
"Resource": [
"arn:aws:logs:region:accountId:log-group:*"
]
},
{
"Effect": "Allow",
"Action": [
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": [
"arn:aws:logs:region:accountId:log-group:/aws/bedrock-agentcore/runtimes/*:log-stream:*"
]
},
{
"Sid": "ECRTokenAccess",
"Effect": "Allow",
"Action": [
"ecr:GetAuthorizationToken"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"xray:PutTraceSegments",
"xray:PutTelemetryRecords",
"xray:GetSamplingRules",
"xray:GetSamplingTargets"
],
"Resource": [ "*" ]
},
{
"Effect": "Allow",
"Resource": "*",
"Action": "cloudwatch:PutMetricData",
"Condition": {
"StringEquals": {
"cloudwatch:namespace": "bedrock-agentcore"
}
}
},
{
"Sid": "GetAgentAccessToken",
"Effect": "Allow",
"Action": [
"bedrock-agentcore:GetWorkloadAccessToken",
"bedrock-agentcore:GetWorkloadAccessTokenForJWT",
"bedrock-agentcore:GetWorkloadAccessTokenForUserId"
],
"Resource": [
"arn:aws:bedrock-agentcore:region:accountId:workload-identity-directory/default",
"arn:aws:bedrock-agentcore:region:accountId:workload-identity-directory/default/workload-identity/agentName_*"
]
},
{"Sid": "BedrockModelInvocation",
"Effect": "Allow",
"Action": [
"bedrock:InvokeModel",
"bedrock:InvokeModelWithResponseStream"
],
"Resource": [
"arn:aws:bedrock:*::foundation-model/*",
"arn:aws:bedrock:region:accountId:*"
]
}
]
}
EOF
IAM ロール・IAM ポリシーの作成とアタッチ
# 実際の値に置換
sed -i '' -e 's/region/us-west-2/g' -e 's/accountId/123456789012/g' -e 's/agentName/my_agent/g' trust-policy.json
sed -i '' -e 's/region/us-west-2/g' -e 's/accountId/123456789012/g' -e 's/agentName/my_agent/g' permissions-policy.json
# ロール作成
aws iam create-role \
--role-name BedrockAgentCoreExecutionRole \
--assume-role-policy-document file://trust-policy.json
aws iam put-role-policy \
--role-name BedrockAgentCoreExecutionRole \
--policy-name BedrockAgentCoreExecutionPolicy \
--policy-document file://permissions-policy.json
Agent の準備
既存のエージェントを Amazon Bedrock AgentCore 対応サービスに変換するには、わずか 3つのステップ で行えます。
# 1. runtime をインポートする
from bedrock_agentcore.runtime import BedrockAgentCoreApp
from strands import Agent
# 2. BedrockAgentCoreApp のインスタンスを作成
agent = Agent()
app = BedrockAgentCoreApp()
# 3. `@app.entrypoint` デコレータを追加
@app.entrypoint
def invoke(payload):
"""Process user input and return a response"""
user_message = payload.get("prompt", "Hello")
response = agent(user_message)
return str(response)
if __name__ == "__main__":
app.run()
BedrockAgentCoreApp を使用すると裏ではざっくり言うと、
- HTTP サーバーの作成
- 必要なエンドポイントの実装
- データ形式の管理
- エラーハンドリング
のような処理が自動的に実行されます。
ローカルで実行し、起動することを確認しておきます。
$ python my_bedrock_agentcore_runtime.py
INFO: Started server process [19751]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://127.0.0.1:8080 (Press CTRL+C to quit)
Agent の導入
次の通りファイルを準備します。とはいっても、my_bedrock_agentcore_runtime.py
と requirements.txt
は作成済みですの空の __init__.py
を作成しておきます。
my_bedrock_agentcore/
├── my_bedrock_agentcore_runtime.py
├── requirements.txt
└── __init__.py
agentcore configure
コマンドを実行してエージェントをセットアップします。この時に前の手順で作成した IAM ロールを指定します。
ACCOUNT_ID="123456789012"
agentcore configure --entrypoint my_bedrock_agentcore_runtime.py -er arn:aws:iam::${ACCOUNT_ID}:role/BedrockAgentCoreExecutionRole
実行が完了すると、2 つのファイルファ出来上がります。
.bedrock_agentcore.yaml
default_agent: my_bedrock_agentcore_runtime
agents:
my_bedrock_agentcore_runtime:
name: my_bedrock_agentcore_runtime
entrypoint: my_bedrock_agentcore_runtime.py
platform: linux/arm64
container_runtime: docker
aws:
execution_role: arn:aws:iam::123456789012:role/BedrockAgentCoreExecutionRole
execution_role_auto_create: true
account: '123456789012'
region: us-west-2
ecr_repository: 123456789012.dkr.ecr.us-west-2.amazonaws.com/bedrock-agentcore-my_bedrock_agentcore_runtime
ecr_auto_create: false
network_configuration:
network_mode: PUBLIC
protocol_configuration:
server_protocol: HTTP
observability:
enabled: true
bedrock_agentcore:
agent_id: my_bedrock_agentcore_runtime-rjGDHOAvjw
agent_arn: arn:aws:bedrock-agentcore:us-west-2:123456789012:runtime/my_bedrock_agentcore_runtime-rjGDHOAvjw
agent_session_id: 86771a0b-c901-4ba4-9a17-9350739d1bf2
codebuild:
project_name: null
execution_role: null
source_bucket: null
authorizer_configuration: null
oauth_configuration: null
.dockerignore
# Build artifacts
build/
dist/
*.egg-info/
*.egg
# Python cache
__pycache__/
__pycache__*
*.py[cod]
*$py.class
*.so
.Python
# Virtual environments
.venv/
.env
venv/
env/
ENV/
# Testing
.pytest_cache/
.coverage
.coverage*
htmlcov/
.tox/
*.cover
.hypothesis/
.mypy_cache/
.ruff_cache/
# Development
*.log
*.bak
*.swp
*.swo
*~
.DS_Store
# IDEs
.vscode/
.idea/
# Version control
.git/
.gitignore
.gitattributes
# Documentation
docs/
*.md
!README.md
# CI/CD
.github/
.gitlab-ci.yml
.travis.yml
# Project specific
tests/
# Bedrock AgentCore specific - keep config but exclude runtime files
.bedrock_agentcore.yaml
.dockerignore
# Keep wheelhouse for offline installations
# wheelhouse/
agentcore launch -l
コマンドでローカルで起動することを確認しておきます。
$ agentcore launch -l
Launching Bedrock AgentCore (local mode)...
Launching Bedrock AgentCore agent 'my_bedrock_agentcore_runtime' locally
✓ Docker image built: bedrock_agentcore-my_bedrock_agentcore_runtime:latest
✓ Ready to run locally
Starting server at http://localhost:8080
Press Ctrl+C to stop
INFO: Started server process [1]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit)
では、agentcore launch
コマンドで AWS にエージェントをデプロイしていきます。
agentcore launch
AWS にエージェントのデプロイが完了すると次の通り表示されました。後で AWS コンソールから作成されたリソースを確認してみますので一旦ここではエージェントが作成されたことだけ確認できれば OK です。
agentcore invoke
コマンドでエージェントの呼び出しをテストしておきます。
agentcore invoke '{"prompt": "Hello"}'
次の通りレスポンスが返されました。
Agent の呼び出し
boto3 (bedrock-agentcore.invoke_agent_runtime
)を使用してエージェントを呼び出してみます。
import boto3
import json
client = boto3.client('bedrock-agentcore', region_name="us-west-2")
input_payload = {
"prompt": "how are you?"
}
try:
response = client.invoke_agent_runtime(
agentRuntimeArn="arn:aws:bedrock-agentcore:us-west-2:123456789012:runtime/my_bedrock_agentcore_runtime-rjGDHOAvjw",
qualifier="DEFAULT",
payload=json.dumps(input_payload)
)
print("Response metadata:", response['ResponseMetadata'])
print("Runtime session ID:", response['runtimeSessionId'])
streaming_body = response['response']
response_data = streaming_body.read()
response_text = response_data.decode('utf-8')
print("Response content:", response_text)
except Exception as e:
print(f"Error: {e}")
レスポンスの結果は以下の通りです。
作成されたリソース
作成されたリソースを AWS コンソロールから確認してみます。
Amazon Bedrock AgentCore > Agent Runtime
Amazon ECR > プライベートレジストリ > リポジトリ
bedrock-agentcore-starter-toolkit を使わないパターン
本記事では、bedrock-agentcore-starter-toolkit
を使うパターンで紹介してきましたが、以下のコンテナイメージを用意すれば、bedrock-agentcore-starter-toolkit
を使わずにどんなフレームワークや言語でも、AWS の信頼性の高いインフラ上にデプロイ可能。
- コンテナ要件
- ホスト: 0.0.0.0
- ポート: 8080
- プラットフォーム: ARM64
- パス要件
-
/invocations
エージェントインタラクション用 -
/ping
ヘルスチェック用
-