🌐

AgentCore Runtime を OAuth 認証で呼び出してみた

に公開

はじめに

AgentCore Runtime は IAM 認証と OAuth 認証の両方をサポートしていますが、Web アプリケーションから呼び出すなら OAuth の方が自然ですよね。今回は Cognito User Pool を使った OAuth 認証で AgentCore Runtime をセットアップし、JWT トークンで認証してみました。

認証方式の選択について

AgentCore では以下の2つの認証方式が選べます:

  • IAM 認証: CLI や AWS サービスからの呼び出しには便利だが、Web からの呼び出しには向かない
  • OAuth 認証: Web アプリケーションには最適だが、agentcore コマンドからは実行できない

環境準備

まず注意点として、執筆時点(2025/09/19)では AgentCore は東京リージョンに対応していないため、オレゴンリージョンを環境変数に設定しておきます。(サポートされていればどこでも良いです。)

export AWS_DEFAULT_REGION=us-west-2

Cognito User Pool の作成

OAuth 認証のために Cognito User Pool を作成します。User Pool 自体は東京リージョンでも問題ありません。テスト用のユーザーも作っておきます。

AgentCore Runtime のセットアップ

1. プロジェクトファイルの準備

まず、シンプルな AgentCore Runtime を作成します:

# main.py
from bedrock_agentcore import BedrockAgentCoreApp

app = BedrockAgentCoreApp()

@app.entrypoint
def invoke(payload):
    # エージェントとは...?
    return {"hello": "world"}

if __name__ == "__main__":
    app.run()
# requirements.txt
bedrock-agentcore

2. OAuth 認証の設定

以下のコマンドで設定を開始します:

uvx --from bedrock-agentcore-starter-toolkit@latest agentcore configure -e main.py

設定時に OAuth 認証を選択し、以下の情報を入力します:

🔐 Authorization Configuration
By default, Bedrock AgentCore uses IAM authorization.
Configure OAuth authorizer instead? (yes/no) [no]: yes

📋 OAuth Configuration
Enter OAuth discovery URL: https://cognito-idp.<USER POOL REGION>.amazonaws.com/<USER POOL ID>/.well-known/openid-configuration
Enter allowed OAuth client IDs (comma-separated): <CLIENT ID>
Enter allowed OAuth audience (comma-separated):
✓ OAuth authorizer configuration created

3. デプロイ

設定が完了したら、以下でデプロイします:

uvx --from bedrock-agentcore-starter-toolkit@latest agentcore launch

OAuth 認証でのテスト

デプロイ後、通常の agentcore invoke コマンドを実行すると以下のエラーになります:

uvx --from bedrock-agentcore-starter-toolkit@latest agentcore invoke '{"prompt": "Hello"}'
# Invocation failed: An error occurred (AccessDeniedException) when calling the InvokeAgentRuntime operation: Authorization method mismatch.

これは想定通りです。OAuth 認証が設定されているためです。

JWT トークンでの認証テスト

Cognito から JWT トークンを取得して AgentCore を呼び出すテストスクリプトを作成します。

#!/bin/bash

set -eux

# .bedrock_agentcore.yaml の agent_arn の値を設定
export AGENTCORE_RUNTIME_ARN=<YOUR_AGENT_ARN>
export USER_POOL_ID=<YOUR_USER_POOL_ID>
export CLIENT_ID=<YOUR_CLIENT_ID>
export USERNAME=<YOUR_USERNAME>
export PASSWORD=<YOUR_PASSWORD>

# Cognito からアクセストークンを取得
export TOKEN=$(aws cognito-idp admin-initiate-auth \
    --client-id "$CLIENT_ID" \
    --user-pool-id "$USER_POOL_ID" \
    --auth-flow ADMIN_USER_PASSWORD_AUTH \
    --auth-parameters USERNAME="$USERNAME",PASSWORD="$PASSWORD" \
    --region ap-northeast-1 | jq -r '.AuthenticationResult.AccessToken')

export BEDROCK_AGENT_CORE_ENDPOINT_URL="https://bedrock-agentcore.${AWS_DEFAULT_REGION}.amazonaws.com"
export ESCAPED_AGENT_ARN=$(echo $AGENTCORE_RUNTIME_ARN | jq -Rr @uri)

# JWT トークンで AgentCore を呼び出し
curl -X POST "${BEDROCK_AGENT_CORE_ENDPOINT_URL}/runtimes/${ESCAPED_AGENT_ARN}/invocations?qualifier=DEFAULT" \
     -H "Authorization: Bearer ${TOKEN}" \
     -H "X-Amzn-Trace-Id: your-trace-id" \
     -H "Content-Type: application/json" \
     -H "X-Amzn-Bedrock-AgentCore-Runtime-Session-Id: thisisatestthisisatestthisisatestthisisatest" \
     -d '{"hello": "world"}'

実行すると以下の結果が得られます:

{"hello": "world"}

成功です!Cognito で取得した JWT アクセストークンで AgentCore Runtime を呼び出せました。

他のアプローチとの比較

GenU では、Cognito Identity Pool を使って Cognito 認証を AWS Credentials に変換し、IAM 認証で呼び出しています。

まとめ

AWS Bedrock AgentCore Runtime の OAuth 認証セットアップを試してみました。JWT トークンでの認証により、Web アプリケーションからの呼び出しがとてもシンプルになります。

Web アプリケーションで AgentCore を活用する際は、ぜひ OAuth 認証を検討してみてください!

参考資料

アマゾン ウェブ サービス ジャパン (有志)

Discussion