[アップデート]Amazon Bedrock AgentCore GatewayのMCP ServerターゲットでIAM認証が利用可能になりました

[アップデート]Amazon Bedrock AgentCore GatewayのMCP ServerターゲットでIAM認証が利用可能になりました

2026.04.12

はじめに

こんにちは、チーズナンが大好きなコンサル部の神野(じんの)です。

以前、AgentCore GatewayのTargetにAgentCore RuntimeにデプロイしたMCP Serverを指定する構成をご紹介しました。

https://dev.classmethod.jp/articles/amazon-bedrock-agentcore-gateway-target-agentcore-runtime-mcp-server/

この記事では、Gateway→Runtime(MCP Server)のOutbound認証にCognito M2M(Client Credentials)を使っていました。
もちろん問題なく動作はするのですがAWSリソース間での通信なのにCognitoいるのか・・・と少し面倒に思っていました。

それが、直近でGateway TargetのOutbound認証でGATEWAY_IAM_ROLEがMCP Serverターゲットにも対応しました!
GatewayのIAMロールでSigV4署名してRuntimeを直接呼び出せるようになり、連携しやすくなりました!嬉しい!

https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/gateway-outbound-auth.html

この構成でClaude Codeから直接AgentCore Runtime上のMCPツールを呼び出せるか、本記事では試してみました!

前提

  • AWSアカウント(us-east-1リージョンで検証)
  • Terraform v1.14.4 + AWS Provider v6.39.0
  • Python 3.13(MCP Serverコード用)
  • Docker v29.1.5(ARM64イメージビルド用)
  • Claude Code v2.1.84
  • uv v0.9.26(mcp-proxy-for-aws v1.1.6の実行に使用)

今回の構成

全体のアーキテクチャは以下のとおりです。

01-architecture

IAMで完結してシンプルですね。(今まではCognitoを挟んでいたので・・・)
クライアントのClaude CodeからはMCP Proxy for AWSを使ってGatewayにMCP Serverとして接続します。

実装

MCP Serverの実装

MCP Serverのコードは前回記事と同じです。FastMCP 3.2.3で足し算・掛け算・挨拶の3つのツールを実装しています。

agent/mcp_server.py
from fastmcp import FastMCP

mcp = FastMCP("sample-tools")

@mcp.tool()
def add_numbers(a: int, b: int) -> int:
    """2つの数字を足し算します"""
    return a + b

@mcp.tool()
def multiply_numbers(a: int, b: int) -> int:
    """2つの数字を掛け算します"""
    return a * b

@mcp.tool()
def greet_user(name: str) -> str:
    """ユーザーに挨拶します"""
    return f"Hello, {name}! Welcome to AgentCore Runtime."

if __name__ == "__main__":
    mcp.run()

@mcp.tool()デコレータを付けた関数がそのままMCPツールとして公開されます。docstringがツールの説明文になるので、エージェント側がどのツールを呼ぶか判断する材料になります。

続いてコンテナイメージ用のDockerfileです。AgentCore RuntimeはARM64アーキテクチャで動作するため、ビルド時に--platform linux/arm64を指定します(これはTerraform側で行います)。

agent/Dockerfile
FROM public.ecr.aws/docker/library/python:3.12-slim

WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY mcp_server.py .

CMD ["python", "mcp_server.py"]

Python 3.12のslimイメージをベースにして、依存パッケージをインストールしてMCP Serverを起動するシンプルな構成です。

依存パッケージはfastmcpのみです。

agent/requirements.txt
fastmcp

TerraformでRuntime + Gatewayをデプロイ

TerraformではRuntime、ECR、IAMロール、Gatewayを作成します。Gateway Targetだけはコンソールで設定します。

Terraformコードの全体はGitHubリポジトリを参照してください。

https://github.com/yuu551/iam-identity-gateway

ここではIAM認証の観点で重要なポイントに絞って解説します。

IAMロールの設計

今回のIAM構成では、3つの権限が登場します。

権限 誰が 何に対して 用途
bedrock-agentcore:InvokeGateway 呼び出し元(Claude Code利用者) Gateway Inbound: GatewayのIAM認証を通過するため
bedrock-agentcore:InvokeAgentRuntime GatewayのIAMロール Runtime Outbound: GatewayがRuntimeを呼び出すため
ecr:BatchGetImage RuntimeのIAMロール ECRリポジトリ RuntimeがコンテナイメージをPullするため

Terraform上では以下のように定義しています。

iam.tf(Gatewayロールの権限部分)
# GatewayがRuntimeを呼び出すためのポリシー
resource "aws_iam_role_policy" "gateway_invoke_runtime" {
  name = "${var.project_name}-gateway-invoke-runtime-policy"
  role = aws_iam_role.gateway.id

  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [{
      Sid      = "InvokeAgentRuntime"
      Effect   = "Allow"
      Action   = "bedrock-agentcore:InvokeAgentRuntime"
      Resource = "${aws_bedrockagentcore_agent_runtime.mcp_server.agent_runtime_arn}*"
    }]
  })
}

Gatewayロールに必要な権限はInvokeAgentRuntimeだけです。Resourceの末尾に*を付けているのは、実際のアクセス先がruntime/xxx/runtime-endpoint/DEFAULTというサブリソースになるためです。

Gatewayの設定

Gatewayの定義はシンプルです。authorizer_typeAWS_IAMを指定します。

gateway.tf
resource "aws_bedrockagentcore_gateway" "main" {
  name            = "${var.project_name}-gateway-${random_string.suffix.result}"
  description     = "AgentCore Gateway with IAM inbound authentication"
  role_arn        = aws_iam_role.gateway.arn
  authorizer_type = "AWS_IAM"
  protocol_type   = "MCP"
}

デプロイ

terraform apply コマンドを実行してデプロイします。

実行コマンド
terraform init
terraform apply 

# 適用していいか聞かれるのでyesを選択

applyが完了すると、以下のOutputが出力されます。

出力例
gateway_id             = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
gateway_url            = "https://xxxxxxxx.gateway.bedrock-agentcore.us-east-1.amazonaws.com"
runtime_arn_url_encoded = "https://bedrock-agentcore.us-east-1.amazonaws.com/runtimes/arn%3Aaws%3A.../invocations"

gateway_urlはこの後のGateway Target設定と.mcp.jsonで使います。runtime_arn_url_encodedはGateway TargetのEndpointに使います。

コンソールでGateway Targetを作成(IAM認証)

Gatewayが作成できたら、TargetとしてRuntimeを追加します。

Gatewayの詳細画面を開くと、Inbound Auth typeが「IAM許可」になっていることが確認できます。ターゲットの「追加」を押下します。

02-gateway-detail

下記を入力して「ターゲットを追加」を押下します。

  • ターゲットタイプ: MCP server
  • MCP endpoint: Terraform出力のruntime_arn_url_encodedを入力
  • アウトバウンド認証設定: IAMロールを選択
  • Service: bedrock-agentcore

03-add-target-form

TargetのステータスがReadyになれば完了です。Outbound Auth configurationsが「IAM roles」になっていることも確認できます。

04-target-ready

なお、IAM(SigV4)によるOutbound認証は、SigV4署名を検証できるAWSサービスの背後にあるMCPサーバーでのみ利用可能です。対応しているのはAgentCore Runtime、AgentCore Gateway、API Gateway、Lambda Function URLsです。ALBやEC2上のMCPサーバーには使えないので注意してください。

https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/gateway-target-MCPservers.html

呼び出し元のIAM権限設定

Gateway Inbound認証がAWS_IAMなので、Claude Code(mcp-proxy-for-aws)が使うIAMエンティティにInvokeGateway権限を付与します。この権限がないとGatewayへのアクセスが拒否されます。

IAMポリシー
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowGatewayInvocation",
      "Effect": "Allow",
      "Action": "bedrock-agentcore:InvokeGateway",
      "Resource": "arn:aws:bedrock-agentcore:us-east-1:<ACCOUNT_ID>:gateway/<GATEWAY_ID>"
    }
  ]
}

ローカルのAWSプロファイルに紐づくIAMユーザーやロールにこのポリシーをアタッチします。<GATEWAY_ID>はTerraform出力のgateway_idで確認できます。Resourceをワイルドカードにすることも可能ですが、セキュリティの観点から特定のGateway ARNに絞ることが推奨されています。

https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/gateway-inbound-auth.html

Claude Codeからの接続設定

MCP Proxy for AWSとは

MCP Proxy for AWSはAWS公式のOSSツールです。Claude CodeなどのMCPクライアントはSigV4署名をネイティブにサポートしていません。このプロキシがローカルのAWS認証情報(~/.aws/credentialsや環境変数)を使って、MCPリクエストにSigV4署名を自動付与してGatewayに転送してくれます。

https://github.com/aws/mcp-proxy-for-aws

Claude Codeの.mcp.jsonにそのまま設定できます。

.mcp.jsonの設定

プロジェクトルートに.mcp.jsonを作成します。

.mcp.json
{
  "mcpServers": {
    "agentcore-gateway": {
      "command": "uvx",
      "args": [
        "mcp-proxy-for-aws@latest",
        "https://<GATEWAY_ID>.gateway.bedrock-agentcore.us-east-1.amazonaws.com/mcp",
        "--service", "bedrock-agentcore",
        "--region", "us-east-1"
      ]
    }
  }
}

<GATEWAY_ID>はTerraform出力のgateway_idの値に置き換えてください。--service bedrock-agentcoreはSigV4署名のサービス名、--regionは署名対象のリージョンです。

Claude Codeから直接追加する場合は以下のコマンドでもOKです。

CLIで追加する場合
claude mcp add --transport stdio agentcore-gateway -- \
  uvx mcp-proxy-for-aws@latest \
  "https://<GATEWAY_ID>.gateway.bedrock-agentcore.us-east-1.amazonaws.com/mcp" \
  --service bedrock-agentcore \
  --region us-east-1

動作確認

Claude Codeを起動すると、mcp-proxy-for-awsがstdioプロセスとして立ち上がり、GatewayへのSigV4署名付き接続が確立されます。MCP Serverのツールが自動的に読み込まれます。

まずは接続できているか確認するために/mcp を実行します。
MCP Serverへの接続が確立されると、connectedと表示されます。

05-claude-code-connected

ツール一覧を確認すると、Runtime上の3つのツールが認識されていることがわかります。

06-tools-list

実際にツールを呼び出してみます。「足し算ツールを使って、足し算をして、3123 + 31341234」と入力すると、Claude Codeがadd_numbersツールを呼び出します。

07-tool-call

結果が返ってきました!

08-tool-result

Claude Codeから直接、AgentCore Gateway経由でRuntime上のMCPツールを呼び出せました。お手軽でしたね・・・!

おわりに

AgentCore GatewayのOutbound IAM認証対応とMCP Proxy for AWSを組み合わせたIAM認証構成を試してみました!

社内ツールやAWSアカウント内部での利用など、IAM認証で統一できるユースケースにはいいなと思いましたし、Gateway経由でRuntimeにデプロイしたMCP Server呼び出すの面倒だな・・・と思っていたのでいいアップデートかと思います!
Cognitoを間に入れたくないなと思い、今までRuntimeにMCP ServerをデプロイしてGatewayに紐づけるのを敬遠していますがこれからは積極的に扱っていきたいです。

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

この記事をシェアする

関連記事