EC2实例无法通过awscli与ecs-agent访问实例角色问题排查
以下是针对该问题的具体排查与解决方向:
环境变量干扰
AWS SDK、awscli会优先读取环境变量中的凭证信息,如果实例上存在AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY这类变量但值为空/无效,就会跳过元数据服务的读取流程。
执行命令检查环境变量:env | grep AWS_若发现无效变量,可修改
/etc/profile或相关启动脚本移除它们,重启实例后生效。AWS配置文件存在无效项
实例上的~/.aws/credentials或/etc/aws/credentials文件若存在空的access key/secret key条目,会导致SDK读取时出错,进而跳过元数据服务。
查看配置文件内容:cat ~/.aws/credentials cat /etc/aws/credentials若存在无效配置,删除对应条目或清空文件即可。
ECS Agent配置被修改
即便使用ECS优化AMI,若自定义了ECS Agent启动配置(比如设置ECS_DISABLE_IMDS=true环境变量),会导致Agent无法读取元数据。
检查ECS Agent的环境变量:docker inspect ecs-agent | grep -A 10 "Env"同时查看
/etc/ecs/ecs.config文件,确认无禁用IMDS的配置项。若存在,移除后重启ECS Agent:systemctl restart ecs实例元数据配置未生效
确认Terraform中EC2实例/启动模板的元数据配置确实关闭了IMDSv2强制要求,检查metadata_options块:metadata_options { http_tokens = "optional" http_put_response_hop_limit = 1 }若之前配置为
http_tokens = "required",ASG滚动更新后的新实例会沿用旧配置,需更新Terraform配置并重新部署。SELinux规则限制
虽然curl能访问元数据,但ECS Agent或awscli可能被SELinux规则阻止。检查审计日志中的拒绝记录:grep "denied" /var/log/audit/audit.log | grep imds若存在相关记录,可临时设置SELinux为permissive模式测试:
setenforce 0问题解决后,需调整SELinux规则或添加对应例外。
内容的提问来源于stack exchange,提问作者Pikaro

