
Claude CodeにMCP経由で複数のAWSアカウントを参照させてみる
はじめに
皆様こんにちは、あかいけです。
Claude Codeへ複数のAWSアカウントを参照させたいと思ったことはありますか?私はあります。
ただ1アカウントずつ手でスイッチロールするのは現実的ではないので、Claude CodeにAWS MCP Serverをつないで調べてもらうことにしました。
というわけで今回は、Claude Codeに複数のAWSアカウントを横断参照させる設定をまとめます。
前提条件
- ベースアカウントから、参照対象の各AWSアカウントへスイッチロールするためのIAMロールが、スイッチロール先のアカウントへ展開されていること
- ロール名は全アカウントで統一されていると設定が楽です
- スイッチロール先のIAMロールには、基本的に参照権限のみが付与されていること
- AIに触らせるときは参照権限だけにするのが原則だと考えています。詳しくは後述します
- AWS CLI 2.32.0以降がインストールされていること
aws loginコマンドの利用に必要なバージョンです
uv(uvx)がインストールされていること
認証にはaws loginを使います。
なおIAM Identity Centerを使っている場合は起点プロファイルの定義がsso_sessionを使う形に変わりますが、そこから先のスイッチロールとMCP設定は同じです。
認証フロー
本ブログで行う設定は以下のとおりです。
- ベースアカウントを起点に、各アカウントへスイッチロールするプロファイルをAWS CLIの設定ファイルに定義する
- そのプロファイル名をMCP設定でまとめてプロキシに渡す
認証情報のチェーンはこのようになります。
ブラウザで認証するのは起点のプロファイルの1回のみで、各アカウントへのスイッチロールはそのセッションから派生します。
リクエストの流れは以下のとおりです。
Claude Codeはツール呼び出しのたびにaws_profileパラメータで対象アカウントを指定できるため、MCPサーバーの再起動は不要です。
このaws_profileによる切り替えは、AWS MCP ServerをSigV4認証で使うときに限って提供される機能です。
OAuth認証の場合はセッションが1つのIAMロールに固定されるため、アカウントを切り替えるたびに再認証が必要になります。
設定内容
スイッチロール元のIAMユーザー
ベースアカウントに置く、aws loginでサインインするIAMユーザーです。
必要な権限は2つあります。
1つ目はaws loginでコンソール認証情報を使うための権限で、AWS管理ポリシーのSignInLocalDevelopmentAccessをアタッチします。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"signin:AuthorizeOAuth2Access",
"signin:CreateOAuth2Token"
],
"Resource": "arn:aws:signin:*:*:oauth2/public-client/*"
}
]
}
2つ目は各アカウントへスイッチロールするための権限です。
こちらはインラインポリシーで付けます。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AssumeReadOnlyRoleInTargetAccounts",
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::*:role/AIAgentReadOnlyRole"
}
]
}
スイッチロール先のIAMロール
参照対象の各アカウントに展開するロールです。
ここではAIAgentReadOnlyRoleという名前で、全アカウントに同名で配置されている前提とします。
許可ポリシーは、「ReadOnlyAccess」をアタッチします。
信頼ポリシーは、ベースアカウントからのみ引き受けられるようにします。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::XXXXXXXXXXXX:root"
},
"Action": "sts:AssumeRole"
}
]
}
AWS CLI 設定ファイル
プロファイル定義です。
~/.aws/configに直接書いてもよいのですが、今回は専用のファイルに分けています。
# 起点 プロファイル
[profile hub-account]
region = ap-northeast-1
output = json
# スイッチロール先 プロファイル
[profile network-account]
source_profile = hub-account
role_arn = arn:aws:iam::YYYYYYYYYYYY:role/AIAgentReadOnlyRole
role_session_name = claude-code
region = ap-northeast-1
output = json
[profile security-account]
source_profile = hub-account
role_arn = arn:aws:iam::ZZZZZZZZZZZZ:role/AIAgentReadOnlyRole
role_session_name = claude-code
region = ap-northeast-1
output = json
[profile workload-prd-account]
source_profile = hub-account
role_arn = arn:aws:iam::AAAAAAAAAAAA:role/AIAgentReadOnlyRole
role_session_name = claude-code
region = ap-northeast-1
output = json
MCP 設定ファイル
プロジェクト直下の.mcp.jsonです。
{
"mcpServers": {
"aws-audit": {
"command": "uvx",
"args": [
"mcp-proxy-for-aws-cli@latest",
"https://aws-mcp.ap-northeast-1.api.aws/mcp",
"--metadata",
"AWS_REGION=ap-northeast-1"
],
"env": {
"AWS_CONFIG_FILE": "/Users/example/work/aws-audit/aws-config",
"AWS_MCP_PROXY_PROFILES": "hub-account network-account security-account workload-prd-account"
}
}
}
}
各種設定について
IAMは参照権限のみに絞る
この設定で安全性を担保するには、スイッチロール先のロールに参照権限しか与えていない点です。
まず前提として、AIエージェントに渡すロールは参照権限のみにするのが原則だと考えています。
理由は、エージェントの判断ミスがそのまま本番環境の変更になるからです。
調査の過程で「設定を直しておきますね」と動かれても困りますし、プロンプトインジェクションのような外部要因で意図しない操作が走る可能性も残ります。
そういった場合、参照権限しか持たないロールであれば、何が起きてもRead権限以上のことはできません。
なお今回はReadOnlyAccessを使っていますが、「S3のオブジェクトを読ませたくない!」など要件があれば、用途に応じてViewOnlyAccessを使ってもいいかもです。
スイッチロール元のIAMユーザー側も、sts:AssumeRoleの対象をAIAgentReadOnlyRoleというロール名に限定しています。
これでベースアカウントの認証情報を勝手に使われたとしても、引き受けられるのは参照専用のロールだけになります。
起点プロファイルとaws login
aws loginは起点プロファイルを指定します。
export AWS_CONFIG_FILE=/Users/example/work/aws-audit/aws-config
aws login --profile hub-account
ブラウザが開くので、ベースアカウントのIAMユーザーでサインインします。
すでにマネジメントコンソールにサインイン済みであれば、そのセッションを選ぶだけでOKです。
スイッチロールのプロファイル
source_profile = hub-accountを指定することで、起点プロファイルの認証情報を使ってAssumeRoleするチェーンが組まれます。
aws loginで得たセッションも、このチェーンの起点としてそのまま使えます。
アカウントが増えてもこのブロックを並べるだけなので、アカウント一覧のCSVなどがあるならスクリプトで生成してしまってもいいでしょう。
あとrole_session_nameはCloudTrailに記録されるので、あとからAIエージェント経由の操作だと追跡できる値がおすすめです。
MCP設定で渡している環境変数
envで渡している2つの設定がポイントです。
AWS_CONFIG_FILEで、先ほど作った専用の設定ファイルを指定しています。
これにより、普段使っている~/.aws/configのプロファイルとは完全に分離できます。
AWS_MCP_PROXY_PROFILESは、プロキシに使わせるプロファイルをスペース区切りで列挙する環境変数です。
ここに書いたプロファイルだけが、ツール呼び出し時のaws_profileパラメータの選択肢になります。先頭のhub-accountがデフォルトとして使われ、aws_profileを省略した呼び出しはこのプロファイルで実行されます。
ここで 重要なのは列挙していないプロファイルは使えない という点です。
設定ファイルに書いてあっても、ここに名前がなければClaude Codeからは見えませんし、指定してもエラーで弾かれます。
明示的な許可リストとして機能してくれるので、「意図しないアカウントを参照される」事故を構造的に防げます。
またプロジェクトごとに.mcp.jsonを分けることで、プロジェクト単位で参照できるAWSアカウントを分離できます。
動作確認
まずはAWS CLI単体で、スイッチロールが通ることを確認します。
export AWS_CONFIG_FILE=/Users/example/work/aws-audit/aws-config
# 起点
aws sts get-caller-identity --profile hub-account
# スイッチロール先
aws sts get-caller-identity --profile security-account
スイッチロール先では、引き受けたロールのARNが返ってくるはずです。
{
"UserId": "AROAEXAMPLEID:claude-code",
"Account": "ZZZZZZZZZZZZ",
"Arn": "arn:aws:sts::ZZZZZZZZZZZZ:assumed-role/AIAgentReadOnlyRole/claude-code"
}
問題なく参照できたらClaude Codeを起動し、/mcpでサーバーが接続できているかを確認します。
あとは普通に日本語で聞くだけです。
security-account と workload-prd-account の2つのアカウントで、
パブリックアクセスを許可しているS3バケットがないか確認して
Claude Codeがアカウントごとにaws_profileを指定してツールを呼び分けてくれるので、アカウント横断の調査を自然言語で投げられるようになります。
さいごに
以上、AWSプロファイルとMCP設定を組み合わせて、Claude Codeに複数のAWSアカウントを参照させる方法でした。
やっていることは単純ですが、アカウント横断で調査する作業はそれなりに骨が折れる作業なので、個人的にはめっちゃ助かっています。
同じようにマルチアカウント環境でAIエージェントを使いたい方の参考になれば幸いです。












