Amazon EC2 Container Service
开发人员指南 (API Version 2014-11-13)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

任务的 IAM 角色

借助 Amazon ECS 任务的 IAM 角色,您可以指定一个可由任务中的容器使用的 IAM 角色。应用程序必须使用 AWS 凭证签署其 AWS API 请求,并且此功能提供了一个管理凭证的策略以供应用程序使用,类似于 Amazon EC2 实例配置文件为 EC2 实例提供凭证的方式。您可以将 IAM 角色与 ECS 任务定义或 RunTask API 操作关联,而不是为容器创建和分配 AWS 凭证或使用 EC2 实例的角色。之后,任务的容器中的应用程序可以使用 AWS 开发工具包或 CLI 向授权的 AWS 服务发出 API 请求。

重要

在您的容器实例上运行的容器可以访问通过 Amazon EC2 实例元数据服务器提供给容器实例配置文件的凭证。建议您将容器实例角色中的权限限制在 Amazon ECS 容器实例 IAM 角色中显示的最低权限列表的范围内。

您可以通过在容器实例上运行以下 iptables 命令来阻止 docker0 桥上的容器访问提供给容器实例配置文件的凭证信息 (同时仍允许该任务角色提供的权限)。不过,在此规则生效的情况下,容器将无法查询实例元数据。请注意,此命令采用默认 Docker 桥配置,它不适用于使用 host 网络模式的容器。有关更多信息,请参阅网络模式

Copy
$ iptables --insert FORWARD 1 --in-interface docker+ --destination 169.254.169.254/32 --jump DROP

您在任务定义中定义要使用的 IAM 角色,也可以在通过 RunTask API 操作手动运行任务时使用 taskRoleArn 覆盖。Amazon ECS 代理接收启动具有包含角色凭证的其他字段的任务的负载消息。Amazon ECS 代理将任务的 UUID 设置为标识令牌并更新其内部凭证缓存,以便任务的标识令牌指向负载中接收的角色凭证。Amazon ECS 代理使用以下相关 URI 为属于此任务的所有容器填写 Env 对象(通过 docker inspect container_id 命令提供)中的 AWS_CONTAINER_CREDENTIALS_RELATIVE_URI 环境变量:/credential_provider_version/credentials?id=task_UUID

注意

为任务指定 IAM 角色时,该任务的容器中的 AWS CLI 或其他软件开发工具包只使用该任务角色提供的 AWS 凭证,它们不再从容器实例继承任何 IAM 权限。

在容器中,可使用以下命令查询凭证:

Copy
[ec2-user ~]$ curl 169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI

输出:

{
    "AccessKeyId": "ACCESS_KEY_ID",
    "Expiration": "EXPIRATION_DATE",
    "RoleArn": "TASK_ROLE_ARN",
    "SecretAccessKey": "SECRET_ACCESS_KEY",
    "Token": "SECURITY_TOKEN_STRING"
}

如果容器实例使用的容器代理的版本至少为 1.11.0,并且使用的 AWS CLI 或软件开发工具包版本受支持,则软件开发工具包客户端将发现 AWS_CONTAINER_CREDENTIALS_RELATIVE_URI 变量可用,它将使用提供的凭证来调用 AWS API。有关更多信息,请参阅 在容器实例上启用任务 IAM 角色使用支持的 AWS 开发工具包

当使用凭证提供程序时,请求将本地记录在以下位置的主机容器实例中:/var/log/ecs/audit.log.YYYY-MM-DD-HH。有关更多信息,请参阅 任务凭证审核日志的 IAM 角色

使用任务的 IAM 角色的好处

  • 凭证隔离:容器只能检索其所属的任务定义中定义的 IAM 角色的凭证;容器永远无法访问用于属于另一个任务的其他容器的凭证。

  • 授权:未经授权的容器无法访问为其他任务定义的 IAM 角色凭证。

  • 可审核性:可通过 CloudTrail 进行访问和事件日志记录以确保可追溯性审核。任务凭证具有连接到会话的 taskArn 的上下文,因此 CloudTrail 会显示哪个任务使用了哪个角色。

在容器实例上启用任务 IAM 角色

您的 Amazon ECS 容器实例需要至少为 1.11.0 版的容器代理才能启用任务 IAM 角色;但建议您使用最新的容器代理版本。有关检查您的代理版本并更新到最新版本的信息,请参阅更新 Amazon ECS 容器代理。如果您正在使用经 Amazon ECS 优化的 AMI,您的实例至少需要 1.11.0-1 版的 ecs-init 程序包。如果您的容器实例是从版本 2016.03.e 或更高版本启动的,这些实例将包含所需版本的容器代理和 ecs-init。有关更多信息,请参阅 经 Amazon ECS 优化的 AMI

如果您对容器实例使用的不是经 Amazon ECS 优化的 AMI,请务必将--net=host 选项添加到您的 docker run 命令,该命令会为您的所需配置启动代理和相应的代理配置变量 (有关更多信息,请参阅Amazon ECS 容器代理配置):

ECS_ENABLE_TASK_IAM_ROLE=true

为具有 bridgedefault 网络模式的容器启用任务的 IAM 角色。

ECS_ENABLE_TASK_IAM_ROLE_NETWORK_HOST=true

为具有 host 网络模式的容器启用任务的 IAM 角色。此变量仅在代理版本 1.12.0 和更高版本上受支持。

有关示例运行命令,请参阅手动更新 Amazon ECS 容器代理(适用于没有针对 Amazon ECS 优化过的 AMI)。您还需要在容器实例上设置以下联网命令,以便任务中的容器可以检索其 AWS 凭证:

Copy
[ec2-user ~]$ sysctl -w net.ipv4.conf.all.route_localnet=1 [ec2-user ~]$ iptables -t nat -A PREROUTING -p tcp -d 169.254.170.2 --dport 80 -j DNAT --to-destination 127.0.0.1:51679 [ec2-user ~]$ iptables -t nat -A OUTPUT -d 169.254.170.2 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 51679

为任务创建 IAM 角色和策略

您必须创建一个供任务使用的 IAM 策略,该策略指定您希望任务中的容器拥有的权限。您可通过多种方式创建新的 IAM 权限策略。您可以复制已具有您期望的一些功能的完整 AWS 托管策略,然后根据您的特定要求对其进行自定义。有关更多信息,请参阅 IAM 用户指南 中的创建新策略

此外,您必须先创建一个供任务使用的角色,然后才能在任务定义中指定该角色。您可以在 IAM 控制台中使用 Amazon EC2 Container Service Task Role 服务角色创建该角色。然后,可以将您特定的 IAM 策略附加到该角色,该策略为任务中的容器提供所需的权限。以下过程说明如何执行此操作。

如果您有多个需要 IAM 权限的任务定义或服务,则应考虑为每个特定的任务定义或服务创建一个具有所需最低权限的角色以便任务进行操作,以便您能够将为每个任务提供的访问权限降到最低。

为任务创建 IAM 策略

在此示例中,我们将创建一个策略以允许对 Amazon S3 存储桶进行只读访问。您可以将数据库凭证或其他机密信息存储在存储桶中,您的任务中的容器可以从存储桶中读取凭证并将它们加载到应用程序中。

  1. 通过以下网址打开 IAM 控制台:https://console.amazonaws.cn/iam/

  2. 在导航窗格中,选择 Policies,然后选择 Create Policy

  3. Create Policy 部分,选择 Select next to Create Your Own Policy

  4. Policy Name 字段中,键入您自己的唯一名称,如 AmazonECSTaskS3BucketPolicy

  5. Policy Document 字段中,粘贴要应用于任务的策略。以下示例授予对 my-task-secrets-bucket Amazon S3 存储桶的权限。您可以修改策略文档以满足您的特定需求。

    Copy
    { "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1465589882000", "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::my-task-secrets-bucket/*" ] } ] }
  6. 选择 Create Policy 以完成。

为任务创建 IAM 角色

  1. 通过以下网址打开 IAM 控制台:https://console.amazonaws.cn/iam/

  2. 在导航窗格中选择 Roles,然后选择 Create New Role

  3. Role Name 字段中,输入角色的名称。在此示例中,键入 AmazonECSTaskS3BucketRole 来命名角色,然后选择 Next Step

  4. Select Role Type 部分中,选择 Amazon EC2 Container Service Task Role 服务角色旁的 Select

  5. Attach Policy 部分中,选择要用于任务的策略(在此示例中为 AmazonECSTaskS3BucketPolicy),然后选择 Next Step

  6. 检查您的角色信息,然后选择 Create Role 以完成操作。

使用支持的 AWS 开发工具包

对任务的 IAM 角色的支持已于 2016 年 7 月 13 日添加到 AWS 开发工具包,因此您的任务中的容器必须使用该日期或之后创建的 AWS 开发工具包版本。Linux 分发版本的程序包管理器中包含的 AWS 开发工具包可能不是最新的,无法支持此功能。

为了确保您使用的是受支持的开发工具包,请在构建容器时按照适用于 Amazon Web Services 的工具中的针对您的首选开发工具包的安装说明操作。

以下 AWS 开发工具包版本和更高版本支持任务的 IAM 角色:

  • AWS CLI:1.10.47

  • C++:0.12.19

  • CoreCLR:3.2.6-beta

  • Go:1.2.5

  • Java:1.11.16

  • .NET:3.1.6

  • Node.js:2.4.7

  • PHP:3.18.28

  • Python (botocore):1.4.37

  • Python (Boto3):1.4.0

    注意

    botocore 模块提供 Boto3 的低级核心功能,而每个版本的 Boto3 均支持一系列 botocore 模块版本。对于任务的 IAM 角色的 Boto3 支持,您必须确保您的基础 botocore 模块至少为上面显示的最低版本。

  • Ruby:2.3.22

为任务指定 IAM 角色

创建一个角色并向该角色附加策略后,您可以运行带入该角色的任务。您可通过多种方式执行此操作:

  • 在任务定义中为任务指定 IAM 角色。您可以创建新的任务定义或现有任务定义的新版本并指定您之前创建的角色。如果您使用控制台创建任务定义,请在 Task Role 字段中选择 IAM 角色。如果您使用 AWS CLI 或开发工具包,请使用 taskRoleArn 参数指定任务角色 ARN。有关更多信息,请参阅创建任务定义

    注意

    如果您要在 Amazon ECS 服务中使用 IAM 任务角色,则需要此选项。

  • 在运行任务时指定 IAM 任务角色覆盖。您可以在运行任务时指定 IAM 任务角色覆盖。如果您使用控制台运行任务,请选择 Advanced Options,然后在 Task Role 字段中选择您的 IAM 角色。如果您使用 AWS CLI 或开发工具包,请使用 overrides JSON 对象中的 taskRoleArn 参数指定您的任务角色 ARN。有关更多信息,请参阅 正在运行的任务

注意

除了运行任务和服务所需的标准 Amazon ECS 权限外,IAM 用户还需要 iam:PassRole 权限,以使用 IAM 角色执行任务。