已配置IAM角色仍无法让EC2实例访问S3 Bucket,求排查
以下是几个常见的排查方向:
桶策略冲突
S3的权限判定遵循IAM权限与桶策略的交集规则,且拒绝优先级高于允许。即便你的IAM角色配置了访问权限,若桶策略中存在Deny语句(例如拒绝所有未明确授权的访问),或是未包含允许该IAM角色访问的规则,都会触发403错误。
排查方式:进入S3控制台目标桶的「权限」标签,查看「桶策略」内容,检查是否存在与当前IAM角色冲突的规则,必要时添加允许该角色ARN访问的授权语句。ARN或桶名拼写错误
核对IAM角色策略中的桶ARN是否与实际桶名完全匹配:- S3桶名区分大小写,比如实际桶名为
MyProductionBucket,策略中写myproductionbucket会导致匹配失败 - 确认ARN格式正确:桶级ARN为
arn:aws:s3:::实际桶名,对象级ARN为arn:aws:s3:::实际桶名/*
- S3桶名区分大小写,比如实际桶名为
对象ACL限制
若桶内对象由其他AWS账户上传,或是对象ACL设置为仅允许所有者访问,即便IAM角色拥有桶级权限,也无法访问这类对象。
排查方式:在S3控制台查看目标对象的「权限」-「访问控制列表(ACL)」,确认当前AWS账户或IAM角色是否被授予读取权限;必要时可在IAM角色策略中添加s3:GetObjectAcl权限辅助排查,或直接修改对象ACL。EC2实例无法获取IAM角色凭证
EC2实例依赖实例元数据服务(IMDS)获取IAM角色的临时访问凭证,若IMDS异常,实例将无法获取有效权限。
排查方式:在EC2实例上执行以下命令验证:# 检查是否能获取关联的IAM角色名称 curl http://169.254.169.254/latest/meta-data/iam/security-credentials/ # 若返回角色名称,进一步获取凭证详情 curl http://169.254.169.254/latest/meta-data/iam/security-credentials/你的角色名称同时确认实例是否启用了IMDSv2,若是则需先获取会话令牌再请求元数据。
权限边界或会话策略限制
若IAM角色设置了权限边界,或是关联角色时应用了会话策略,这些规则可能会缩小角色的实际权限范围,导致原本允许的S3操作被禁止。
排查方式:进入IAM控制台的目标角色页面,查看「权限边界」和「信任关系」中的会话策略,确认未限制s3:ListBucket和s3:GetObject操作。验证当前凭证权限
在EC2实例上通过AWS CLI执行以下命令,确认当前凭证是否拥有对应权限:# 验证桶列表权限 aws s3 ls s3://mybucketname # 验证对象读取权限 aws s3 cp s3://mybucketname/某个测试对象 .若命令报错,可添加
--debug参数查看详细的权限判定日志。
内容的提问来源于stack exchange,提问作者Ben

