使用CloudFormation部署预装Java的Windows EC2时从私有S3拉取文件报403求助
S3拉取403错误的具体原因及修复方案
核心配置错误(最可能触发403)
- IAM策略的资源范围不匹配:你当前配置的
s3:GetObject权限对应Resource是arn:aws:s3:::windowsartifcats(桶本身的ARN),但该权限需要作用在桶内的对象资源上,正确的Resource必须加上/*后缀,即arn:aws:s3:::windowsartifcats/*。仅给桶本身的GetObject权限,无法访问桶内的任何文件,这是403的最高发原因。 - CloudFormation认证配置冗余错误:你在
AWS::CloudFormation::Authentication中手动指定了roleName: !Ref EC2S3Role,但cfn-init会自动读取EC2实例绑定的实例配置文件中的临时凭证,不需要手动指定角色名。且!Ref EC2S3Role返回的是CloudFormation生成的带随机后缀的角色物理ID,手动指定反而会导致凭证校验失败。
其他排查点
- 桶名拼写一致性:你模板中所有位置使用的桶名为
windowsartifcats(标准拼写应为artifacts),如果实际创建的桶名拼写不匹配,S3会对不存在的私有桶返回403(而非404,避免公开桶存在性)。 - S3桶策略冲突:如果桶开启了「阻止所有公共访问」,且没有配置桶策略放行该IAM角色的访问请求,即使IAM角色本身有权限,桶侧也会拒绝请求。
- 缺失必要权限:如果cfn-init需要批量拉取桶内文件,还需要为角色补充
s3:ListBucket权限,该权限的Resource填写桶本身的ARN即可。
修正后的配置示例
IAM策略修正
将原权限段修改为:
Statement: - Action: 's3:GetObject' Resource: "arn:aws:s3:::windowsartifcats/*" Effect: Allow # 按需新增ListBucket权限 - Action: 's3:ListBucket' Resource: "arn:aws:s3:::windowsartifcats" Effect: Allow
CloudFormation认证配置修正
删除手动指定的roleName,简化为:
AWS::CloudFormation::Authentication: S3AccessCreds: Type: "S3" buckets: - "windowsartifcats" roleBased: true
实例侧验证命令
在Windows EC2实例的PowerShell中运行以下命令,确认凭证和权限是否正常:
# 验证实例是否正常绑定IAM角色 (Invoke-WebRequest -Uri http://169.254.169.254/latest/meta-data/iam/security-credentials/ -UseBasicParsing).Content # 直接测试S3对象拉取权限 Invoke-WebRequest -Uri "https://windowsartifcats.s3.us-east-1.amazonaws.com/jdk-11.0.9_windows-x64_bin.exe" -Method Head -UseBasicParsing
如果第二条命令仍返回403,可直接在IAM控制台的权限模拟器中,选择对应角色、S3服务、GetObject操作,填入对象ARN调试权限规则。
内容的提问来源于stack exchange,提问作者user11833133
相关产品推荐
相关产品推荐

