跳至内容

如何在 Amazon ECS 中配置我的 IAM 任务角色以避免在进行 API 调用时出现"Access Denied"错误?

2 分钟阅读
0

我想在 Amazon Elastic Container Service (Amazon ECS) 中配置我的 AWS Identity and Access Management (IAM) 任务角色,以避免在进行 API 调用时收到"Access Denied"错误。

简短描述

为避免 Access Denied 错误,请在您的 Amazon ECS 任务定义中加入您的 IAM 角色。

您必须在 ECS 容器代理配置文件中启用 IAM 角色。而且,请确保您的 IAM 角色拥有所有必需的权限,以便您的任务可以使用该角色进行 API 调用。

**注意:**如果任务由于配置问题找不到 IAM 任务角色,则该任务使用 Amazon Elastic Compute Cloud (Amazon EC2) 实例角色。

解决方法

确认 ECS 容器代理正在运行

运行 docker ps 命令:

docker ps

**注意:**如果您重启实例,则 iptables 的规则将重置为默认值。为避免重置,请运行以下命令之一来保存规则。

Amazon ECS 优化的 Amazon Linux 亚马逊机器映像 (AMI):

sudo service iptables save

Amazon ECS 优化的 Amazon Linux 2 AMI:

sudo iptables-save | sudo tee /etc/sysconfig/iptables && sudo systemctl enable --now iptables

在 ECS 容器代理配置文件中启用您的 IAM 角色

完成以下步骤:

  1. 打开您的 /etc/ecs/ecs.config 文件。

  2. 要为具有桥接默认网络模式的容器中的任务启用 IAM 角色,请将 ECS_ENABLE_TASK_IAM_ROLE 设置为 true

    ECS_ENABLE_TASK_IAM_ROLE=true
  3. 要为具有主机网络模式的容器中的任务启用 IAM 角色,请将 ECS_ENABLE_TASK_IAM_ROLE_NETWORK_HOST 设置为 true

    ECS_ENABLE_TASK_IAM_ROLE_NETWORK_HOST=true
  4. 要更新配置文件,请运行以下命令之一来重启 ECS 容器代理:
    Amazon ECS 优化的 Amazon Linux AMI:

    sudo stop ecs
    sudo start ecs

    Amazon ECS 优化的 Amazon Linux 2 AMI:

    sudo systemctl restart ecs

更新 IAM 角色信任策略

要将您的 IAM 角色分配给您的 Amazon ECS 任务,请更新您的 IAM 角色信任策略

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "ecs-tasks.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

更新 ECS 容器代理的 HTTP_PROXY 设置

如果您在 Amazon ECS 容器代理配置中使用 HTTP_PROXY,请应用以下 NO_PROXY 设置

NO_PROXY=169.254.169.254,169.254.170.2,/var/run/docker.sock

使用最新的 AWS SDK 版本

在您的容器中运行的应用程序必须使用 2016 年或更高版本的 AWS SDK。要更新您的 AWS,请参阅 AWS SDK 和工具版本支持以及在 AWS 上构建的工具

为非 Amazon ECS 优化的 AMI 配置 iptables 规则

如果您使用非 Amazon ECS 优化的 AMI,请为 iptables 设置所需的规则

将环境变量设置为非 PID 1 进程可用

AWS_CONTAINER_CREDENTIALS_RELATIVE_URI 环境变量仅适用于容器内的 PID 1 进程。如果容器正在运行多个进程或初始化进程,则非 PID 1 进程无法使用环境变量。

要设置环境变量以使其可用于非 PID 1 进程,请将环境变量导出到 .profile 文件中。例如,运行以下命令以将环境变量导出到容器映像的 Dockerfile 中:

RUN echo 'export $(strings /proc/1/environ | grep AWS_CONTAINER_CREDENTIALS_RELATIVE_URI)' >> /root/.profile

**注意:**当您导出环境变量时,会依赖于字符串和 grep 命令

相关信息

Amazon EC2 Windows 实例附加配置

AWS 官方已更新 1 年前