AWS技术求助:EC2 Windows实例无法访问已授权的S3桶
排查EC2 Windows实例通过IAM角色访问S3桶失败的问题
看起来你已经把IAM角色的基础配置做对了——能成功获取到实例元数据里的有效凭证,说明角色和EC2实例的关联是正常的!那访问S3桶文件失败大概率是其他环节出了问题,我给你列几个常见的排查方向,你一步步来试试:
1. 检查S3桶的权限设置(桶策略+ACL)
虽然你的EC2角色附带着S3FullAccess权限,但如果目标S3桶本身的桶策略设置了拒绝规则(比如明确阻止了该角色的请求),或者**访问控制列表(ACL)**没有给对应实体开放读取权限,那还是会触发访问拒绝。
- 登录AWS控制台找到目标桶,进入「权限」标签页:
- 查看桶策略,确认没有类似
"Effect": "Deny"且针对该角色的语句; - 检查ACL,确保桶的所有者或者你的IAM角色对应的实体拥有
读取权限。
- 查看桶策略,确认没有类似
2. 确认你使用的访问方式正确(Windows环境重点)
如果你是直接用EC2实例的浏览器访问S3对象的URL(比如https://your-bucket.s3.amazonaws.com/your-file.txt),这种方式默认是匿名访问,不会自动调用EC2实例的IAM角色凭证!哪怕角色有权限,私有桶的文件也会直接拒绝访问。
正确的访问方式应该用AWS官方工具:
- 安装AWS CLI for Windows,然后在PowerShell里直接运行命令:
CLI会自动从实例元数据获取凭证,不需要手动配置AccessKey和SecretKey。# 列出桶内文件 aws s3 ls s3://your-bucket-name # 下载文件到本地 aws s3 cp s3://your-bucket-name/your-file.txt C:\Local\Save\Path\ - 如果是代码开发(比如PowerShell脚本、Python等),一定要用AWS SDK(比如AWS Tools for PowerShell、boto3),SDK会自动获取角色凭证,不要手动拼接签名或者用匿名请求。
3. 验证凭证有效性与权限范围
- 先确认你获取的凭证在有效期内:你拿到的元数据里有
Expiration字段,要是当前时间已经超过这个时间,重新请求元数据地址就能拿到新的有效凭证。 - 可以用AWS CLI模拟角色权限,确认是否真的能访问目标文件:
如果返回的aws iam simulate-principal-policy --policy-source-arn arn:aws:iam::你的AWS账号ID:role/EC2-S3-access --action-names s3:GetObject --resource-arns arn:aws:s3:::your-bucket-name/your-file.txtEvaluationResult是Allowed,说明权限本身没问题,问题出在其他环节。
4. 检查EC2实例的网络连通性
- 先测试实例能不能连接到S3服务:在PowerShell里运行
Test-NetConnection s3.amazonaws.com -Port 443,如果显示无法连通,可能是:- EC2实例的安全组没有开放出站的HTTPS(443端口)流量;
- VPC的网络访问控制列表(NACL)阻止了出站请求;
- 如果实例是私有子网的无公网IP实例,需要配置VPC的S3网关端点,否则无法通过私网访问S3。
5. 收集具体错误信息定位问题
不管是用CLI还是代码访问,把完整的错误信息记录下来(比如AccessDenied、NoSuchBucket、NetworkError等):
- 要是
AccessDenied:优先排查桶策略、ACL或者角色权限的冲突; - 要是
NoSuchBucket:检查桶名是否拼写错误,或者是否和实例不在同一个AWS区域; - 要是网络类错误:重点排查安全组、NACL或者S3端点配置。
内容的提问来源于stack exchange,提问作者Molay
相关产品推荐
相关产品推荐

