EC2内Docker容器中CloudWatch Agent未使用IAM角色报错求助
在EC2实例内的Docker容器中部署CloudWatch Agent后,启动时日志文件/opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log出现以下错误:
E! Failed to get credential from session: SharedCredsLoad: failed to load shared credentials file
caused by: FailedRead: unable to open file
caused by: open /root/.aws/credentials: no such file or directory
手动创建该文件并添加访问密钥后日志功能恢复正常,但业务要求必须使用EC2绑定的IAM角色而非凭据文件(该EC2属于自动部署栈,不能泄露密钥)。已尝试为通过curl 169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI获取的任务执行角色添加AmazonSSMManagedInstanceCore、CloudWatchAgentAdminPolicy、CloudWatchAgentServerPolicy及包含ec2:DescribeTags权限的自定义策略,但问题仍未解决。
- 凭证优先级与配置缺失:CloudWatch Agent默认优先读取本地凭据文件,若未明确配置使用IAM角色,会在找不到本地文件时抛出错误,而非自动切换到实例/任务角色的凭证。
- 容器网络限制:容器可能无法访问EC2元数据服务(169.254.169.254)或容器凭证服务(169.254.170.2),导致无法获取角色凭证。
- 角色信任策略问题:EC2绑定的IAM角色或容器任务执行角色的信任策略未正确授权对应的服务(EC2/ECS)扮演该角色,导致凭证获取失败。
1. 强制CloudWatch Agent使用IAM角色
编辑CloudWatch Agent配置文件(通常路径为/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json),添加凭证配置段明确指定使用IAM角色:
{ "credentials": { "role_arn": "arn:aws:iam::[你的AWS账户ID]:role/[EC2绑定的IAM角色名称]" }, // 保留原有监控配置内容 }
若使用ECS任务角色,可通过环境变量传递凭证路径,无需硬编码ARN:
docker run -e AWS_CONTAINER_CREDENTIALS_RELATIVE_URI=$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI ...
2. 确保容器能访问元数据服务
根据容器部署方式调整网络配置:
- 若使用ECS,确保任务定义采用
awsvpc网络模式(默认支持元数据访问); - 手动启动Docker容器时,可使用主机网络模式:
docker run --network host ...
或添加元数据主机映射:
docker run --add-host=metadata.internal:169.254.169.254 ...
3. 通过环境变量引导SDK使用元数据
在容器启动时设置以下环境变量,强制AWS SDK跳过本地凭据文件,直接从元数据服务获取凭证:
docker run \ -e AWS_EC2_METADATA_DISABLED=false \ -e AWS_DEFAULT_REGION=[你的AWS区域] \ -e AWS_ACCESS_KEY_ID="" \ -e AWS_SECRET_ACCESS_KEY="" \ ...
4. 检查并修正IAM角色信任策略
- EC2实例角色:确保信任策略允许EC2服务扮演该角色:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "ec2.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
- ECS任务执行角色:确保信任策略允许ECS任务服务扮演该角色:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "ecs-tasks.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
内容的提问来源于stack exchange,提问作者user24787396

