Claude Code上でAWS CLI設定とSTS AssumeRoleによるマルチアカウント切り替えをやってみた

Claude Code上でAWS CLI設定とSTS AssumeRoleによるマルチアカウント切り替えをやってみた

Claude Code上で安全にAWSのマルチアカウント切り替えをやってみる
2025.08.18

はじめに

カスタマーサクセス部のやまとです。

複数のAWS環境にアクセスする必要がある場合、セキュリティと利便性を両立させることが重要です。
今回は、Claude Code上でAWS CLIの設定を整備し、STS AssumeRoleを使って複数のAWSアカウントを安全に切り替える方法を実際に試してみました。

環境情報(IAMポリシーの設定)

1. ベース(基幹)アカウント(本例: 333333333333)

  • IAMユーザー
  • カスタムポリシーでAssumeRoleの権限を付与
    • ベース(基幹)アカウントのIAMユーザーにアタッチした許可ポリシーの例:
      IAM-User
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "sts:AssumeRole",
      "Resource": [
        "*"
      ]
    }
  ]
}
  • アクセスキー発行、MFAデバイス設定済み

2. アクセス先となるターゲットアカウント(本例: 111111111111, 222222222222)

  • IAMロールが作成済 (本例: RoleA, RoleReadOnly)
  • 許可ポリシーに適切な権限がアタッチされている (S3読み取り等)
    • 信頼関係ポリシー設定 (ベースアカウントのユーザーを信頼している)
    • アクセス先アカウントのIAMロールの信頼ポリシー例:
      claude-code-aws-cli-sts-assumerole
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::333333333333:user/example.user"
      },
      "Action": "sts:AssumeRole",
      "Condition": {
        "Bool": {
          "aws:MultiFactorAuthPresent": "true"
        }
      }
    }
  ]
}
  • MFA条件付きAssumeRoleを許可

基本方針

  • 複数環境のアクセスはすべてAssumeRole経由で行う
  • 短い有効期限+MFA必須+最小権限で実行する
  • 権限を絞る
    • 読み取り専用(ReadOnly)でアクセスする
    • 必要時のみ昇格し、使用する都度MFA認証を行う
    • duration_secondsで時間制限付きアクセスを設定する
  • 運用上の注意点
    • プロファイルを常に明示指定します

設定構成

~/.aws/config の設定

[default]
region = ap-northeast-1
source_profile = base
role_arn = arn:aws:iam::111111111111:role/RoleA
mfa_serial = arn:aws:iam::333333333333:mfa/example.user
duration_seconds = 900

[profile CustomerA]
region = ap-northeast-1
source_profile = Access CustomerA
role_arn = arn:aws:iam::222222222222:role/RoleReadOnly
mfa_serial = arn:aws:iam::333333333333:mfa/example.user
duration_seconds = 900

~/.aws/credentials の設定

[base]
aws_access_key_id = "アクセスキーID"
aws_secret_access_key = "シークレットアクセスキー"

[Access CustomerA]
aws_access_key_id = "アクセスキーID"
aws_secret_access_key = "シークレットアクセスキー"

Claude Code上での実際の動作検証してみた

1. defaultプロファイルでのアクセス確認

新規ターミナルウィンドウを開き、defaultプロファイルを認証

aws sts get-caller-identity --profile default

実行結果:

Enter MFA code for arn:aws:iam::333333333333:mfa/example.user: ######
{
    "UserId": "AROA...:botocore-session-...",
    "Account": "111111111111",
    "Arn": "arn:aws:sts::111111111111:assumed-role/RoleA/botocore-session-..."
}

AWSをMFAで認証している場合はワンタイムパスワード(######)を求められます。

2. Claude Codeを実行

上記の作業で作成したウィンドウとは別に新規ウィンドウを開き、Claude Codeを起動する。

claude
「アクセステストとしてdefaultプロファイル環境のS3バケット一覧を取得してください」

2-1. Claude Codeによるアクセス「プロファイル: default環境内のS3バケット一覧の取得」

AWS_PROFILE=default aws s3 ls --no-cli-auto-prompt

実行結果(一部省略した例):

2025-01-02 12:22:22 example-bucket-111111111111
2025-07-03 12:33:33 example-bucket-111111111111-ap-northeast-1
2024-12-01 12:11:11 example-bucket-templates-111111111111-ap-northeast-1
...

3. CustomerAプロファイルでのアクセス確認

Claude Codeを動かしていない別のターミナルウィンドウで実行する(1. で使用したターミナルウィンドウ、または新規ウィンドウを開き、実行)

aws sts get-caller-identity --profile CustomerA

実行結果:

Enter MFA code for arn:aws:iam::333333333333:mfa/example.user: ######
{
    "UserId": "AROZ...:botocore-session-...",
    "Account": "222222222222",
    "Arn": "arn:aws:sts::222222222222:assumed-role/RoleReadOnly/botocore-session-..."
}

同様にワンタイムパスワード(######)が求められました。

4. Claude Codeを実行

Claude Codeを開いたターミナルで実行

「今度もアクセステストとしてCustomerAプロファイル環境のS3バケット一覧を取得してください」

4.1 Claude Codeによるアクセス「プロファイル: CustomerA環境内のS3バケット一覧の取得」

AWS_PROFILE=CustomerA aws s3 ls --no-cli-auto-prompt

環境変数を一時的に指定してaws s3 ls に限り CustomerA の認証情報で実行

実行結果(一部省略した例):

2024-11-01 14:00:10 customer-a-waf-logs-app1
2024-11-02 14:00:20 customer-a-waf-logs-app2
2024-11-03 14:00:30 customer-a-analytics-logs
...

実行時の注意点

  • 明示的にプロファイルを指定すること
    • aws sts get-caller-identity --profile default
    • aws sts get-caller-identity --profile CustomerA
  • 現在の認証、設定確認する場合は以下を使用すること
    • echo $AWS_PROFILE
    • aws sts get-caller-identity

※ AWS CLIの認証解決優先度は --profile > 環境変数(AWS_PROFILE) であり、環境変数を固定したままの他の作業やスクリプトを誤って「別アカウント」で実行してしまうリスクを防ぐため--profile で明示指定することがおすすめします。

トラブルシューティング

  • AccessDenied
    • 信頼ポリシー、許可ポリシー、MFA条件を確認してください
  • MFAエラー
    • mfa_serialのARN、デバイス同期、端末の時刻同期を確認してください
  • DurationSeconds超過
    • CLI側で各プロファイルのduration_secondsとロール側の最大セッション時間を調整してください

まとめ

  • プロファイル分離+AssumeRole+MFA+短期セッションがマルチアカウント切り替えの基本戦略として有効です。
  • Claude CodeでもAWS CLIと同等の優先度で動作しました。
  • --profile を使うことで明示的指定で安全にマルチアカウント運用が可能です。

参考

https://docs.aws.amazon.com/ja_jp/cli/v1/userguide/cli-chap-configure.html?utm_source=openai#configure-precedence

アノテーション株式会社について

アノテーション株式会社はクラスメソッドグループのオペレーション専門特化企業です。サポート・運用・開発保守・情シス・バックオフィスの専門チームが、最新 IT テクノロジー、高い技術力、蓄積されたノウハウをフル活用し、お客様の課題解決を行っています。当社は様々な職種でメンバーを募集しています。「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、アノテーション株式会社 採用サイトをぜひご覧ください。

この記事をシェアする

facebookのロゴhatenaのロゴtwitterのロゴ

© Classmethod, Inc. All rights reserved.