【はじめに】
先日、下記のStrands Agentsのサンプルコードを作成し、ブログにしてみました。
Strands AgentsをTypeScriptで実行してみた - オノコム
その時は、ただ動かしたかったためポリシーに「AmazonBedrockFullAccess」を使用しましたが、AWSの推奨する「最小権限の原則」からは程遠い状態のため、これもまた先日のAWS re:invent 2025で発表された「IAM Policy Autopilot」を使用して、適切な権限を作成してみました。
「IAM Policy Autopilot」については、詳しくは下記のMicah Walter氏によるAWSブログをご覧ください。私の認識としては、コードからIAMポリシーを生成してくれるお手伝いさんといった感じです。
あと、AWSブログ中にも記載されていますが、「IAM Policy Autopilot が生成するポリシーは、最小権限よりも機能性を優先しています。生成されたポリシーは必ず確認し、必要に応じて修正して、デプロイ前に自社のセキュリティ要件に合致させるようにしてください。」とのことなので、100%任せっきりにせず、ご自身でもご確認ください。
【環境や使用したもの】
- IAM Policy Autopilot(今回の主役)
- Mac
- 前回作成したStrands Agentsのサンプルコードが含まれるプロジェクトフォルダ
- 前回作成したIAMユーザー(ポリシー:AmazonBedrockFullAccess)
- Claude Code
- 事前にSSOを使用してのログイン
- リージョンは、us-west-2(オレゴン)
【手順と実行】
MCPサーバーを登録するためにプロジェクトフォルダに移動し、以下のコマンドを実行。
claude mcp add iam-policy-autopilot -s project --env AWS_PROFILE=(プロファイル名) --env AWS_REGION=us-west-2 -- uvx iam-policy-autopilot mcp-serverSSOを使用してログイン。
aws sso login --profile (プロファイル名)Claude Codeを起動。
登録したMCPサーバーが起動していることを確認。
Claude Code上で以下のコマンドを使用することでMCPサーバーを確認することが出来ます。
/mcpClaude Codeに指示を入力。
教えて欲しいことがあります。このプロジェクトには、アクセスキーを使用して接続を行う部分があります。そのアクセスキー自体を有効化しているIAMユーザーには、ポリシーに「AmazonBedrockFullAccess」を使用しているのですが、適切でしょうか?MCPサーバーを使用してポリシーが適切かどうかを確認し、適切でない場合は設定した方が良い内容を教えて下さい。
以上のような内容で実行してみると、プロジェクト内のコードを確認し、以下の結果を返してくれました。
⏺ MCPサーバーのソースコード分析では、@strands-agents/sdkが内部でAWS SDKを抽象化しているため、直接的なAWS
API呼び出しが検出されませんでした。
しかし、Strands Agents SDKがAmazon Bedrockを使用することは明確です。この場合の適切なポリシーについて説明します。
「AmazonBedrockFullAccess」は適切ではありません
理由: このポリシーには以下のような不要な権限が含まれています:
- モデルの作成・削除・更新
- エージェントの作成・管理
- カスタムモデルのトレーニング
- Bedrock Guardrailsの管理
- データソースやナレッジベースの作成・削除
このプロジェクトでは単純にモデルを呼び出すだけなので、これらの権限は過剰です。
生成された修正ポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "IamPolicyAutopilotAllow",
"Effect": "Allow",
"Action": "bedrock:InvokeModelWithResponseStream",
"Resource": "arn:aws:bedrock:us-west-2:(アカウントID):inference-profile/global"
}
]
}
推奨される改善版
より堅牢にするため、以下のように拡張することをお勧めします:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "BedrockInferenceProfile",
"Effect": "Allow",
"Action": [
"bedrock:InvokeModel",
"bedrock:InvokeModelWithResponseStream"
],
"Resource": [
"arn:aws:bedrock:us-west-2:(アカウントID):inference-profile/*",
"arn:aws:bedrock:*::foundation-model/*"
]
}
]
}
早速、上記の「生成された修正ポリシー」をインラインポリシーとしてIAMユーザーに追加、AmazonBedrockFullAccessのポリシーを削除、コードを実行してみたところ、エラーになりました。
次に上記の「推奨される改善版」でインラインポリシーを更新し、コードを実行してみたところ、問題なく内容が表示されました。
あとでClaude Codeに動かなかった原因を聞いてみたところ、以下のような回答でした。
inference-profileのリソースARNは global.anthropic.claude-sonnet-4-5-20250929-v1:0 のようにモデル名とバージョンを含むため、/global だけでは不十分でした。
【まとめ】
AWSで何かを実行する際には、必ずと言っていいほど必要となるIAMポリシー。
実際に何度もIAMポリシーの設定を行ってきましたが、何が必要なのか、そして何が不要なのかを調べて設定するだけで私は結構な時間を消費してしまいます。
特にテスト環境での実行では、接続元を制限したうえではありますが、フルアクセスのようなIAMポリシーで済ませてしまうことがあります。
「テスト環境であれ、やはりフルアクセスは・・・。」と思っていたこともあり、今回のように最小権限とまでは行きませんが、不要な権限を省いてくれているのはかなり助かります。
Claude CodeでもIAMポリシーを作成してくれるのですが、一般的なIAMポリシーであればそれなりに作成してくれますが、必要な権限が増えてきたり、大きなコードの権限などを作成するときは、何度も作って設定し実行を繰り返すことが多々あります。
今回の「IAM Policy Autopilot」も何度か設定をすることもありますが、Claude Codeだけで作成しているときよりもゴールに辿り着くのが早く、不要な権限を省いてくれているように感じます。
ただ、最終的には自身で確認をする必要があるため、全てを任せっきりにせずに自身もそれなりにIAMポリシーに関する知識を持っておく必要があり、日々勉強が必要なことを実感させられました。