跨AWS账户迁移S3文件遇403 AccessDenied,请求排查IAM配置
解决跨账户S3迁移PUT临时文件时的Access Denied错误
核心问题分析
你遇到的403错误是因为账户B的目标S3桶未配置允许账户A角色写入的桶策略,同时账户A的角色当前权限仅覆盖自身桶,无法对账户B的桶执行写入操作。迁移过程中(尤其是用Glue这类工具时)需要在目标桶创建临时文件,这一步缺少必要权限导致失败。
修复步骤
1. 给账户B的目标桶添加桶策略
登录账户B的AWS控制台,找到目标S3桶,进入「权限」→「桶策略」,添加以下策略(替换占位符为实际值):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::{accountAId}:role/cross-accountA-sample-role" }, "Action": [ "s3:ListBucket", "s3:PutObject", "s3:PutObjectAcl", "s3:DeleteObject", "s3:GetBucketLocation" ], "Resource": [ "arn:aws:s3:::{accountB-target-bucket-name}", "arn:aws:s3:::{accountB-target-bucket-name}/*" ] } ] }
这个策略允许账户A的cross-accountA-sample-role角色对目标桶执行列表、写入、删除等操作,满足临时文件创建和清理的需求。
2. 补充账户A角色的目标桶权限(可选但更严谨)
登录账户A的AWS控制台,找到cross-accountA-sample-role角色,编辑其附加的策略,新增以下Statement:
{ "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:PutObject", "s3:DeleteObject", "s3:GetBucketLocation" ], "Resource": [ "arn:aws:s3:::{accountB-target-bucket-name}", "arn:aws:s3:::{accountB-target-bucket-name}/*" ] }
确保该角色拥有对账户B目标桶的写入权限,完成IAM权限链的闭环。
3. 验证权限有效性
用AWS CLI测试权限链是否正常:
- 切换到账户B的角色凭证,执行角色扮演:
aws sts assume-role --role-arn arn:aws:iam::{accountAId}:role/cross-accountA-sample-role --role-session-name test-s3-migrate
- 使用返回的临时凭证,测试写入目标桶的临时路径:
# 替换临时凭证的值 export AWS_ACCESS_KEY_ID=临时AccessKey export AWS_SECRET_ACCESS_KEY=临时SecretKey export AWS_SESSION_TOKEN=临时SessionToken # 测试写入临时文件 echo "test" > temp.txt aws s3 cp temp.txt s3://{accountB-target-bucket-name}/dt/output1/parquet/_temporary/0/test.txt
如果能成功上传,说明权限配置正确。
额外排查点
- 检查目标桶的Block Public Access设置:确保未完全阻止跨账户IAM访问(Block Public Access不影响合法的跨账户IAM角色访问)。
- 确认Glue作业(如果用Glue迁移)的执行角色是账户B的跨账户角色,且该角色已正确配置
sts:AssumeRole权限访问账户A的角色。
内容的提问来源于stack exchange,提问作者noobie-php
相关产品推荐
相关产品推荐

