はじめに
こんにちは、久保です。
Amazon Bedrock AgentCore で一部のリソースがCloudFormationに対応し、同時にAWS CDKのL1 Constructも利用できるようになりました。
本記事では、AWS CDKを利用してMCPサーバやAgentCore Gateway(別途手動設定必要)経由で外部検索ツールを利用できるAgentCore Runtimeを構築するサンプルを紹介いたします。
- はじめに
- Amazon Bedrock AgentCore とは
- 今回の取り組みの背景
- リポジトリ
- 構築されるリソースまわりの構成図
- できること
- 利用方法
- デプロイ
- クリーンアップ
- フロントエンド
- AgentCore Gateway/Identityを利用した外部APIサービスの利用
- GenUでの確認
- 実装についての補足
- おわりに
Amazon Bedrock AgentCore とは
2025年7月16日にプレビューでの提供が開始されたAIエージェントを構築、運用するためのサービスです。
(2025年10月7日現在もプレビュー提供中です、仕様などが変わる可能性がありますのでご注意ください)
従来から Amazon Bedrock Agents というAIエージェントを構築するためのサービスが提供されていましたが、Amazon Bedrock Agents はノーコードやローコードでAIエージェントを構築できる代わりに、細かいエージェントの挙動の制御や、Bedrock以外のモデルの利用はできませんでした。
Amazon Bedrock AgentCore は、Strands Agents、LangGraph、CrewAIといったOSSのエージェント開発フレームワークを利用して作成したAIエージェントを安全かつ簡単にAWS環境で稼働できるようにし、かつ認証やメモリ(短期、長期記憶)、コードインタプリタ、ブラウザ機能、オブザーバビリティといったエージェントを本番運用するための機能群を提供するサービスです。
今回の取り組みの背景
Amazon Bedrock AgentCoreの構築用にbedrock-agentcore-starter-toolkitというツールが提供されており、非常に簡単にAmazon Bedrock AgentCoreを構築することができます。
ただし、AWS SDKを利用して各種リソースの作成が行われるため、ツールによって作られたリソースの確認ができなかったり、CloudFormationのスタックとして管理できないため、可能ならばCloudFormationで管理されたいのではないかと思います。
※ツールでも uv run agentcore destroy を実施することでも作成したリソースの削除が可能です。
CloudFormationが一部のリソースで利用できるようになったのと同時に、AWS CDKのL1 Constructも利用できるようになったとのことで、今回はAWS CDKを利用してAgentCore Runtimeを構築するサンプルを作成いたしました。
PostgreSQL用MCPサーバやKnowledge Base用MCPサーバといった、MCPサーバを起動するだけではなくIAMポリシーの設定が必要なものを利用する場合に、必要なIAMポリシーが自動で作成されるようにしています。(これらMCPサーバを利用する場合のみ)
リポジトリ
こちらでサンプルコードを公開しています。
構築されるリソースまわりの構成図
すべてのオプションを含めて構築した場合の全体の構成図は以下の通りです。

注意点としまして、上記リポジトリのAWS CDKのコードで構築される範囲は、optionの記載がない箇所、主にAgentCore Runtimeのみとなります。
あくまでAgentCore Runtimeの構築がメインであり、既存のAmazon Bedrock Knowledge BaseやPostgreSQLのRDS/Auroraに対応するMCPを設定し、かつRuntimeに必要なIAMロール、IAMポリシーを自動で作成するものとなっております。
また、Amazon Bedrock AgentCore GatewayおよびIdentityを利用した、外部APIサービスのエージェントからの利用についても設定可能ですが、それぞれのリソースは別途構築しておく必要があります。こちらはTavilyを利用する場合の手順を紹介いたします。
できること
紹介するコードでは以下のことが可能です。
- Strands Agentsで作成されたAIエージェントをAmazon Bedrock AgentCoreでデプロイ
mcp.jsonというJSONにMCPサーバの情報を記載することで、MCPサーバを利用したエージェントをデプロイ可能(GenUの実装を利用)- (option)PostgreSQL用MCP利用に必要なIAMポリシーを作成
- (option)Amazon Bedrock Knowledge Base用MCP利用に必要なIAMポリシーを作成
- (option)Amazon Bedrock AgentCore GatewayおよびIdentityを利用し外部APIサービスを利用するために必要なIAMポリシーを作成+Gateway経由のツールをAgentに追加(M2M認証)
利用方法
前提条件
本サンプルではCodeBuildを利用したコンテナビルドの仕組みは用意していないため、dockerコマンドによるコンテナビルドが実行できる環境が必要です。
- dockerコマンドによるコンテナビルドが実行できること(Docker Desktop, Rancher Desktop, Colimaなど)
- Node.js がインストールされていること
リポジトリのクローン
GitHubのリポジトリをクローンし、mcp.sample.jsonをコピーしてmcp.jsonを作成します。
parameters.ts、mcp.jsonに必要な情報を記載します。
git clone https://github.com/knziiy/sample-agentcore-with-cdk.git cd sample-agentcore-with-cdk cp mcp.sample.json mcp.json
ディレクトリ構成
. ├── bin │ └── cdk-bedrock-agentcore.ts # CDKアプリケーションエントリーポイント ├── lib │ ├── cdk-bedrock-agentcore-stack.ts # メインスタック │ ├── constructs │ │ └── agent-core-role.ts # IAMロール定義 │ └── app # Agentアプリケーション(GenUベース) │ ├── app.py # FastAPIアプリケーション │ ├── Dockerfile # コンテナイメージ定義 │ ├── mcp.sample.json # MCPサーバ設定(サンプル) │ ├── mcp.json # MCPサーバ設定 │ └── pyproject.toml # Python依存関係 ├── parameters.ts # 設定ファイル ├── cdk.json # CDK設定 ├── package.json # Node.js依存関係 └── README.md
parameters.tsの編集
actualParametersに必要な情報を記載します。
optionの機能を利用しない場合はそのままでも問題ありません。
runtimeNameだけ任意のものに変更してください。
コメントアウトされている設定をコメント解除して設定することで、各種optionの機能が有効となります。(後述のMCPサーバの設定も必要です)
export const actualParameters: ProjectParameters = { runtimeName: 'MyAgentRuntime', // AgentRuntimeの名称 applicationDirectory: './lib/app', // AgentRuntimeにホストするアプリソース(Agent本体) // 以下は必要に応じてコメントアウトを解除して利用 // Gateway/Identityを利用したツールを利用する場合に設定(後述) // agentCoreGatewaySettings: { // GATEWAY_URL: "https://your-gateway-name.gateway.bedrock-agentcore.us-east-1.amazonaws.com/mcp", // COGNITO_SCOPE: "your-gateway-name/genesis-gateway:invoke", // IDENTITY_PROVIDER_NAME: "agentcore-identity-for-gateway", // SECRET_ARN: "arn:aws:secretsmanager:us-east-1:YOUR-ACCOUNT-ID:secret:bedrock-agentcore-identity!default/oauth2/agentcore-identity-for-gateway-XXXXXX" // }, // // Knowledge Base MCPの利用有無(具体的な参照設定はmcp.jsonで実施) // useKnowledgeBase: true, // // カスタムツールプロンプト // toolsSystemPrompt: ` // 以下のツール群を適切に利用して回答すること。 // ツールのリストは毎回取得すること。 // 利用可能なツール情報: // - PostgreSQL用のMCPサーバ: 社員に関する情報が格納されたDBにアクセス可能なツール。 // - Bedrockナレッジベース用のMCPサーバ: 会社のナレッジベースにアクセス可能なツール。 // - ナレッジベース名="your-knowledge-base": 会社の情報を保持するナレッジベース // `, // // PostgreSQLのMCPを利用する場合の設定 // // PostgreSQL設定 // postgresqlConfig: { // clusterArn: "arn:aws:rds:us-east-1:YOUR-ACCOUNT-ID:cluster:your-aurora-cluster", // 参照するAuroraClusterのARN // secretArn: "arn:aws:secretsmanager:us-east-1:YOUR-ACCOUNT-ID:secret:your-db-secret-name-XXXXXX", // DataAPIで認証するために必要なSecretsManagerのsecretのARN // } };
lib/app/mcp.jsonの編集
デフォルトでは以下のようになっています。
そのままデプロイすると、現在時刻を取得するtime MCPサーバと、AWS Labsが提供しているドキュメント検索用のMCPサーバを持つエージェントがデプロイされます。
認証が不要なMCPサーバはこちらのように簡単に追加できます。
{ "mcpServers": { "time": { "command": "uvx", "args": ["mcp-server-time"] }, "awslabs.aws-documentation-mcp-server": { "command": "uvx", "args": ["awslabs.aws-documentation-mcp-server@latest"] } } }
PostgreSQL用MCPサーバやKnowledge Base用MCPサーバを利用する場合は、以下のように記載します。
Amazon Bedrock Knowledge Base Retrieval MCP Server を利用する場合
https://awslabs.github.io/mcp/servers/bedrock-kb-retrieval-mcp-server/awslabs.github.io
Knowledge Baseへのアクセスは、mcp.jsonの設定で制御されます。 parameters.tsでuseKnowledgeBase: trueを設定すると、Knowledge Base関連の IAM 権限が付与されます。
実際にアクセス可能なKnowledge Baseは、以下の例のようにmcp.jsonのKB_INCLUSION_TAG_KEYで指定したタグの値が"true"に設定されたKnowledge Baseのみが検索対象になります。
AWS コンソールでKnowledge Baseにタグを設定してください。
- タグキー: KB_ALLOW_FROM_MCP
- タグ値: true
以下をそのまま mcp.json に追加し、検索対象としたいナレッジベースに KB_ALLOW_FROM_MCP=true のタグを付与してください。
{ "mcpServers": { "awslabs.bedrock-kb-retrieval-mcp-server": { "command": "uvx", "args": ["awslabs.bedrock-kb-retrieval-mcp-server@latest"], "env": { "AWS_REGION": "us-east-1", "FASTMCP_LOG_LEVEL": "ERROR", "KB_INCLUSION_TAG_KEY": "KB_ALLOW_FROM_MCP", "BEDROCK_KB_RERANKING_ENABLED": "false" } } } }
parameters.tsには以下のように設定します。
useKnowledgeBase: true,
Amazon Aurora Postgres MCP Server を利用する場合
https://awslabs.github.io/mcp/servers/postgres-mcp-server/awslabs.github.io
Amazon Aurora/Aurora ServerlessでDataAPIを有効化したPostgreSQLデータベースを用意することで、PostgreSQL MCPを介したDB参照が可能となります。
(当該MCPサーバはDataAPIではない、VPC経由での接続も対応可能です。本サンプルでは未実装です)
{ "mcpServers": { "awslabs.postgres-mcp-server": { "command": "uvx", "args": [ "awslabs.postgres-mcp-server@latest", "--resource_arn", "arn:aws:rds:us-east-1:YOUR-ACCOUNT-ID:cluster:your-aurora-cluster", "--secret_arn", "arn:aws:secretsmanager:us-east-1:YOUR-ACCOUNT-ID:secret:your-db-secret-name-XXXXXX", "--region", "us-east-1", "--database", "postgres", "--readonly", "True" ], "env": { "AWS_REGION": "us-east-1" } } } }
parameters.tsには以下のように設定します。
postgresqlConfig: { clusterArn: "arn:aws:rds:us-east-1:YOUR-ACCOUNT-ID:cluster:your-aurora-cluster", secretArn: "arn:aws:secretsmanager:us-east-1:YOUR-ACCOUNT-ID:secret:your-db-secret-name-XXXXXX", }
clusterArn : 参照するAuroraClusterのARNを指定します。
secretArn : DataAPIで認証するために必要なSecretsManagerのsecretのARNを指定します。
デプロイ
# 依存関係のインストール npm install # 環境変数設定(必要に応じて) export AWS_DEFAULT_REGION=us-east-1 export AWS_PROFILE=your-profile-name # CDKブートストラップ(初回のみ) npx cdk bootstrap # デプロイ npx cdk deploy
クリーンアップ
npx cdk destroy
フロントエンド
今回のサンプルでは、GenU(Generative AI Usecases)を利用してAgentCore Runtime上のエージェントを利用することを想定しています。
GenU(Generative AI Usecases) の parameters.ts の agentCoreExternalRuntimes に、デプロイしたAgentCore Runtimeの情報を指定し、デプロイすることでGenUからAgentCore Runtime上のエージェントを利用できるようになります。
GenUとAgentCore Runtimeを疎結合にすることで、GenUのアップデートに影響されずにAgentCore Runtimeを管理できたり、複数のAgentCore RuntimeをGenUから利用しやすくなるかと思います。
agentCoreExternalRuntimes: [ { name: 'MCP AgentCore', arn: 'arn:aws:bedrock-agentcore:us-east-1:YOUR-ACCOUNT-ID:runtime/AgentRuntimeName-abcdefg123', }, ],

AgentCore Gateway/Identityを利用した外部APIサービスの利用
AgentCore Gateway/Identityを利用することで、Tavilyなどの外部APIサービスの認証を直接エージェントに持たせることなく利用できるようになります。

本記事では、AgentCore Gatewayで事前設定済みのテンプレートが提供されている、Tavilyを利用する場合の手順を紹介いたします。
他にも以下のように様々なサービスの連携が提供されています。

設定の流れは以下のようになります。
- TavilyのAPIキーの取得
- Tavily用APIキーを保持するAgentCore Identityの作成
- IdentityはSecretsManagerのSecretを利用してAPIキーを保持
- Tavily用 AgentCore Gatewayの作成
- AgentCore Runtime用のIdentity設定
parameters.tsへの反映- 再デプロイ
1. TavilyのAPIキーの取得
TavilyはWeb検索のAPIを提供しているサービスです。
一定の利用数までは無料でも利用可能です。
サイトでアカウント登録し、APIキーを取得します。

2. Tavily用APIキーを保持するAgentCore Identityの作成
Amazon Bedrock AgentCore の画面で左ペインから「アイデンティティ」を選択し、「APIキーを追加」をクリックします。

名前に"Tavily-API-Key"、APIキーに先ほど取得したTavilyのAPIキーを入力し、「追加」をクリックします。

APIキーの実体はSecretsManagerのSecretとして保存されます。
3. Tavily用 AgentCore Gatewayの作成
Tavily用といいつつ、ゲートウェイは複数のサービスをまとめて設定できるため、Tavily以外のサービスも追加設定すれば利用可能です。
Amazon Bedrock AgentCore の画面で左ペインから「ゲートウェイ」を選択し、「ゲートウェイを作成」をクリックします。

ゲートウェイ名はgateway-tavilyとします。(任意の名前で問題ありません)
Inbound Auth(Gatewayを利用するための認証)は「Cognitoを利用した設定のクリック作成」を選択します
。

「許可」の欄ではゲートウェイに割り当てるIAMロールを指定できます。デフォルトのままとしておきます。
(ちなみにデフォルトでは何のポリシーも設定されません、IAMロールができるだけです)

ターゲットの設定部分です。
「ターゲット名」にはtarget-tavilyと入力します。(任意の名前で問題ありません)
「Target description」はインターネット検索を行うことができるツールとしておきます。
「ターゲットタイプ」で「統合」を選択します。
「統合プロバイダー」で「Tavily」を選択します。
「アウトバウンド認証設定」で「APIキー」を選択します。
「APIキー」にさきほどIdentityで作成したTavily-API-Keyを選択します。

画面右下の「ゲートウェイを作成」をクリックします。

これでゲートウェイが作成されます。
裏ではCognito User Pool、Cognito App Client、SecretsManagerのSecretが作成されます。
以下のように詳細画面で各種情報が確認できます。

Gateway resource URL および Discovery URL の内容をメモしておきます。
- Gateway resource URL:
https://<GatewayID>.gateway.bedrock-agentcore.us-east-1.amazonaws.com/mcp - Discovery URL:
https://cognito-idp.us-east-1.amazonaws.com/<UserPoolID>/.well-known/openid-configuration
また、自動的にAmazon CognitoのUser Pool、App Clientが作成されます。
my-user-pool-xxxxxxx という名前で作成されているはずです。
クリックしてユーザープールの画面を表示します。

左ペインから「アプケーションクライアント」をクリックし、アプリケーションクライアント名をクリックします。(my-client-xxxxxxのような名前になっています)

アプリケーションクライアントの画面で「ログインページ」タブをクリックします。
以下3つの情報をメモしておきます。
- クライアントID
- クライアントシークレット
- カスタムスコープ

4. AgentCore Runtime用のIdentity設定
ここでは、作成したGatewayが「信頼できる相手からのリクエスト」だけを受け付けるようにするための認証情報を設定します。
先ほどGateway作成時に自動生成されたCognitoの設定を使い、AgentCore Runtimeがその「信頼できる相手」であることを証明するためのIdentityを作成します。
AgentCoreの画面から「アイデンティティ」をクリックし、「OAuth クライアントを追加」をクリックします。

「名前」はagentcore-identity-for-gatewayとします。(任意の名前で問題ありません)
「プロバイダー」を「カスタムプロバイダー」とします。
「設定タイプ」は「検出URL」とします。
「クライアントID」、「クライアントシークレット」、「検出URL」にはそれぞれ先ほどメモしたCognitoのApp Clientの情報を入力します。
最後に「OAuth クライアントを追加」をクリックします。

これでAgentCore RuntimeがGatewayの認証を行うためのIdentityの作成が完了です。
最後に、作成したIdentityの詳細画面で「Secrets Manager に移動」をクリックします。

「シークレットの ARN」をメモしておきます。(SECRET_ARN)

5. parameters.tsへの反映
最後に、parameters.tsのagentCoreGatewaySettingsに以下のように設定します。
agentCoreGatewaySettings: { GATEWAY_URL: "https://your-gateway-name.gateway.bedrock-agentcore.us-east-1.amazonaws.com/mcp", COGNITO_SCOPE: "your-gateway-name/genesis-gateway:invoke", IDENTITY_PROVIDER_NAME: "agentcore-identity-for-gateway", SECRET_ARN: "arn:aws:secretsmanager:us-east-1:YOUR-ACCOUNT-ID:secret:bedrock-agentcore-identity!default/oauth2/agentcore-identity-for-gateway-XXXXXX" },
- GATEWAY_URL : ゲートウェイの詳細画面で確認できる
Gateway resource URL - COGNITO_SCOPE : ゲートウェイの詳細画面で確認できる
カスタムスコープ - IDENTITY_PROVIDER_NAME : 作成したIdentityの名前
agentcore-identity-for-gateway - SECRET_ARN : 作成したIdentityの詳細画面で確認できる
シークレットの ARN
6. 再デプロイ
parameters.tsを保存したら、再度CDKでデプロイします。
npx cdk deploy
これでAgentCore RuntimeにTavilyを利用するためのツールが追加されます。
ここまでのすべてのoptionを実施した場合、最初に示した構成になります。

GenUでの確認
フルセットのMCPサーバーを設定した状態でのGenUからの利用イメージです。
利用可能なツールを聞くとすべてのツールを列挙してくれます。
なおこのように内部的な情報を開示するかどうかはエージェントのシステムプロンプト等での制限を検討する必要があります。

Aurora PostgreSQL Serverless v2に格納された社員情報(別途作成していたサンプルDB)を取得する例です。

Tavilyを利用してWeb検索を行う例です。

複数のツールを組み合わせる必要がある質問の場合です。(DB検索→Web検索)

※上記ではカットしていますがWeb検索がなかなかうまくいかず繰り返し検索を行っていました。
実装についての補足
Gateway/Identity関連
IAMポリシーの追加
agentCoreGatewaySettingsが設定されている場合、lib/constructs/agent-core-role.ts にて必要なIAMポリシーがAgentCore RuntimeのIAMロールに追加されます。
...略
if (params.agentCoreGatewaySettings?.GATEWAY_URL) {
this.addAgentCoreIdentityPermissions(region, accountId, params.agentCoreGatewaySettings?.SECRET_ARN);
}
...略
/**
* AgentCore Identity権限の追加
*/
private addAgentCoreIdentityPermissions(region: string, accountId: string, secretArn?: string) {
// AgentCore Identity利用のための権限
this.role.addToPolicy(new iam.PolicyStatement({
sid: 'AgentCoreIdentityAccess',
effect: iam.Effect.ALLOW,
actions: [
'bedrock-agentcore:CreateWorkloadIdentity',
'bedrock-agentcore:UpdateWorkloadIdentity',
'bedrock-agentcore:DeleteWorkloadIdentity',
],
resources: [
cdk.Stack.of(this).formatArn({
service: 'bedrock-agentcore',
resource: 'workload-identity-directory',
resourceName: `*`,
}),
],
}));
// OAuth2 Token取得権限
this.role.addToPolicy(new iam.PolicyStatement({
sid: 'AgentCoreIdentityOauth2',
effect: iam.Effect.ALLOW,
actions: [
'bedrock-agentcore:GetResourceOauth2Token',
],
resources: [
`arn:aws:bedrock-agentcore:${region}:${accountId}:token-vault/default/oauth2credentialprovider/*`,
`arn:aws:bedrock-agentcore:${region}:${accountId}:token-vault/default`,
`arn:aws:bedrock-agentcore:${region}:${accountId}:workload-identity-directory/default/workload-identity/workload-*`,
`arn:aws:bedrock-agentcore:${region}:${accountId}:workload-identity-directory/default`,
],
}));
// IdentityのSecret取得のための権限(設定されている場合のみ)
if (secretArn) {
this.role.addToPolicy(new iam.PolicyStatement({
effect: iam.Effect.ALLOW,
actions: [
'secretsmanager:GetSecretValue',
],
resources: [
secretArn
]
}));
}
}
Strands Agentsのツール設定
lib/app/ 配下のStrands Agentsの実装はGenUのものをベースに一部コードを追加しています。
lib/app/src/tools.py に一部コードを追加し、AgentCore Gatewayを利用できるようにしています。
以下は該当箇所の抜粋です。
GATEWAY_URLなどの環境変数はAWS CDKによってparameters.tsの設定がRuntimeにセットされます。
bedrock_agentcore の @requires_access_token デコレータを利用してAgentCore Identityで認証を行い、アクセストークンを取得することが可能です。
...略... from bedrock_agentcore.identity.auth import requires_access_token ...略... # 当該関数をまるごと追加 def get_gateway_tools(self) -> list[Any]: gateway_url = os.environ.get("GATEWAY_URL") if not gateway_url: logger.warning("GATEWAY_URL environment variable not set. Skipping gateway tools.") return [] provider_name = os.environ.get("IDENTITY_PROVIDER_NAME", "agentcore-identity-for-gateway") cognito_scope = os.environ.get("COGNITO_SCOPE") # AgentCore Identityで認証 @requires_access_token( provider_name=provider_name, scopes=[cognito_scope], auth_flow="M2M", force_authentication=False, ) def get_mcp_client_from_gateway(access_token: str): def create_streamable_http_transport(): return streamablehttp_client( gateway_url, headers={"Authorization": f"Bearer {access_token}"} ) # Store the client for later use self.gateway_client = MCPClient(create_streamable_http_transport) self.gateway_client.start() try: tools = self.gateway_client.list_tools_sync() return tools except Exception as e: logger.error(f"Error getting MCP client from gateway: {e}") if self.gateway_client: self.gateway_client = None return [] return get_mcp_client_from_gateway() def get_all_tools(self) -> list[Any]: """Get all available tools (MCP + built-in + code interpreter)""" mcp_tools = self.load_mcp_tools() upload_tool = self.get_upload_tool() code_interpreter_tools = self.get_code_interpreter_tool() gateway_tools = self.get_gateway_tools() # Gatewayからのツールを追加 all_tools = mcp_tools + [upload_tool] + code_interpreter_tools + gateway_tools logger.info(f"Total tools loaded: {len(all_tools)} (MCP: {len(mcp_tools)}, Built-in: 1, Code Interpreter: {len(code_interpreter_tools)}, Gateway: {len(gateway_tools)})") return all_tools
おわりに
本記事では、Amazon Bedrock AgentCore RuntimeをAWS CDKで構築するサンプルを紹介しました。 また、PostgreSQL用MCPサーバやKnowledge Base用MCPサーバを利用する場合に必要なIAMポリシーや、AgentCore Gateway/Identityを利用して外部APIサービスを利用するために必要なIAMポリシーも自動で作成されるようにしてみました。
今後AWS CDKのL2 Constructの提供も期待されます。
RuntimeだけではなくGatewayやGatewayのTargetもすでに提供されていますので、これらも試してみたいと思います。
- AWS::BedrockAgentCore::Gateway
- AWS::BedrockAgentCore::GatewayTarget
繰り返しになりますが、GenUとAgentCore Runtimeを疎結合にすることで、GenUのアップデートに影響されずにAgentCore Runtimeを管理できたり、複数のAgentCore RuntimeをGenUから利用しやすくなるかと思います。
ぜひ一度お試しください。
久保 賢二(執筆記事の一覧)
猫とAWSが好きです。