Closed8

「Amazon Bedrock AgentCore」を試す ⑤Gateway

kun432kun432

Amazon Bedrock AgentCore Gateway

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

Dia によるまとめ。

Amazon Bedrock AgentCore Gatewayってやつは、AIエージェントがいろんなツール(例えばデータベースにアクセスしたり、メッセージ送ったり、ドキュメント分析したりするやつ)を簡単&安全につなげるためのサービスなんだよ。しかも、開発者がAPIとかLambda関数とか、今あるサービスをちょっとコード書くだけでAIエージェント用のツールに変身させられるの。マジで便利だし、時間もめっちゃ節約できる!

重要ポイントまとめると…

  • ツールの開発と連携が超カンタン!
    今ある会社のリソースを、すぐにAIエージェントが使えるツールにできる。SalesforceとかSlack、Jira、Asana、Zendeskみたいな有名ツールともワンクリックでつながるから、開発の手間が激減だし。
  • エージェント開発がスピードアップ!
    いろんなツールを一つの入り口(エンドポイント)でまとめて管理できるから、複雑な連携とか再実装しなくてOK。開発がめっちゃ早くなる!
  • ツールが増えても安心!
    ツールがいっぱいになっても、AIが「今この作業にピッタリなツールどれ?」って自動で探してくれる。だから、開発も運用もラクだし、エージェントのパフォーマンスも上がる!
  • 認証がバッチリ!
    エージェントが誰か確認する「入り口の認証」と、ツールにつなぐときの「出口の認証」両方を一つのサービスで管理できる。OAuthとかトークンの管理も自動でやってくれるから、セキュリティも安心だし。
  • いろんなフレームワークに対応!
    CrewAIとかLangGraph、LlamaIndex、Strands Agentsみたいな有名なAIフレームワークとも連携できるし、どんなAIモデルでも使えるのが強み!
  • サーバーレスでインフラ管理いらず!
    サービス自体が自動でスケールしてくれるから、サーバーの管理とか一切不要。監視やログも最初からついてるから、トラブル対応もラク!

機能も盛りだくさん!

  • セキュリティガード: ちゃんと認証して、許可された人やエージェントだけがツール使えるようにする。
  • トランスレーション: AIエージェントのリクエストをAPIやLambda用に自動で変換してくれる。
  • コンポジション: いろんなAPIやツールを一つの入り口にまとめてくれる。
  • セキュアな認証情報管理: ツールごとに必要な認証情報を自動で渡してくれるから、手間いらず。
  • セマンティックツール選択: AIが「今必要なツールどれ?」って文脈から自動で選んでくれる。
  • インフラマネージャー: サーバーレスで、監視や監査も全部おまかせ!_

まとめ

要するに、「AIエージェントにいろんなツールを安全&簡単につなげたい!」ってときに、めっちゃ頼れるサービスってこと!テンション上がるでしょ?

kun432kun432

Quick Start

https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/gateway-quick-start.html

前提としてAWSアカウントが必要なのは当然なのだけど、以下の権限が必要になるので注意。

  • IAMロール、Lambda、Cognitoのリソースを作成できる
  • Bedrock AgentCore APIにアクセスできる
  • AWSのクレデンシャルがセットされている

自分の場合はローカルのMacでAWS CLIの設定がすでに行われているので問題なし。今回はJupyterLabで行う。

ではローカルに作業ディレクトリ作成

mkdir agentcore-gateway-work && cd $_

使い捨てのJupyterコンテナを起動。AWS CLIのコンフィグなどのディレクトリをマウントしておく。

docker run --rm \
    -p 8888:8888 \
    -u root \
    -e GRANT_SUDO=yes \
    -v "$(pwd):/home/jovyan/work:cached" \
    -v "$HOME/.aws:/home/jovyan/.aws:cached" \
    quay.io/jupyter/minimal-notebook:latest

ブラウザでJupyterにアクセス。以降の作業はJupyter上で。

ディレクトリをworkに移動して新しいノートブックを開く。そして、パッケージをインストール

!pip install boto3 bedrock-agentcore-starter-toolkit bedrock-agentcore strands-agents
!pip freeze | egrep -i "boto3|bedrock|strands"
出力
bedrock-agentcore==0.1.1
bedrock-agentcore-starter-toolkit==0.1.3
boto3==1.40.1
strands-agents==1.2.0

ではここから「ゲートウェイ」を作成するのだが、まず「コアコンセプト」を読んだほうがこのあとの流れを理解するのに早そう。

https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/gateway-core-concepts.html

キーコンセプト

  • Gateway
    • 「ゲートウェイ」は、MCPサーバのように振る舞い、エージェントがツールにアクセスするための単一のアクセスポイントを提供する。
    • 「ゲートウェイ」は、複数の異なるツールやツールセットを登録できる。この一つ一つのツールを「ターゲット」と呼ぶ
  • Gateway Target
    • 「ターゲット」は、ゲートウェイが「ツール」としてエージェントに提供するAPIやLambda関数などを定義したもの。
    • Lambda関数、OpenAAOPI定義、Smithyモデルなどが「ターゲット」になる。
  • AgentCore Gateway Authorizer
    • MCPはOAuthのみをサポートしているため、各ゲートウェイにはOAuth認証が必ず必要。
    • 自前のOAuthサーバーがない場合は、AWS Cognitoを使って作成可能。
  • AgentCore Credential Provider
    • ゲートウェイがAPIやLambda関数を呼び出す際、それらの機能にアクセスするための認証情報が必要になる。
    • SmithyやLambdaターゲットの場合は、ゲートウェイにアタッチされたIAMロールを使用してターゲットにアクセスする
    • OpenAPIターゲットの場合は、ゲートウェイがOpenAPIターゲットにアクセスするためのAPIキーやOAuth認証情報を保存するための、AgentCore Credential Providerをアタッチする必要がある。

ツールタイプ

  • OpenAPI使用
    • 既存のREST APIをOpenAPI仕様で提供すれば、MCP対応ツールに変換可能。
    • ゲートウェイは、MCPとREST形式の変換を自動で処理する。
  • Lambda関数
    • Lambda関数をツールとして接続できるため、使いたいプログラミング言語でカスタムビジネスロジックを実装可能
    • ゲートウェイは、Lambda関数を呼び出し、そのレスポンスをMCP形式に変換する。
  • Smithyモデル
    • Smithyモデルを使ってAPIインターフェースを定義して、MCP対応ツールを生成可能。
    • SmithyはAWSサービスで使えるサービスやSDKを定義するための言語。
    • ゲートウェイは、Smithyモデルを使って、AWSサービスやカスタムAPIと連携するツールを生成可能。

ゲートウェイの作成

ではこれらを踏まえて、まずゲートウェイを作成し、ターゲットをアタッチする。以下はLambdaターゲットの例。

from bedrock_agentcore_starter_toolkit.operations.gateway.client import GatewayClient
import logging

# ゲートウェイクライアントをセットアップ
client = GatewayClient(region_name="us-east-1")
client.logger.setLevel(logging.DEBUG)

# Cognito認証を作成
cognito_response = client.create_oauth_authorizer_with_cognito("TestGateway")

# ゲートウェイを作成
gateway = client.create_mcp_gateway(
    # ゲートウェイの名前を指定。指定がない場合は自動的に生成される。
    name=None,
    # ゲートウェイが使用するIAMロールのARNを指定。指定がない場合は自動で作成される。
    role_arn=None,
    # ゲートウェイにアクセスしてくる呼び出し元を認証するためのOAuth認証を設定(MCPはOAuthのみ)
    authorizer_config=cognito_response["authorizer_config"],
    # セマンティック検索を有効(?)
    enable_semantic_search=True,
)

# Lambdaターゲットを作成
lambda_target = client.create_mcp_gateway_target(
    # アタッチするゲートウェイを指定
    gateway=gateway, 
    # ターゲットの名前を指定。指定がない場合は自動的に生成される。
    name=None,
    # ターゲットの種類を指定。lambda / openApiSchema / smithyModel から指定。
    target_type="lambda",
    # ターゲットのペイロードの詳細を指定。
    # - 既存のLambda関数を作成した場合はここで指定
    # - それ以外の場合は None にしておくと自動で作成される
    target_payload=None,
    # このチュートリアルの後で、API キーと OAuth 資格情報を使用して API に接続する方法について説明がある
    credentials=None,
)

本来はLambda関数やIAMロールなども全て準備する必要があるが、ターゲット作成時にtarget_payload=Noneを指定しておくと、AgentCore Gatewayのテスト用Lambdaなど、諸々をまとめて作成してくれるらしい。

出力
2025-08-03 14:17:42,041 - bedrock_agentcore.gateway - INFO - Starting EZ Auth setup: Creating Cognito resources...
2025-08-03 14:17:43,713 - bedrock_agentcore.gateway - INFO -   ✓ Created User Pool: us-east-1_XXXXXXXXX
2025-08-03 14:17:44,444 - bedrock_agentcore.gateway - INFO -   ✓ Created domain: agentcore-XXXXXXXX
2025-08-03 14:17:44,445 - bedrock_agentcore.gateway - INFO -   ⏳ Waiting for domain to be available...
2025-08-03 14:17:44,710 - bedrock_agentcore.gateway - INFO -   ✓ Domain is active
2025-08-03 14:17:45,240 - bedrock_agentcore.gateway - INFO -   ✓ Created resource server: TestGateway
2025-08-03 14:17:45,648 - bedrock_agentcore.gateway - INFO -   ✓ Created client: XXXXXXXXXXXXXXXXXXXXXXXXXX
2025-08-03 14:17:45,650 - bedrock_agentcore.gateway - INFO -   ⏳ Waiting for DNS propagation of domain: agentcore-XXXXXXXX.auth.us-east-1.amazoncognito.com
2025-08-03 14:18:45,653 - bedrock_agentcore.gateway - INFO - ✓ EZ Auth setup complete!
2025-08-03 14:18:45,661 - bedrock_agentcore.gateway - INFO - Role not provided, creating an execution role to use
2025-08-03 14:18:47,836 - bedrock_agentcore.gateway - INFO - ✓ Successfully created execution role for Gateway
2025-08-03 14:18:47,838 - bedrock_agentcore.gateway - INFO - Creating Gateway
2025-08-03 14:18:47,839 - bedrock_agentcore.gateway - DEBUG - Creating gateway with params: {
  "name": "TestGatewayXXXXXXXX",
  "roleArn": "arn:aws:iam::XXXXXXXXXXXX:role/AgentCoreGatewayExecutionRole",
  "protocolType": "MCP",
  "authorizerType": "CUSTOM_JWT",
  "authorizerConfiguration": {
    "customJWTAuthorizer": {
      "allowedClients": [
        "XXXXXXXXXXXXXXXXXXXXXXXXXX"
      ],
      "discoveryUrl": "https://cognito-idp.us-east-1.amazonaws.com/us-east-1_XXXXXXXXX/.well-known/openid-configuration"
    }
  },
  "protocolConfiguration": {
    "mcp": {
      "searchType": "SEMANTIC"
    }
  }
}
2025-08-03 14:18:49,169 - bedrock_agentcore.gateway - INFO - ✓ Created Gateway: arn:aws:bedrock-agentcore:us-east-1:XXXXXXXXXXXX:gateway/testgatewayXXXXXXXX-XXXXXXXXXX
2025-08-03 14:18:49,170 - bedrock_agentcore.gateway - INFO -   Gateway URL: https://testgatewayXXXXXXXX-XXXXXXXXXX.gateway.bedrock-agentcore.us-east-1.amazonaws.com/mcp
2025-08-03 14:18:49,171 - bedrock_agentcore.gateway - INFO -   Waiting for Gateway to be ready...
2025-08-03 14:18:49,484 - bedrock_agentcore.gateway - INFO - 
✅Gateway is ready
2025-08-03 14:18:50,589 - bedrock_agentcore.gateway - INFO - ✓ Created Lambda execution role: arn:aws:iam::XXXXXXXXXXXX:role/AgentCoreTestLambdaRole
2025-08-03 14:19:01,862 - bedrock_agentcore.gateway - INFO - ✓ Created Lambda function: arn:aws:lambda:us-east-1:XXXXXXXXXXXX:function:AgentCoreLambdaTestFunction
2025-08-03 14:19:01,863 - bedrock_agentcore.gateway - INFO - ✓ Attaching access policy to: arn:aws:lambda:us-east-1:XXXXXXXXXXXX:function:AgentCoreLambdaTestFunction for arn:aws:iam::XXXXXXXXXXXX:role/AgentCoreGatewayExecutionRole
2025-08-03 14:19:02,140 - bedrock_agentcore.gateway - INFO - ✓ Attached permissions for role invocation: arn:aws:lambda:us-east-1:XXXXXXXXXXXX:function:AgentCoreLambdaTestFunction
2025-08-03 14:19:02,146 - bedrock_agentcore.gateway - INFO - Creating Target
2025-08-03 14:19:02,148 - bedrock_agentcore.gateway - INFO - {'gatewayIdentifier': 'testgatewayXXXXXXXX-XXXXXXXXXX', 'name': 'TestGatewayTarget55e11314', 'targetConfiguration': {'mcp': {'lambda': {'lambdaArn': 'arn:aws:lambda:us-east-1:XXXXXXXXXXXX:function:AgentCoreLambdaTestFunction', 'toolSchema': {'inlinePayload': [{'name': 'get_weather', 'description': 'Get weather for a location', 'inputSchema': {'type': 'object', 'properties': {'location': {'type': 'string'}}, 'required': ['location']}}, {'name': 'get_time', 'description': 'Get time for a timezone', 'inputSchema': {'type': 'object', 'properties': {'timezone': {'type': 'string'}}, 'required': ['timezone']}}]}}}}, 'credentialProviderConfigurations': [{'credentialProviderType': 'GATEWAY_IAM_ROLE'}]}
2025-08-03 14:19:02,148 - bedrock_agentcore.gateway - DEBUG - Creating target with params: {
  "gatewayIdentifier": "testgatewayXXXXXXXX-XXXXXXXXXX",
  "name": "TestGatewayTarget55e11314",
  "targetConfiguration": {
    "mcp": {
      "lambda": {
        "lambdaArn": "arn:aws:lambda:us-east-1:XXXXXXXXXXXX:function:AgentCoreLambdaTestFunction",
        "toolSchema": {
          "inlinePayload": [
            {
              "name": "get_weather",
              "description": "Get weather for a location",
              "inputSchema": {
                "type": "object",
                "properties": {
                  "location": {
                    "type": "string"
                  }
                },
                "required": [
                  "location"
                ]
              }
            },
            {
              "name": "get_time",
              "description": "Get time for a timezone",
              "inputSchema": {
                "type": "object",
                "properties": {
                  "timezone": {
                    "type": "string"
                  }
                },
                "required": [
                  "timezone"
                ]
              }
            }
          ]
        }
      }
    }
  },
  "credentialProviderConfigurations": [
    {
      "credentialProviderType": "GATEWAY_IAM_ROLE"
    }
  ]
}
2025-08-03 14:19:02,724 - bedrock_agentcore.gateway - INFO - ✓ Added target successfully (ID: XXXXXXXXXX)
2025-08-03 14:19:02,726 - bedrock_agentcore.gateway - INFO -   Waiting for target to be ready...
2025-08-03 14:19:05,462 - bedrock_agentcore.gateway - INFO - 
✅Target is ready

いろいろ作成されている。実際にマネージメントコンソールでも確認できる。

作成されたゲートウェイ

ゲートウェイには、インバウンド認証としてCognito、ゲートウェイターゲットとしてLambdaが紐づいている。

Lambda。ダミーのスタティックなレスポンスを返すだけのものが作成されている。

Cognitoユーザプール

エージェントからゲートウェイを使用する

Strands Agentsでゲートウェイが提供するツールを使ってやりとりしてみる。

from strands import Agent
import logging
from strands.models import BedrockModel
from strands.tools.mcp.mcp_client import MCPClient
from mcp.client.streamable_http import streamablehttp_client 
import os
  
def create_streamable_http_transport(mcp_url: str, access_token: str):
       return streamablehttp_client(
           mcp_url,
           headers={"Authorization": f"Bearer {access_token}"}
       )
  
def get_full_tools_list(client):
    more_tools = True
    tools = []
    pagination_token = None
    while more_tools:
        tmp_tools = client.list_tools_sync(pagination_token=pagination_token)
        tools.extend(tmp_tools)
        if tmp_tools.pagination_token is None:
            more_tools = False
        else:
            more_tools = True 
            pagination_token = tmp_tools.pagination_token
    return tools
  
def run_agent(mcp_url: str, access_token: str):
    bedrockmodel = BedrockModel(
        inference_profile_id="us.anthropic.claude-sonnet-4-20250514-v1:0",
        region_name="us-east-1",
        temperature=0.7,
        streaming=True,
    )
     
    mcp_client = MCPClient(lambda: create_streamable_http_transport(mcp_url, access_token))
     
    with mcp_client:
        tools = get_full_tools_list(mcp_client)
        print(f"以下のツールを検出しました: {[tool.tool_name for tool in tools]}")
        agent = Agent(model=bedrockmodel,tools=tools)
        while True:
            user_input = input("\nこれはインタラクティブなStrandsエージェントです。何か質問してください。終了する際は「exit」または「quit」と入力してください: ")
            if user_input.lower() in ["exit", "quit", "bye"]:
                print("Goodbye!")
                break
            print("\nThinking...\n")
            agent(user_input)

# アクセストークンを取得
access_token = client.get_access_token_for_cognito(cognito_response["client_info"])

# エージェントを実行
run_agent(gateway["gatewayUrl"], access_token)

実行結果

出力
2025-08-03 15:22:49,990 - bedrock_agentcore.gateway - INFO - Fetching test token from Cognito...
2025-08-03 15:22:49,991 - bedrock_agentcore.gateway - INFO -   Attempting to connect to token endpoint: https://agentcore-XXXXXXXX.auth.us-east-1.amazoncognito.com/oauth2/token
2025-08-03 15:22:51,649 - bedrock_agentcore.gateway - INFO - ✓ Got test token successfully

以下のツールを検出しました: ['x_amz_bedrock_agentcore_search', 'TestGatewayTarget55e11314___get_time', 'TestGatewayTarget55e11314___get_weather']

これはインタラクティブなStrandsエージェントです。何か質問してください。終了する際は「exit」または「quit」と入力してください:  今何時?

Thinking...

現在の時刻をお調べするために、どちらのタイムゾーンの時刻をお知りになりたいでしょうか?例えば:

- 日本時間(Asia/Tokyo)
- 協定世界時(UTC)
- アメリカ東部時間(America/New_York)
- その他の特定の地域

タイムゾーンを教えていただければ、現在の時刻をお調べいたします。

これはインタラクティブなStrandsエージェントです。何か質問してください。終了する際は「exit」または「quit」と入力してください:  UTCです。

Thinking...


Tool #1: TestGatewayTarget55e11314___get_time
現在のUTC時刻は **午後2時30分** です。

これはインタラクティブなStrandsエージェントです。何か質問してください。終了する際は「exit」または「quit」と入力してください:  お天気を教えて。

Thinking...

お天気をお調べするために、どちらの地域の天気をお知りになりたいでしょうか?

例えば:
- 東京
- 大阪
- ニューヨーク
- ロンドン
- その他の都市名

地域名を教えていただければ、現在の天気をお調べいたします。

これはインタラクティブなStrandsエージェントです。何か質問してください。終了する際は「exit」または「quit」と入力してください:  神戸

Thinking...


Tool #2: TestGatewayTarget55e11314___get_weather
神戸の現在の天気は以下の通りです:

**神戸**
- 気温:72°F(約22°C)
- 天候:晴れ

とても良い天気ですね!

これはインタラクティブなStrandsエージェントです。何か質問してください。終了する際は「exit」または「quit」と入力してください:  quit
Goodbye!

テスト用Lambdaの内容と照らし合わせると、ツールが使えているのがわかる。

なお、上記はサンプルなので認証はクライアントクレデンシャルで行っているが、実際のユースケースでは、Cognitoにユーザごとの認証情報を用意しておいて、認証連携のUIなども用意する必要があるのではなかろうか。

kun432kun432

もうちょっと深堀りしないと、まだどこまでできるかがよくわからないのでドキュメントを読んでいく。

kun432kun432

ゲートウェイのセットアップ

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

Dia によるまとめ。

Amazon Bedrock AgentCore Gatewayってやつは、エージェント(AIとかのプログラム)がいろんなツールやリソースとつながるための「まとめ役」みたいな存在なんだよ。で、ちゃんと安全に使うためには、最初に「どんな権限を誰に与えるか」ってのをしっかり決めるのが大事なんだって!

流れはこんな感じ↓

  1. ツールを作る
    まずは、エージェントが使いたいツール(APIとかLambda関数とか)を用意するの。OpenAPIとかJSONスキーマっていうルールでツールの中身を説明しておくと、AgentCoreがそれを読み取ってくれるんだ。
  2. Gatewayエンドポイントを作る
    AWSのコンソールとかSDKを使って、Gateway(入り口)を作るよ。ここが全部のツールへの「まとめ窓口」になる感じ。で、外からのアクセスを制限するために「Inbound Auth」っていう認証を設定できるの。これで変な人が入ってこないようにできる!
  3. ターゲットを追加する
    Gatewayがどのツールにどうやってつなぐかを設定するよ。ユーザーがちゃんと認証されてるか確認しつつ、裏側のリソースに安全につなぐために「Outbound Auth」っていう認証も使うんだ。IAMとかOAuthっていう認証方法が使えるから、セキュリティもバッチリ!
  4. エージェントのコードを更新する
    最後に、エージェントのプログラムをGatewayのエンドポイントにつなぐように書き換えれば、全部のツールをまとめて使えるようになるってわけ!

要するに、「いろんなツールを安全にまとめて使いたい!」って時に、このGatewayを使うと超便利だし、セキュリティもちゃんと守れるって話だよ!テンション上がるでしょ!


ゲートウェイをセットアップするための前提条件

https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/gateway-prerequisites-permissions.html

Amazon Bedrock AgentCore Gatewayを使う前に、どんな「権限(パーミッション)」が必要かをちゃんと理解しておくのが大事なんだよ。AWSのリソースだけじゃなくて、外部サービスともつなげるから、いろんな認証方法に対応してるのがポイント!

権限は3つのカテゴリに分かれてる!

  1. Gateway管理権限
    Gateway自体を作ったり管理したりするための権限。
    例えば「BedrockAgentCoreGatewayFullAccess」みたいなポリシーを作って、必要な操作だけ許可する感じ。
    S3やKMS(暗号化)とか、他のAWSサービスの権限も必要な場合があるから注意!
  2. Gatewayアクセス権限(Inbound Auth)
    誰がGatewayを使えるか、どの操作ができるかを決める権限。
    ここはAWSのIAMじゃなくて、JWTトークンっていう仕組みで認証するのが特徴だよ。
    Gatewayを作るときに設定するんだ。
  3. Gateway実行権限(Outbound Auth)
    Gatewayが他のAWSリソースや外部サービスにアクセスするための権限。
    Gateway用の「実行ロール」を作って、そのロールに必要な権限を持たせるの。
    例えばLambdaを呼び出すなら、LambdaのポリシーにもGatewayからのアクセスを許可しないとダメ!

ベストプラクティス(やっとくと安心なコツ)

  • 最小権限の原則: 必要な権限だけを与える!ワイルドカード(*)はなるべく使わず、リソースを絞るのが大事。
  • 役割分担: 管理用と実行用でロールを分ける。Gatewayごとに別のロールを作るのもアリ!
  • 認証情報の安全管理: APIキーやOAuthの情報はSecrets Managerに保存して、定期的にローテーション(入れ替え)しよう。
  • 監視と監査: CloudTrailで操作ログを取って、アクセス状況や権限の使われ方を定期的にチェック!
  • ポリシーの条件指定: いつ・どこから使えるか条件をつける。管理操作はIP制限とかも考えてみて!

要するに、「誰が何をできるか」「Gatewayがどこまでできるか」を細かくコントロールして、セキュリティをガッチリ守るのが超大事ってこと!ウケるくらい細かいけど、これやっとくと安心感ハンパないから、マジでおすすめだし!

ゲートウェイにとってのInbound Authはゲートウェイのクライアント、つまりエージェントに対するものだよね。で、Outbound Authの方は、ゲートウェイターゲットがAWSリソースならまあIAMロールになるだろうというのもわかる。ただこれが外部APIとかだとどうなるのかがまだよくわからないな。

このあたりはIdentityとも関連しているようだし、現時点で全部見えてないので、とりあえずこのまま進める。


ゲートウェイの作成

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

Amazon Bedrock AgentCore Gatewayを作るって話なんだけど、これはエージェント(AIとかのプログラム)がいろんなツールやリソースにアクセスするための「まとめ窓口」みたいな役割なんだよ。Gatewayを作るのが、ツール連携プラットフォームを作る最初のステップって感じ!

重要ポイントまとめ!

  • Gatewayを作る意味*
    Gatewayを作ることで、エージェントがいろんなツールやリソースに一つの入り口からアクセスできるようになるんだ。
    しかも、認証(誰が使えるかのチェック)やリクエストの変換、ルーティング(どこに送るかの振り分け)も全部このGatewayがやってくれるから、めっちゃ便利!
  • ターゲットの設定
    Gatewayには「ターゲット」っていう設定があって、これでどのツール(Lambda関数とかREST APIサービスとか)にリクエストをどうやって送るかを決めるの。
    ターゲットごとに、どこにあるツールなのか、どんな認証が必要か、リクエストをどう変換するか、みたいな細かいルールを設定できる!
  • まずはGateway本体を作るのが先!
    ターゲットを設定する前に、まずGateway自体を作らないと始まらない。
    そのためには「インバウンド認証(Inbound Auth)」の設定が必要で、誰がGatewayを使えるかを最初に決めておくんだ。

要するに、「いろんなツールをまとめて安全に使いたい!」って時は、まずGatewayを作って、認証をしっかり設定してから、どのツールにつなぐかを決めていく流れだよ!マジでこれ、システム作る時の基盤になるから超大事だし、テンション上がるでしょ!

インバウンド認証の設定

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

Amazon Bedrock AgentCore Gatewayを作る前に、「インバウンド認証(Inbound Auth)」っていう仕組みを設定しないとダメなんだ。これは、誰がGatewayを使えるかをチェックするためのものだよ。

重要ポイントまとめ!

  • インバウンド認証って何?
    Gatewayを通してツールにアクセスしようとする人(アプリとか)が、本当に許可された人かどうかを確認する仕組みだよ。
  • OAuth認証を使う!
    基本的にはOAuthっていう認証方法を使うの。
    クライアント(使いたい人)は、まずOAuthの認証サーバーでログインして「アクセストークン」っていう証明書をもらう。
    そのトークンを使ってGatewayにアクセスする流れ!
  • 設定に必要なもの
    Gatewayを作るときに以下を指定する必要があるよ。
    • OAuthの「ディスカバリーURL」
      • OpenID Connectの設定情報が載ってるURL
      • ^.+/\.well-known/openid-configuration$
    • 許可する「audience(オーディエンス)」や「client(クライアントID)」
  • IDプロバイダーの選択肢
    どの認証サービスを使うかが選べて、EZ Authならコマンド一発で設定できるから、マジで簡単!
    • Amazon Cognito EZ Auth(AgentCore SDK使うと自動で設定できて超ラク!)
    • Amazon Cognito
    • Auth0

まとめ

要するに、「誰がGatewayを使えるか」をしっかり決めて、認証の仕組みを作るのが最初のステップ!SDK使えば自動でやってくれるし、手動でもOAuthの設定をちゃんとやればOKだよ。セキュリティ的にも超大事な部分だから、ここはしっかり押さえておこう!

ここでいうインバウンド認証はエージェントに対するもので、例として書かれているAgentCore SDKの場合は

cognito_result = client.create_oauth_authorizer_with_cognito("my-gateway")

みたいな1行で書かれているけど、あくまでもクライアント認証。

CognitoやAuth0のコマンド例等もある。

ゲートウェイの作成

https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/create-gateway-methods.html

Amazon Bedrock AgentCore Gatewayを作る方法はいくつかあって、SDK、CLI、コンソール、Boto3、APIのどれでもOKなんだ。ここでは主にSDKを使ったやり方が紹介されてるよ!

重要ポイントまとめ!

  • Gatewayの作り方はいろいろ!
    どれでもGatewayを作れるから、自分のやりやすい方法でOK!
    • AgentCore SDK(Pythonのライブラリ)
    • AWS CLI(コマンドライン)
    • AWSマネジメントコンソール(Web画面)
    • Boto3(AWSのPython SDK)
    • API(直接リクエスト)
  • SDKでの作成例
    1. GatewayClientを初期化する(リージョン指定するだけ!)
    2. EZ Authを使うと、CognitoのOAuth認証を自動でセットアップしてくれる。コマンド一発で認証の設定が終わるから、めっちゃラク!
    3. Gatewayを作成する。名前やロール(権限)を指定できるけど、省略すると自動で作ってくれる。認証の設定(authorizer_config)もここで渡すよ。
    4. 作ったGatewayのエンドポイントURLやOAuthのクレデンシャル情報(Client IDやScope)も確認できる!
  • セマンティックサーチ(semantic search)も使える!
    Gatewayを作るときに「semantic search」を有効にすると、ツールの検索や選択がめっちゃ賢くなる!
    普通は100個くらいまでしかツールをリストできないけど、セマンティックサーチなら文脈に合ったツールを自動で絞り込んでくれるから、効率も精度もアップするんだ。
    ただし、これはGateway作成時にしか設定できないから、後から変更はできないよ!
  • 権限も忘れずに!
    セマンティックサーチを使う場合は、「SynchronizeGatewayTargets」っていう権限も必要になるから、ポリシーに追加しておこう!

要するに、「Gatewayの作り方は色々あるし、EZ Auth使えば認証も自動で超ラク!セマンティックサーチも最初に設定すれば、ツール選びがめっちゃ賢くなる!」ってことだよ。自分のやりやすい方法でサクッと作っちゃおう!

最初のサンプルコードでも試したけど、AgentCore SDKでのゲートウェイの作成は以下のような感じ。

# ゲートウェイクライアントをセットアップ
client = GatewayClient(region_name="us-east-1")
client.logger.setLevel(logging.DEBUG)

# EZ AuthでCognito OAuthを自動設定
cognito_response = client.create_oauth_authorizer_with_cognito("TestGateway")

# ゲートウェイを作成
gateway = client.create_mcp_gateway(
    # ゲートウェイの名前を指定。指定がない場合は自動的に生成される。
    name=None,
    # ゲートウェイが使用するIAMロールのARNを指定。指定がない場合は自動で作成される。
    role_arn=None,
    # ゲートウェイにアクセスしてくる呼び出し元を認証するためのOAuth認証を設定(MCPはOAuthのみ)
    authorizer_config=cognito_response["authorizer_config"],
    # セマンティック検索を有効
    enable_semantic_search=True,
)

なるほど、セマンティックサーチってのはツール検索時に使用されるということね。また別途権限が必要というところも注意。

その他、AWS CLI・マネコン・Boto3などのサンプルコードも記載されている。


既存のゲートウェイにターゲットを追加する

https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/gateway-building-adding-targets.html

Amazon Bedrock AgentCore Gatewayを作った後は、「ターゲット」っていうのを追加できるんだ。ターゲットっていうのは、Gatewayを通して使いたいツール(Lambda関数とかAPIとか)のことだよ。

重要ポイントまとめ!

  • ターゲットって何?
    Gatewayに「このLambda関数を使いたい!」とか「このAPIを呼びたい!」みたいに、使いたいツールをターゲットとして追加できるんだ。
    Lambda関数だけじゃなくて、OpenAPIやSmithyモデルで定義されたAPIもターゲットにできる!
  • 複数のターゲットを追加できる!
    1つのGatewayにいくつでもターゲットを追加できるし、後から追加・変更も自由にできる。
    だから、いろんなツールをまとめて1つのGatewayから使えるようになるんだよ。
  • ターゲットごとに認証方法を選べる!
    それぞれのターゲットごとに、どんな認証情報(IAM、APIキー、OAuthなど)を使うか設定できる。
    これで、セキュリティもバッチリ守れるし、いろんなタイプのツールに対応できる!
  • 注意点
    「認可グラントフロー(3-legged OAuth)」はターゲットの認証方法としては使えないから、そこだけ注意してね。

要するに、「Gatewayを作ったら、使いたいツールをターゲットとしてどんどん追加できるし、認証方法もターゲットごとに選べるから、めっちゃ柔軟で便利!」ってことだよ。これでエージェントがいろんなAPIやLambdaを一気に使えるようになるから、テンション上がるでしょ!

「認可グラントフロー(3-legged OAuth)」ってのがよくわからなかったので聞いてみた。

これ、よく「三者間認証」とか「3レッグドOAuth」って呼ばれるやつで、ユーザー・クライアント(アプリ)・認証サーバーの3者が関わるOAuthの認証方式なんだ。

ざっくり流れ

  1. ユーザーがアプリで「外部サービスにログインしたい」って操作する
    例: X連携ボタンを押す
  2. アプリが認証サーバー(例: X)に「このユーザーの認証お願い!」ってリダイレクトする
    ユーザーはTwitterのログイン画面でIDとパスワードを入力
  3. 認証サーバーが「このユーザーOK!」って認証して、アプリにアクセストークンを返す
    これでアプリは「このユーザーはTwitterで認証済み」って証明をもらえる

ポイント
 

  • ユーザー本人が自分のIDとパスワードで認証する
  • アプリはユーザーのパスワードを直接知らなくてOK
  • だから「3者(ユーザー・アプリ・認証サーバー)」が関わるから「3-legged」って呼ばれるんだ

  • 「Googleでログイン」「Xでログイン」みたいなやつは、ほとんどこの3-legged OAuthだよ!

今回のBedrock AgentCore Gatewayのターゲット認証では、この「3-legged OAuth」は使えないってこと。
つまり、「ユーザーが自分でIDとパスワードを入力して認証」みたいな流れはサポートしてないってことだね!

あぁ、これはダメなのかー・・・UIも絡むので難しいよなーと思いつつ、何らかの仕組みでできないものか?と期待してたんだけども・・・残念

もう少し読む

アウトバウンド認証の設定

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

Amazon Bedrock AgentCore Gatewayの「アウトバウンド認証(Outbound Auth)」は、Gatewayがターゲット(APIやLambda関数とか)に安全にアクセスするための仕組みなんだ。
つまり、「Gatewayが外のサービスやAWSリソースにアクセスする時、どうやって認証するか?」って話!

重要ポイントまとめ!

  • アウトバウンド認証って何?
    Gatewayがターゲット(APIやLambda関数など)にアクセスする時に使う認証方法。
    例えば、Lambdaを呼び出す時はIAMロール、外部APIならAPIキーやOAuth(2-legged OAuth/2LO)を使うよ。
  • OAuth 2LO(2-legged OAuth)について
    これは「クライアント(Gateway)が自分の権限で外部サービスにアクセスする」方式。
    ユーザー本人の認証(3-legged OAuth)じゃなくて、Gateway自身が認証してアクセスするイメージ!
  • 設定の流れ
    1. まず、外部サービスでクライアントアプリ(Gateway)を登録して、クライアントIDやシークレットをもらう
    2. その情報を使って、Gatewayのアウトバウンド認証を作成
    3. ターゲット(APIやLambda)に、そのアウトバウンド認証を紐付ける
  • 認証方法の種類
    • IAMロール(AWSリソース用)
    • APIキー(API用)
    • OAuth(2LO)(外部サービス用)
  • IAMロールの設定例
    Lambda関数をターゲットにする場合は、Gatewayの実行ロールに「lambda:InvokeFunction」権限を付ける必要があるよ。
    さらに、Lambda側にも「このGatewayのロールから呼び出しOK」っていう許可をリソースポリシーで設定しないとダメ!

要するに、「Gatewayが外部サービスやAWSリソースにアクセスする時は、ターゲットごとに適切な認証方法(IAMロール、APIキー、OAuth 2LO)を設定して、安全にアクセスできるようにしよう!」ってことだよ。
認証まわりはミスると危ないから、しっかり設定しておくのが超大事だし!

ゲートウェイにターゲットを追加

ここはターゲットごとにドキュメントが用意されているのでユースケースに合わせて参照

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

https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/gateway-schema-openapi.html

https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/gateway-building-smithy-targets.html


とりあえず認証周りで期待していたことが出来なさそう?な雰囲気になってきたので、ちょっと自分的にはトーンダウンしているが、Identityも見た上で判断かなと思っている。

kun432kun432

ゲートウェイの使用

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

Amazon Bedrock AgentCore Gatewayで認証や権限の設定、ターゲット(使いたいツールやLambda関数)の追加が終わったら、いよいよGatewayを使ってエージェント(AIとかのプログラム)からツールにアクセスできるようになるよ!

重要ポイントまとめ!

  • 準備ができたらGatewayを使える!
    認証・権限・ターゲットの設定が全部終わったら、Gatewayを通してエージェントがツールにアクセスできるようになる。
  • Model Context Protocol(MCP)でやりとりする
    Gatewayの利用は「MCP」っていうプロトコルを使ってやりとりする仕組みになってる。
    これでエージェントとツールの間の通信が統一されて、いろんなツールをまとめて扱える!

要するに、「全部の準備ができたら、MCPプロトコルを使ってGateway経由でツールを呼び出せるようになるよ!」ってことだよ。
_ここまで来たら、あとはエージェントからガンガンツールを使い倒すだけ!マジでワクワクするでしょ!

MCPでゲートウェイを使用する

https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/gateway-using-mcp.html

Amazon Bedrock AgentCore Gatewayは「MCP(Model Context Protocol)」っていう標準的なやり方で、エージェント(AIとかのプログラム)がツールを探したり呼び出したりできるようになってるんだ。

重要ポイントまとめ!

  • MCPでできることは2つ!
    1. _tools/list: Gatewayで使えるツールの一覧を取得できる
    2. _tools/call: 指定したツールを、引数付きで呼び出せる
  • 使い方はHTTPリクエスト
    GatewayのMCPエンドポイントに、HTTPリクエストを送るだけ!
    そのとき、ちゃんと認証トークン(アクセストークン)をヘッダーに付ける必要があるよ。
  • 認証トークンの取得方法
    Gatewayのインバウンド認証で設定したIDプロバイダー(CognitoやAuth0など)から、OAuth 2.0のクライアントクレデンシャルフローでアクセストークンを取得する。
    取得方法はIDプロバイダーごとに違うから、公式ドキュメントをチェック!
  • リクエスト例
    アクセストークンを取得したら、以下のような感じで、リクエストのヘッダーに付けて送る!
    Authorization: Bearer YOUR_ACCESS_TOKEN
    

要するに、「MCPを使えば、ツールの一覧取得も呼び出しも超シンプル!認証トークンだけは忘れずに用意してね!」ってことだよ。
これでエージェントからいろんなツールを自由に使えるから、マジでテンション上がるでしょ!

以下に、利用可能なツールの一覧を取得する場合・ツールを実行する場合の、リクエスト・レスポンスのフォーマットが記載されている。

https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/gateway-using-mcp-list.html

https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/gateway-using-mcp-call.html

また、以下に、いろいろなMCPクライアントライブラリ(requests、mcp、Strands、LangGraph)でのサンプルコードが記載されている

https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/gateway-using-mcp-clients.html

ゲートウェイのテスト

PythonでMCPのテストをしたり、CloudWatchでGatewayのメトリクスなどを確認したりする方法が記載されている。

https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/gateway-building-testing.html

MCP Inspectorを使ったテストやデバッグ方法など

https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/gateway-using-inspector.html


MCPについては一応触れてはみたけども、まだちゃんと理解できていないと思うので、これを気にもう少し細かいところも確認してみようと思う。

https://zenn.dev/kun432/scraps/7a359dda653b67

kun432kun432

その他

  • ゲートウェイのパフォーマンスをCloudWatchで確認したり、APIコールをCloudTrailで確認したり
  • より進んだ使い方として、暗号化設定・カスタムドメイン名・パフォーマンス最適化など

も記載されているので、適宜確認。

このスクラップは2ヶ月前にクローズされました