通过EC2实例IP而非AssumeRole访问S3遇权限拒绝问题求助
解决EC2实例通过IP访问S3存储桶的403权限问题
问题背景
我尝试让EC2实例通过IP而非IAM角色访问S3存储桶,已在存储桶策略中添加EC2的公网IP和内网IP,但通过纯HTTP地址(如http://s3.amazonaws.com/test-bucket1/somefile.txt)访问时仍返回AccessDenied错误。使用IAM角色和AWS CLI可正常访问,非云服务器(如个人笔记本)添加公网IP后也能正常访问,仅EC2实例按此配置无法访问。查看访问日志发现,EC2的内网IP被记录且返回403。
当前存储桶策略片段:
{ "Sid": "Statement1", "Effect": "Allow", "Principal": "*", "Action": "s3:*", "Resource": "arn:aws:s3:::test-bucket1/*", "Condition": { "IpAddress": { "aws:SourceIp": [ "EC2-public-ip-address/32", "EC2-private-ip-address/32" ] } } }
排查与解决步骤
检查VPC端点配置:
如果EC2所在VPC配置了S3网关端点,EC2访问S3会走内网路由,此时AWS识别的源IP是EC2的内网IP。需确认:- VPC端点的端点策略未添加比桶策略更严格的限制(比如拒绝该IP访问),可暂时将端点策略设为允许所有访问来测试。
- 确认VPC路由表中,S3的路由条目指向网关端点而非互联网网关(这是日志显示内网IP的原因)。
强制匿名访问请求:
EC2实例若关联了IAM角色,部分工具(如curl)可能自动携带角色的临时凭证,此时AWS会优先用IAM权限评估,而非桶策略的IP限制。可通过以下命令强制发送匿名请求:curl -H "Authorization:" http://s3.amazonaws.com/test-bucket1/somefile.txt验证IP与策略格式:
确认桶策略中的公网/内网IP为EC2实例的实际IP,格式为x.x.x.x/32,无网段或掩码错误。排查冲突权限:
检查是否存在其他拒绝类的桶策略、账户级IAM策略,AWS权限评估遵循拒绝优先原则,任何匹配的拒绝策略都会导致403。
内容的提问来源于stack exchange,提问作者HiDoYa
相关产品推荐
相关产品推荐

