0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

買い忘れ防止 LINE アプリを作った【3/4】— AgentCore Gateway で MCP 公開編

0
Posted at

第2章で作ったツール Lambda 2つを、AI エージェントが呼び出せるよう AgentCore Gateway に登録します。ここが最もハマりポイントが多いセクションです。気を引き締めていきましょう!
※第2章へのリンク
https://qiita.com/toshi-arch/items/c390b0960d1b97055c61


AgentCore Gateway とは

ツール Lambda を MCP(Model Context Protocol) 形式でエージェントに公開するゲートウェイです。

エージェント → AgentCore Gateway(MCP エンドポイント) → ツール Lambda

重要: Gateway の作成・設定はマネジメントコンソールでは操作できません。Python SDK か AWS CLI で作業します。


Step 1. Lambda にリソースポリシーを先に追加する

Gateway が Lambda を呼び出せるよう、各 Lambda にリソースベースポリシーを追加します。コンソールの UI には bedrock-agentcore.amazonaws.com という選択肢がないため CLI で実行します:

aws lambda add-permission \
  --function-name smart-shopper-tool-s3-search \
  --statement-id AllowAgentCoreGateway \
  --action lambda:InvokeFunction \
  --principal bedrock-agentcore.amazonaws.com \
  --region ap-northeast-1

aws lambda add-permission \
  --function-name smart-shopper-tool-consumption-calc \
  --statement-id AllowAgentCoreGateway \
  --action lambda:InvokeFunction \
  --principal bedrock-agentcore.amazonaws.com \
  --region ap-northeast-1

⚠️ ハマりポイント①: 次の setup_gateway.py より前にこの手順を実行してください。 Gateway 作成後にポリシーを追加しようとすると、ターゲット登録時に権限エラーが出ます。


Step 2. ツールスキーマを定義する

エージェントへのツールの「説明書」を tool_schema.json として作成します。description の質がエージェントの判断精度に直結するので丁寧に書きます。

[
  {
    "name": "search_purchase_history",
    "description": "指定した店舗の過去の購買履歴をS3から取得する。店舗名を入力すると、その店でこれまでに買ったものの一覧を返す。",
    "inputSchema": {
      "type": "object",
      "properties": {
        "store_name": {
          "type": "string",
          "description": "検索する店舗名(例: イオン、セブンイレブン)"
        }
      },
      "required": ["store_name"]
    }
  },
  {
    "name": "calculate_consumption",
    "description": "購買レコードを受け取り、商品ごとの消費サイクルから「今日買うべき商品」の提案リストを返す。",
    "inputSchema": {
      "type": "object",
      "properties": {
        "records": {
          "type": "array",
          "description": "search_purchase_history で取得した購買レコード"
        },
        "store_name": {
          "type": "string",
          "description": "対象の店舗名"
        }
      },
      "required": ["records", "store_name"]
    }
  }
]

Step 3. Gateway 作成スクリプトを実行する

.env:

AWS_ACCOUNT_ID=123456789012
AWS_REGION=ap-northeast-1

setup_gateway.py:

import json, os, time, boto3
from dotenv import load_dotenv

load_dotenv()
ACCOUNT_ID = os.environ['AWS_ACCOUNT_ID']
REGION = os.environ.get('AWS_REGION', 'ap-northeast-1')

gateway_client = boto3.client('bedrock-agentcore-control', region_name=REGION)

with open('tool_schema.json') as f:
    schema = json.load(f)

# 1. Gateway を作成
gw = gateway_client.create_gateway(
    name='smart-shopper-gateway',
    roleArn=f'arn:aws:iam::{ACCOUNT_ID}:role/SmartShopperAgentCoreRuntimeRole',
    protocolType='MCP',
    authorizerType='AWS_IAM',  # ← 必須(省略可能だが省略すると後で認証エラー)
)
gateway_id = gw['gatewayId']
print(f'Gateway ID: {gateway_id}')

# READY になるまで待機
while True:
    status = gateway_client.get_gateway(gatewayIdentifier=gateway_id)['status']
    print(f'Status: {status}')
    if status == 'READY':      # ← ACTIVE ではなく READY
        break
    elif status == 'FAILED':
        raise Exception('Gateway creation failed')
    time.sleep(5)

CREDENTIAL_PROVIDER = [{'credentialProviderType': 'GATEWAY_IAM_ROLE'}]

# 2. S3 検索ツールを登録
gateway_client.create_gateway_target(
    gatewayIdentifier=gateway_id,
    name='smart-shopper-s3-search-target',
    targetConfiguration={
        'mcp': {               # ← このネストが必要
            'lambda': {
                'lambdaArn': f'arn:aws:lambda:{REGION}:{ACCOUNT_ID}:function:smart-shopper-tool-s3-search',
                'toolSchema': {'inlinePayload': [schema[0]]},
            }
        }
    },
    credentialProviderConfigurations=CREDENTIAL_PROVIDER,
)

# 3. 消費サイクル計算ツールを登録
gateway_client.create_gateway_target(
    gatewayIdentifier=gateway_id,
    name='smart-shopper-consumption-target',
    targetConfiguration={
        'mcp': {
            'lambda': {
                'lambdaArn': f'arn:aws:lambda:{REGION}:{ACCOUNT_ID}:function:smart-shopper-tool-consumption-calc',
                'toolSchema': {'inlinePayload': [schema[1]]},
            }
        }
    },
    credentialProviderConfigurations=CREDENTIAL_PROVIDER,
)

print(f'\nGATEWAY_URL:')
print(f'  https://{gateway_id}.gateway.bedrock-agentcore.{REGION}.amazonaws.com/mcp')
uv run python setup_gateway.py

表示された GATEWAY_URL を控えておいてください。第4章で使います。


ハマりポイントまとめ(第3章)

① Lambda リソースポリシーは Gateway より先

順番を守らないとターゲット登録で権限エラー。

② authorizerType='AWS_IAM' は必須

引数なしで create_gateway は成功してしまいますが、後から呼び出し時に認証エラーが出ます。

③ Gateway のステータスは READY(ACTIVE ではない)

# NG: 永久に待ち続ける
if status == 'ACTIVE':
    break

# OK
if status == 'READY':
    break

④ targetConfiguration のネストに注意

# NG: これでは動かない
targetConfiguration={'lambda': {'lambdaArn': '...', ...}}

# OK: mcp でラップする
targetConfiguration={'mcp': {'lambda': {'lambdaArn': '...', ...}}}

⑤ ツール名は ターゲット名___ツール名 で渡される

Gateway は Lambda を呼ぶ際にツール名を smart-shopper-s3-search-target___search_purchase_history のようにプレフィックス付きで渡します。第2章の _get_tool_name() でこのプレフィックスを除去しているのはこのためです。


次回予告

第4章では、Gateway に接続するエージェントコードを書き、AgentCore Runtime にデプロイし、iPhone のオートメーションで位置情報トリガーと繋げて、LINE プッシュ通知まで一気に完成させます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?