
既存のAmazon Bedrock AgentCore GatewayにPolicy Engineを後から紐づけたらInternalServerExceptionが発生した際の対応
はじめに
スーパーマーケットが大好きなコンサルティング部の神野です。
Amazon Bedrock AgentCore Gateway Policyが最近プレビューリリースされましたよね。
このブログでは公式ドキュメントに従って、Policyがどういった挙動をするか確認していましたが、今まで自分が作ったGatewayでもPolicyが適切な挙動をするか確認したく、試していたところ下記エラーに遭遇してうまく動かず悩んでいました。
InternalServerException - Policy evaluation failed for list tools
最初はポリシーが適応されて弾かれているだけかなと思ったらどうもエラーの種類が異なります。
単純にポリシーを満たしていないリクエストの場合は下記の形式で返却されます。
AuthorizeActionException - Tool Execution Denied: Tool call not allowed due to policy enforcement [Policy evaluation denied due to no determining policies]
なので根本的にエラーが違うようでCedarポリシーが原因ではなく、もっと違う設定の箇所でエラーになっていることに気づき今回はその原因と対応をまとめています。
結論
GatewayでPolicyを使用する場合はService-Linked Roleにbedrock-agentcore:AuthorizeAction、bedrock-agentcore:PartiallyAuthorizeActions、bedrock-agentcore:GetPolicyEngineの権限が必要です。権限がないと、InternalServerExceptionが発生しPolicyの評価まで到達しません。
また、既存のGatewayにPolicy側の画面で後からPolicy Engineを紐づけた場合、Service-Linked RoleのIAM権限が自動更新されないため、手動で下記のような権限を追加する必要があります。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "EvaluatePoliciesForGateway",
"Effect": "Allow",
"Action": [
"bedrock-agentcore:AuthorizeAction",
"bedrock-agentcore:PartiallyAuthorizeActions"
],
"Resource": [
"arn:aws:bedrock-agentcore:<region>:<account-id>:gateway/<gateway-id>-*",
"arn:aws:bedrock-agentcore:<region>:<account-id>:policy-engine/<policy-engine-name>"
]
},
{
"Sid": "GetPolicyEngineForValidation",
"Effect": "Allow",
"Action": [
"bedrock-agentcore:GetPolicyEngine"
],
"Resource": [
"arn:aws:bedrock-agentcore:<region>:<account-id>:policy-engine/<policy-engine-name>"
]
}
]
}
たったこれだけですが、すごく時間がかかりました・・・
どう調査したのかを備忘録も兼ねてまとめています。
調査・発生した原因
前提
公式ドキュメントに従って作ったGatewayと以前ブログでも紹介したGatewayを比較しながら進めていきます。それぞれのブログで作ったGatewayを前提に話を進めていきます。ブログの状態からは何も設定は変更していないです。
Gateway Policy公式ドキュメントベースに作ったGatewayのブログ
公式ドキュメントをベースにGateway Policyを試した際に作成したGatewayです。
以前に自分が作成したGatewayのブログ
API Gatewayをターゲットにコンソール上から作成したGatewayです。
この状態にPolicy EngineをPolicy側のコンソール画面で作成および、Gatewayに紐づけた状態とします。
調査
まず、起きた事象として公式ドキュメントのサンプルではListToolsは成功し、Gatewayに登録しているツール一覧の取得に成功していましたが、以前自分が作ったGatewayではListToolsの取得に失敗していました。
最初自分が書いたポリシーが原因かなと思い、両者ともポリシーを全て削除してListToolsを実行したところ、公式ドキュメントの方は単純に下記のように空配列(何もアクションを許可していないためツールが見えない状態)が返ってきたのでポリシーが原因ではないと理解しました。
公式ドキュメントをベースに作ったGatewayのレスポンス
Status Code: 200
Response Body: {
"jsonrpc": "2.0",
"id": 1,
"result": {
"tools": []
}
}
自分が以前に作成したGatewayのレスポンス
Status Code: 200
Response Body: {
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [
{
"type": "text",
"text": "InternalServerException - Policy evaluation failed for list tools"
}
],
"isError": true
}
}
レスポンス形式が違いますよね。次にログを有効にしたのですが、自分が作成したGatewayのログを見ても特に手掛かりになる情報はなさそうでした。
{
"resource_arn": "arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/my-gateway-xxxxxxxx",
"event_timestamp": 0000000000000,
"body": {
"isError": true,
"log": "Policy evaluation failed for list tools",
"id": "1"
},
"account_id": "123456789012",
"request_id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"trace_id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"span_id": "xxxxxxxxxxxxxxxx",
"resource": {
"attributes": {
"service.name": "my-gateway-xxxxxxxx",
"cloud.resource_id": "arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/my-gateway-xxxxxxxx",
"cloud.platform": "aws_bedrock_agentcore"
}
},
"attributes": {
"aws.request.id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"aws.account.id": "123456789012",
"aws.resource.type": "AWS::BedrockAgentCore::Gateway"
},
"timeUnixNano": 0000000000000000000,
"severityNumber": 17,
"severityText": "ERROR",
"traceId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"spanId": "xxxxxxxxxxxxxxxx"
}
今度はGatewayのトレースを有効化してGenAI Observabilityで挙動を確認してみると、何やらエラーマークが出ていました。
AgentCore.Policy.PartiallyAuthorizeActionsをクリックしてMetadataのタブを開くと下記情報が記録されていました。

{
"traceId": "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy",
"spanId": "yyyyyyyyyyyyyyyy",
"flags": 0,
"name": "AgentCore.Policy.PartiallyAuthorizeActions",
"kind": "CLIENT",
"startTimeUnixNano": 0000000000000000000,
"endTimeUnixNano": 0000000000000000000,
"durationNano": 0,
"attributes": {
"aws.local.service": "my-gateway-xxxxxxxx",
"telemetry.extended": true,
"rpc.service": "MyPolicy-xxxxxxxxxx",
"errorType": "user",
"aws.request.id": "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy",
"error": true,
"rpc.system": "aws-api",
"aws.remote.service": "AWS::MyPolicy-xxxxxxxxxx",
"aws.resource.type": "AWS::BedrockAgentCore::Gateway",
"aws.agentcore.gateway.policy.mode": "ENFORCE",
"aws.local.environment": "generic:default",
"aws.remote.operation": "PartiallyAuthorizeActions",
"http.status_code": 403,
"aws.local.operation": "UnmappedOperation",
"aws.span.kind": "CLIENT",
"rpc.method": "PartiallyAuthorizeActions",
"aws.xray.origin": "AWS::BedrockAgentCore::Gateway",
"aws.resource.arn": "arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/my-gateway-xxxxxxxx",
"aws.agentcore.gateway.policy.arn": "arn:aws:bedrock-agentcore:us-west-2:123456789012:policy-engine/MyPolicy-xxxxxxxxxx",
"aws.agentcore.policy.target_resource.id": "my-gateway-xxxxxxxx",
"PlatformType": "Generic",
"http.response.status_code": 403
},
"status": {
"code": "ERROR"
},
"resource": {
"attributes": {
"cloud.resource_id": "arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/my-gateway-xxxxxxxx",
"cloud.provider": "aws",
"service.name": "my-gateway-xxxxxxxx",
"cloud.platform": "aws_bedrock_agentcore"
}
},
"parentSpanId": "zzzzzzzzzzzzzzzz"
}
よくみるとステータスコードが403返ってきていて、PartiallyAuthorizeActionsを実行して権限不足でエラーが出ているように見えます。
ここで権限に関わるところがIAMぐらいしか思いつかなかったので、GatewayのService-Linked Roleの権限が両者違うのか?と疑いが生じてそれぞれ確認して見ました。
公式ドキュメントをベースに作ったGatewayのService-Linked Role
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "BedrockAgentCoreFullAccess",
"Effect": "Allow",
"Action": [
"bedrock-agentcore:*"
],
"Resource": "arn:aws:bedrock-agentcore:*:*:*"
},
{
"Sid": "GetSecretValue",
"Effect": "Allow",
"Action": [
"secretsmanager:GetSecretValue"
],
"Resource": "*"
},
{
"Sid": "LambdaInvokeAccess",
"Effect": "Allow",
"Action": [
"lambda:InvokeFunction"
],
"Resource": "arn:aws:lambda:*:*:function:*"
}
]
}
おお、結構強めの権限が付与されていました。BedrockAgentCoreFullAccessでAgentCoreの操作は何でもできる状態でした。これはIAMの権限設定が怪しい気がしますね。
以前に自分が作成したGatewayのService-Linked Role
コンソール上で自動作成した権限です。上と比較すると基本的な権限しか付与されていませんね。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "GetGateway",
"Effect": "Allow",
"Action": [
"bedrock-agentcore:GetGateway"
],
"Resource": [
"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/existing-gateway-*"
]
}
]
}
ここに権限を付与すればいいのだろうと思ったのですが、どのリソースに何の権限を付与したらいいか不明な状態です。
権限が関わっているかどうか調べたかったので、公式ドキュメントをベースに作ったGatewayのService-Linked Roleを以前に作って作成したGatewayのService-Linked Roleに変更してListToolsを実行したところ問題なく動きました。
Status Code: 200
Response Body: {
"jsonrpc": "2.0",
"id": 1,
"result": {
"tools": []
}
}
エラーは表示されず問題なく動きました。IAMの権限が問題なのは分かったので元のロール戻したところ、下記カスタマーマネージドポリシーが作成されていました。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "EvaluatePoliciesForGateway",
"Effect": "Allow",
"Action": [
"bedrock-agentcore:AuthorizeAction",
"bedrock-agentcore:PartiallyAuthorizeActions"
],
"Resource": [
"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/my-gateway-*",
"arn:aws:bedrock-agentcore:us-west-2:123456789012:policy-engine/MyPolicy-xxxxxxxxxx"
]
},
{
"Sid": "GetPolicyEngineForValidation",
"Effect": "Allow",
"Action": [
"bedrock-agentcore:GetPolicyEngine"
],
"Resource": [
"arn:aws:bedrock-agentcore:us-west-2:123456789012:policy-engine/MyPolicy-xxxxxxxxxx"
]
}
]
}
あれ、エラーになっていたPartiallyAuthorizeActionsも含まれているし、もしかして適切な権限がアタッチされてたのでは・・・と思い試して見たところ正常に動きました。
Status Code: 200
Response Body: {
"jsonrpc": "2.0",
"id": 1,
"result": {
"tools": []
}
}
先にGatewayを作って、Policy側の画面で後からPolicyを紐付けた場合は、GatewayのService-Linked RoleのIAM権限が更新されていなかったのが原因ですね。
Gateway作成時点やIAMロールの変更時に、Gateway側の画面でPolicyを紐づけている場合はIAMの権限は適切に反映される挙動になっていました。
Gatewayを新規作成時にPolicyを紐付けて行ったところ、何もつまらずにListToolsに成功しました。
おわりに
原因は単純なのですが、かなり長い時間苦戦しました・・・
もし同じようにお困りの方に対して参考になれば大変嬉しく思います。
最後までご覧いただきありがとうございましたー!!








