You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 23:37:35