✅ 想定シナリオ
アカウント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の信頼設定確認なども支援できます。