今日は Amazon Bedrock AgentCore Identity を試していきます。
AgentCore Identity とは
AI エージェント用いてワークロードを自動化する場合、「人間ではない ID(non-human identity)」の管理を考える必要があります。Agentの能力はますます拡大し、かなり強い、また広範囲なシステムにアクセス可能な権限を保有します。AgentCore Identity は、エージェント ID の管理・資格情報の保護、そして SigV4・標準的な OAuth 2.0 フロー・API キーを通じた AWS / サードパーティサービスとの連携を、一元的に提供することでこの課題に対応します。
2種類の認証:Inbound と Outbound
AgentCore Identity が扱う認証は、大きく2つの方向に分かれます。
Inbound Auth(インバウンド認証) — エージェントやツールを呼び出すユーザー・アプリケーションのアクセスを検証します。「誰がこのエージェントを呼び出してよいのか」を守ります。
Outbound Auth(アウトバウンド認証) — ユーザーに代わって、エージェントから外部サービスへのアクセスを安全に行うための層です。「このエージェントは外部の何にアクセスしてよいのか」を制御します。
この2つはそれぞれ独立した機能になっており、インバウンドであれアウトバウンドであれ、すべてのアクセス試行が明示的に検証されます。推移的な信頼(transitive trust)に依存せず、各リクエストが認可を証明しなければならないゼロトラスト型のモデルが強制されます。
主要な構成要素
- Workload Identity(ワークロード ID) — エージェントには、固有のワークロード ID が割り当てられます。ARN や OAuth のリターン URL などのメタデータを持ち、独立したプリンシパルとして管理・監査・権限付与ができます。Runtime を作成すると、この Workload Identity が自動的に作成されます。
- Inbound Authorizer — AgentCore Runtime / Gateway への OAuth 2.0 リクエストを認証・認可し、JWT を検証します。IdP 非依存で、あらゆる OAuth 2.0 互換の IdP(Cognito, Okta, Entra ID など)と連携できます。
- Credential Provider(アウトバウンド) — Google・GitHub・Slack・Salesforce などの主要サービス向けにビルトインプロバイダーが用意されており、認証サーバーのエンドポイントやプロバイダー固有のパラメータが事前設定済みです。OAuth 2.0 互換であればカスタムプロバイダーも設定することで対向が何であれば動作します。
- OAuth フローのサポート — マシン間(M2M)向けの クレデンシャル付与の仕組みである 2LO フローと、ユーザー委譲アクセス向けの である 3LO フローの両方に対応しています。
監査とコンプライアンス
AgentCore Identity は AWS CloudTrail と統合され、認証試行・資格情報の使用・ポリシー評価を含むすべての ID 関連イベントを記録します。これにより、エージェントの各アクションについて完全な監査証跡を残せます。
さっそくやってみる
この記事ではまず InBound Authorizer、つまりAgentの呼び出しにおける認証を試していきます。
1. 環境整備
mkdir agentcore-runtime-quickstart
cd agentcore-runtime-quickstart
python3 -m venv .venv
source .venv/bin/activatepip install --upgrade pip
pip install bedrock-agentcore strands-agents bedrock-agentcore-starter-toolkitインストールされる3つの役割は以下です:
bedrock-agentcore— AI エージェントを構築するための Amazon Bedrock AgentCore SDKstrands-agents— Strands Agents SDKbedrock-agentcore-starter-toolkit— エージェントを AgentCore Runtime にデプロイするための starter toolkit
2. Agent 本体の準備
agentcore_starter.py というファイルを作り、Strands のエージェントを AgentCore で動くように記載します。
from strands import Agent
from bedrock_agentcore.runtime import BedrockAgentCoreApp
app = BedrockAgentCoreApp()
agent = Agent()
@app.entrypoint
def invoke(payload):
"""エージェントの呼び出しエントリポイント"""
user_message = payload.get("prompt", "Hello! How can I help you today?")
response = agent(user_message)
return response.message["content"][0]["text"]
if __name__ == "__main__":
app.run()ここが AgentCore の肝で、既存の Strands エージェントに足しているのは実質4要素だけです。既存のエージェントロジックに対して、BedrockAgentCoreApp を import し、アプリを生成し、エントリポイントを @app.entrypoint デコレータで囲み、最後に run() するだけで、関数がヘルスモニタリング・ストリーミング対応・AWS 連携を備えた本番用 API サーバーになります。
各行の役割:
app = BedrockAgentCoreApp()— エージェントを AgentCore Runtime の HTTP 契約に合わせてラップするアプリ本体agent = Agent()— Strands のエージェント。引数なしなのでデフォルトモデル(Bedrock の Claude 系)を使います@app.entrypoint— Runtime から呼ばれる入口。payload(リクエスト JSON)を受け取り、promptを取り出してエージェントに渡すapp.run()— ローカルでは開発サーバーとして起動し、Runtime 上では所定のポートで待ち受ける
デプロイ時にコンテナへ入れる依存を明示します。同じフォルダに requirements.txt を作成します。
bedrock-agentcore
strands-agents3. Agent の作成
まずサーバを起動してみます。
python agentcore_starter.pyそのままの状態でもう一つターミナルを開き以下を実行してみます。
curl -X POST http://localhost:8080/invocations \
-H "Content-Type: application/json" \
-d '{"prompt": "空が青いのはなぜ?一言で。"}'以下の様な回答が戻ってくれば成功です。
"**大気中の小さな分子が青い光を散乱しやすいから。**(レイリー散乱)"では Ctr+C などで実行したAgentを止めます。
次にAgentを設定します。
agentcore configure -e agentcore_starter.pyすべてEnterを押し、デフォルトのまま設定を行います。
Agentをデプロイします。
agentcore launchデプロイが完了したら再度呼び出してテストを行います。
agentcore invoke '{"prompt": "空が青いのはなぜ?一言で。"}'何か回答が戻ってくれば成功です。
いま Inbound 認証は何で守られているか
初期設定で OAuth を no にしたので、この呼び出しは IAM SigV4 で認証されています。authorizerConfiguration を設定していない AgentCore runtime は、InvokeAgentRuntime リクエストに対して AWS IAM ベースのアクセス制御のみに依存します。 agentcore invoke は、あなたの aws configure で設定した IAM 認証情報を使って裏で SigV4 署名をして呼んでいます。
4. Inbound Auth の設定
ではここからが今回のメインである呼び出しのOAuth認証の設定を行っていきます。
- Cognito のユーザープールとユーザーを用意し、Bearer トークンを取得する
agentcore configureを JWT ありで再実行し、launchで再デプロイする- 取得した Bearer トークンを付けて呼び出す
まずCognito ユーザープールを作成しOAuthトークンの認証環境を作成します。
setup_cognito.sh というファイルを作成します。
#!/bin/bash
# ユーザープールを作成し Pool ID を取得
export POOL_ID=$(aws cognito-idp create-user-pool \
--pool-name "MyUserPool" \
--policies '{"PasswordPolicy":{"MinimumLength":8}}' \
--region $REGION | jq -r '.UserPool.Id')
# アプリクライアントを作成し Client ID を取得
export CLIENT_ID=$(aws cognito-idp create-user-pool-client \
--user-pool-id $POOL_ID \
--client-name "MyClient" \
--no-generate-secret \
--explicit-auth-flows "ALLOW_USER_PASSWORD_AUTH" "ALLOW_REFRESH_TOKEN_AUTH" \
--region $REGION | jq -r '.UserPoolClient.ClientId')
# ユーザーを作成
aws cognito-idp admin-create-user \
--user-pool-id $POOL_ID \
--username $USERNAME \
--region $REGION \
--message-action SUPPRESS > /dev/null
# 恒久パスワードを設定
aws cognito-idp admin-set-user-password \
--user-pool-id $POOL_ID \
--username $USERNAME \
--password $PASSWORD \
--region $REGION \
--permanent > /dev/null
# 認証して Access Token を取得
export BEARER_TOKEN=$(aws cognito-idp initiate-auth \
--client-id "$CLIENT_ID" \
--auth-flow USER_PASSWORD_AUTH \
--auth-parameters USERNAME=$USERNAME,PASSWORD=$PASSWORD \
--region $REGION | jq -r '.AuthenticationResult.AccessToken')
# 必要な値を出力
echo "Pool id: $POOL_ID"
echo "Discovery URL: https://cognito-idp.$REGION.amazonaws.com/$POOL_ID/.well-known/openid-configuration"
echo "Client ID: $CLIENT_ID"
echo "Bearer Token: $BEARER_TOKEN"以下のコマンドで実行します。
export REGION=us-west-2 # ← あなたのリージョンに合わせる(今回は us-west-2)
export USERNAME=testuser
export PASSWORD=MyPassw0rd! # 8文字以上
source setup_cognito.sh出力される4つの値をメモしておく
スクリプトの最後に出る以下は、次のステップで使います。
- Pool id — ユーザープールの ID
- Discovery URL —
https://cognito-idp.us-west-2.amazonaws.com/{POOL_ID}/.well-known/openid-configuration(← authorizer のdiscoveryUrlに使う) - Client ID —
allowedClientsに使う - Bearer Token — 呼び出し時の
Authorization: Bearer ...に使う
5. エージェントを JWT認証 ありで再設定・再デプロイ
agentcore configure -e agentcore_starter.py対話プロンプトで、今回は OAuth の質問で yes を選び、続けて聞かれる値に上記でコピーしたものを入力します。

ここを yes にします。全部で5つの項目入力が求められます。前半2つは先ほどの値を入力し、後半3つは空欄のままEnterを押します。あとはすべてデフォルトのままEnterを入力します。
次にAgentをデプロイします。
agentcore launchでは最後にトークン付呼び出しを行って見舞うs。
export TOKEN=$(aws cognito-idp initiate-auth \
--client-id "6171jkncigre39imoed5ljd9kd" \
--auth-flow USER_PASSWORD_AUTH \
--auth-parameters USERNAME=testuser,PASSWORD='MyPassw0rd!' \
--region us-west-2 | jq -r '.AuthenticationResult.AccessToken')
curl -i -X POST "${INVOKE_URL}" \
-H "Authorization: Bearer ${TOKEN}" \
-H "Content-Type: application/json" \
-H "X-Amzn-Bedrock-AgentCore-Runtime-Session-Id: testsession-inbound-auth-demo-0005-final" \
-d '{"prompt": "hello what is 1+1?"}'client-id は皆さんの値に書き換えて実行して下さい。
HTTP/2 200
date: Sat, 22 Aug 2026 04:59:05 GMT
content-type: application/json
x-amzn-requestid: aeb2eccf-5c0a-4e5d-a752-e5acbfb0fc58
x-amzn-bedrock-agentcore-runtime-session-id: testsession-inbound-auth-demo-0005-final
"Hello again! 1 + 1 = **2** 😊\n\nIs there anything else I can help you with?"呼び出しが成功しています!

