Uncategorized

STS-IAM


✅ 想定シナリオ

アカウントAのIAMユーザー or IAMロールが、アカウントBのS3バケットにファイルをアップロードしたい。


✅ 構成手順と解説

■ アカウントB(S3バケット所有・権限提供)

① S3バケット作成

例: s3://account-b-upload-bucket

② IAMロール作成(アカウントAからAssumeされるロール)

  • ロール名例: UploadAccessRoleFromA
  • 信頼ポリシー(Trust Policy)でアカウントAを指定:
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<アカウントAのID>:root"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
  • アクセスポリシー(Permissions Policy)でS3バケットへのアクセスを許可:
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:PutObject", "s3:GetObject"],
      "Resource": "arn:aws:s3:::account-b-upload-bucket/*"
    }
  ]
}

■ アカウントA(ファイル連携元)

assume-role 実行

aws sts assume-role \
  --role-arn arn:aws:iam::<アカウントBのID>:role/UploadAccessRoleFromA \
  --role-session-name my-upload-session
  • これにより、以下3つの値が返ります:
"AccessKeyId": "ASIA...",
"SecretAccessKey": "...",
"SessionToken": "..."

④ 環境変数に設定(または --profile 使用)

export AWS_ACCESS_KEY_ID=ASIA...
export AWS_SECRET_ACCESS_KEY=...
export AWS_SESSION_TOKEN=...

もしくは --profile を用いて指定。

⑤ S3へファイルアップロード(例)

aws s3 cp ./file.txt s3://account-b-upload-bucket/

✅ 補足事項

Invalid principal エラーに注意

  • 信頼ポリシーの "Principal": "AWS": ... に指定するのはIAMユーザーやIAMロールのARNではなく、アカウントID or 明示的なIAMロールARNです。
  • SSO経由のセッションARN(assumed-role/...)は信頼ポリシーに直接書けません。その場合は、アカウント全体(<アカウントA ID>:root)を許可する必要があります。

● セッションの明示的な終了

STSトークンは一定時間(通常1時間)で失効します。明示的に「終了」する方法はなく、使用をやめればよいです(環境変数を unset すればOK):

unset AWS_ACCESS_KEY_ID
unset AWS_SECRET_ACCESS_KEY
unset AWS_SESSION_TOKEN

✅ 全体フロー図(簡略)

[アカウントA IAMユーザー]
       |
       | STS AssumeRole
       v
[アカウントB IAMロール (UploadAccessRoleFromA)]
       |
       | 権限によりS3バケットへアクセス
       v
[S3バケット (アカウントB)]

ご不明点があれば、バケットポリシー側での補強や、アカウントAの信頼設定確認なども支援できます。