EC2实例执行S3上传遇AccessDenied权限问题求助
问题排查与解决方案
核心问题定位
EC2实例上执行aws sts get-caller-identity返回与本地相同的IAM用户身份,说明EC2没有使用你配置的EC2-to-S3实例角色,而是加载了本地用户的AWS凭证(比如~/.aws/credentials文件里的密钥)。这直接导致:
- 桶策略仅允许
EC2-to-S3角色访问,当前使用的my-user不在允许范围内; - 虽然本地
my-user是管理员,但EC2环境下可能存在额外限制(如VPC端点策略、区域不匹配等)导致权限被拒。
具体排查步骤
1. 确认EC2实例的凭证来源
执行以下命令查看当前AWS CLI使用的凭证配置:
aws configure list
如果输出中显示credentials file路径(如~/.aws/credentials),说明确实在使用本地用户凭证,而非实例角色的临时凭证。
2. 切换到实例角色凭证
删除或重命名EC2实例上的本地AWS配置文件:
mv ~/.aws/credentials ~/.aws/credentials.bak mv ~/.aws/config ~/.aws/config.bak
重新执行aws sts get-caller-identity,确认返回的Arn为arn:aws:iam::123123:role/EC2-to-S3(你的实例角色)。
3. 修正桶策略的账号ID
你的桶策略中Principal的账号是123123123,但本地用户的Account是123123,存在位数不一致的问题。修正桶策略中的账号ID为实际的12位AWS账号ID:
{ "Version": "2012-10-17", "Id": "MyPolicy", "Statement": [ { "Sid": "AllowGetPutFrom_EC2-to-S3_role", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123123:role/EC2-to-S3" }, "Action": "s3:*", "Resource": [ "arn:aws:s3:::lambda-layer-myapp/*", "arn:aws:s3:::lambda-layer-myapp" ] } ] }
(替换123123为你的实际账号ID)
4. 排查VPC网络限制(若EC2在VPC内)
如果EC2部署在VPC中:
- 若配置了S3 VPC端点,检查端点策略是否允许
EC2-to-S3角色访问目标桶; - 若没有端点,确认EC2有互联网访问权限(通过NAT网关或公网IP),否则无法访问S3。
5. 验证实例角色权限
进入IAM控制台,确认EC2-to-S3角色附加的策略包含s3:*权限,且资源范围覆盖目标桶。
测试验证
完成上述步骤后,重新执行上传命令:
aws s3 cp myapp-layer.zip s3://lambda-layer-myapp/myapp-layer.zip
同时检查VS Code的AWS Toolkit是否能正常加载S3桶。
内容的提问来源于stack exchange,提问作者Kid_Learning_C
相关产品推荐
相关产品推荐

