EC2绑定S3全权限IAM角色后访问报错403及InvalidAccessKeyId如何解决
问题原因排查与解决方案
核心原因
出现上述两类报错最常见的原因按概率从高到低排序如下:
- AWS CLI凭证优先级高于EC2绑定的IAM角色:AWS CLI的凭证获取优先级为「命令行传入参数 > 系统环境变量 > ~/.aws目录下的凭证配置文件 > EC2实例绑定的IAM角色凭证」。如果你的EC2实例内配置了过期、无效的本地AccessKey,CLI会优先调用该无效凭证,不会使用绑定的IAM角色权限,直接触发InvalidAccessKeyId和403报错。
- IAM角色绑定未生效:Ansible playbook中绑定IAM角色的步骤存在配置错误,比如未正确创建/关联实例配置文件(Instance Profile,EC2绑定IAM角色的必需中间载体),或IAM角色的信任策略未允许EC2服务代入角色,导致实例无法获取角色权限。
- S3桶策略拦截:目标S3桶配置了自定义桶策略,限制了访问源IP、可访问的账号主体等,即使IAM角色拥有AmazonS3FullAccess权限,也会被桶策略拦截返回403。
解决步骤
- 第一步:清理本地无效凭证
先备份并删除实例内的AWS本地配置文件,避免无效凭证被优先调用:
再检查系统环境变量,清理残留的AWS密钥配置:mv ~/.aws ~/.aws.bak
完成后先执行# 检查是否存在AWS相关环境变量 env | grep AWS # 清理找到的密钥变量 unset AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKENaws s3 ls测试,看是否还存在InvalidAccessKeyId报错。 - 第二步:验证IAM角色绑定有效性
调用EC2实例元数据接口,确认角色已成功绑定:
正常会返回你绑定的IAM角色名称,若返回404则说明角色未绑定成功,需要回查Ansible playbook中实例配置文件的关联逻辑:EC2不能直接绑定IAM角色,必须先将角色挂载到实例配置文件,再将实例配置文件关联到EC2实例。curl http://169.254.169.254/latest/meta-data/iam/security-credentials/
同时确认IAM角色的信任策略包含EC2服务的代入权限,信任策略示例如下:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "ec2.amazonaws.com" }, "Action": "sts:AssumeRole" } ] } - 第三步:排查S3桶策略限制
如果完成前两步后仍返回403报错,登录AWS控制台检查目标S3桶的桶策略,确认没有限制当前EC2所属VPC、公网IP、IAM角色主体的访问规则,调整桶策略放开对应权限即可。
内容的提问来源于stack exchange,提问作者Prats
相关产品推荐
相关产品推荐

