

# Amazon ECS 任务执行 IAM 角色
<a name="task_execution_IAM_role"></a>

任务执行角色的 ，该角色授予 Amazon ECS 容器和 Fargate 代理代表您进行 AWS API 调用的权限。任务执行 IAM 角色是必需的，具体取决于任务的要求。您可以将多个任务执行角色用于与您的账户关联的服务不同目的。

**注意**  
Amazon ECS 会定期向实例上运行的代理发送角色的临时凭证，来向代理提供这些权限，但任务中的容器无法直接获得这些权限。有关容器内的应用程序代码运行所需的 IAM 权限，请参阅[Amazon ECS 任务 IAM 角色](task-iam-roles.md)。

以下是任务执行 IAM 角色的常见使用案例：
+ 您的任务托管在 AWS Fargate、Amazon ECS 托管实例或外部实例上：
  + 从 Amazon ECR 私有存储库中提取容器映像。
  + 在与运行任务的账户不同的账户中，从 Amazon ECR 私有存储库中提取容器映像。
  + 使用 `awslogs` 日志驱动程序将容器日志发送到 CloudWatch Logs。有关更多信息，请参阅 [将 Amazon ECS 日志发送到 CloudWatch](using_awslogs.md)。
+ 您的任务托管在 AWS Fargate 或 Amazon EC2 实例上且：
  + 使用私有注册表身份验证。有关更多信息，请参阅 [私有注册表身份验证权限](#task-execution-private-auth)。
  + 使用运行时监控。
  + 任务定义使用 Secrets Manager 密钥或 AWS Systems Manager Parameter Store 参数引用敏感数据。有关更多信息，请参阅 [Secrets Manager 或 Systems Manager 权限](#task-execution-secrets)。

**注意**  
该任务执行角色由 Amazon ECS 容器代理版本 1.16.0 和更高版本支持。

 Amazon ECS 提供了名为 `AmazonECSTaskExecutionRolePolicy` 的托管策略，该策略包含上述常见使用案例所需的权限。有关更多信息，请参阅《AWS 托管式策略参考指南》中的 [AmazonECSTaskExecutionRolePolicy](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonECSTaskExecutionRolePolicy.html)**。对于特殊应用场景，可能需要向任务执行角色添加内联策略。

Amazon ECS 控制台将会创建一个任务执行角色。您可以手动为任务附加该托管式 IAM 策略，以便 Amazon ECS 能够在引入未来功能和增强功能时添加相关权限。您可以使用 IAM 控制台搜索来搜索 `ecsTaskExecutionRole`，并查看您的账户是否已有该任务执行角色。有关更多信息，请参阅《IAM 用户指南》**中的 [IAM 控制台搜索](https://docs.aws.amazon.com/IAM/latest/UserGuide/console_search.html)。

如果以经过身份验证的用户身份拉取映像，则不太可能受到 [Docker Hub 使用和限制](https://docs.docker.com/docker-hub/usage/)变化的影响。有关更多信息，请参阅[容器实例的私有注册表身份验证](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/private-auth-container-instances.html)。

通过使用 Amazon ECR 和 Amazon ECR Public，您可以避开 Docker 施加的限制。如果您从 Amazon ECR 提取映像，这还有助于缩短网络提取时间，并减少流量离开您的 VPC 时的数据传输变化。

使用 Fargate 时，您必须使用 `repositoryCredentials` 向私有映像注册表进行身份验证。无法为 Fargate 上托管的任务设置 Amazon ECS 容器代理环境变量 `ECS_ENGINE_AUTH_TYPE` 或 `ECS_ENGINE_AUTH_DATA` 或修改 `ecs.config` 文件。有关更多信息，请参阅[任务的私有注册表身份验证](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/private-auth.html)。

## 创建任务执行 角色
<a name="create-task-execution-role"></a>

如果您的账户尚未具有任务执行角色，请使用以下步骤创建角色。

------
#### [ AWS 管理控制台 ]

**为 Elastic Container Service 创建服务角色（IAM 控制台）**

1. 登录 AWS 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在 IAM 控制台的导航窗格中，选择**角色**，然后选择**创建角色**。

1. 对于 **Trusted entity type**（可信实体类型），选择 **AWS 服务**。

1. 对于**服务或使用案例**，选择 **Elastic Container Service**，然后选择 **Elastic Container Service 任务**使用案例。

1. 选择**下一步**。

1. 在**添加权限**部分中，搜索 **AmazonECSTaskExecutionRolePolicy**，然后选择该策略。

1. 选择**下一步**。

1.  对于**角色名称**，输入 **ecsTaskExecutionRole**。

1. 检查该角色，然后选择**创建角色**。

------
#### [ AWS CLI ]

将所有*用户输入*替换为您自己的信息。

1. 创建一个名为 `ecs-tasks-trust-policy.json` 的文件，其中包含要用于 IAM 角色的信任策略。该文件应包含以下内容：

------
#### [ JSON ]

****  

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

------

1. 使用上一步中创建的信任策略创建命名为 `ecsTaskExecutionRole` 的 IAM 角色。

   ```
   aws iam create-role \
         --role-name ecsTaskExecutionRole \
         --assume-role-policy-document file://ecs-tasks-trust-policy.json
   ```

1. 将 AWS 托管 `AmazonECSTaskExecutionRolePolicy` 策略 附加到 `ecsTaskExecutionRole` 角色。

   ```
   aws iam attach-role-policy \
         --role-name ecsTaskExecutionRole \
         --policy-arn arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy
   ```

------

创建该角色后，为该角色添加以下功能的附加权限。


|  功能  |  其他权限  | 
| --- | --- | 
|  使用 Secrets Manager 凭证从位于 AWS 之外的私有注册表（例如 Docker Hub、Quay.io 或您自己的私有注册表）拉取容器映像  |  [私有注册表身份验证权限](#task-execution-private-auth)  | 
| 使用 Systems Manager 或 Secrets Manager 传递敏感数据 | [Secrets Manager 或 Systems Manager 权限](#task-execution-secrets) | 
| 让 Fargate 任务通过接口端点拉取 Amazon ECR 映像 | [Fargate 任务通过接口端点拉取 Amazon ECR 映像的权限](#task-execution-ecr-conditionkeys) | 
| 在 Amazon S3 存储桶中托管配置文件 | [Amazon S3 存储桶文件存储权限](#s3-required) | 
| 配置 Container Insights 以查看 Amazon ECS 生命周期事件 |  [在 Container Insights 中启用 Amazon ECS 生命周期事件所需的权限](console-permissions.md#required-permissions-configure)  | 
| 在 Container Insights 中查看 Amazon ECS 生命周期事件 |  [在 Container Insights 中查看 Amazon ECS 生命周期事件所需的权限](console-permissions.md#required-permissions-view)  | 

## 私有注册表身份验证权限
<a name="task-execution-private-auth"></a>

借助私有注册表身份验证，您的 Amazon ECS 任务将可以从位于 AWS 之外且需要身份验证凭证的私有注册表（例如 Docker Hub、Quay.io 或您自己的私有注册表）拉取容器映像。此功能使用 Secrets Manager 来安全地存储注册表凭证，然后使用 `repositoryCredentials` 参数在任务定义中引用这些凭证。

有关配置私有注册表身份验证的更多信息，请参阅[在 Amazon ECS 中使用非 AWS 容器映像](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/private-auth.html)。

要允许访问包含您的私有注册表凭证的密钥，请将以下权限作为内联策略添加到任务执行角色中。有关更多信息，请参阅[添加和删除 IAM 策略。](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html)
+ `secretsmanager:GetSecretValue`：从 Secrets Manager 检索私有注册表凭证时为必需。
+ `kms:Decrypt`：仅当您的密钥使用自定义 KMS 密钥而不是默认密钥时才需要。您的自定义密钥的 Amazon 资源名称（ARN）必须添加为资源。

下面是添加所需权限的示例内联策略。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt",
                "secretsmanager:GetSecretValue"
            ],
            "Resource": [
                "arn:aws:secretsmanager:us-east-1:111122223333:secret:secret_name",
                "arn:aws:kms:us-east-1:111122223333:key/key_id"
            ]
        }
    ]
}
```

------

## Secrets Manager 或 Systems Manager 权限
<a name="task-execution-secrets"></a>

允许容器代理拉取所需 AWS Systems Manager 或 Secrets Manager 资源的权限。有关更多信息，请参阅 [将敏感数据传递给 Amazon ECS 容器](specifying-sensitive-data.md)。

**使用 Secrets Manager**

要提供对您创建的 Secrets Manager 密钥的访问权限，请将以下权限手动添加到任务执行角色。有关如何管理权限的信息，请参阅**《IAM 用户指南》中的[添加和删除 IAM 身份权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html)。
+ `secretsmanager:GetSecretValue` – 在引用 Secrets Manager 密钥时是必需的。添加从 Secrets Manager 中检索密钥的权限。

以下示例策略添加了所需的权限。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "secretsmanager:GetSecretValue"
      ],
      "Resource": [
        "arn:aws:secretsmanager:us-east-1:111122223333:secret:secret_name"
      ]
    }
  ]
}
```

------

**使用 Systems Manager**

**重要**  
对于使用 EC2 启动类型的任务，必须使用 ECS 代理配置变量 `ECS_ENABLE_AWSLOGS_EXECUTIONROLE_OVERRIDE=true` 才能使用此功能。您可以在创建容器实例的过程中将其添加到 `./etc/ecs/ecs.config` 文件中，也可以将其添加到现有实例中，然后重新启动 ECS 代理。有关更多信息，请参阅 [Amazon ECS 容器代理配置](ecs-agent-config.md)。

要提供对您创建的 Systems Manager Parameter Store 参数的访问权限，请将以下权限作为策略手动添加到任务执行角色。有关如何管理权限的信息，请参阅**《IAM 用户指南》中的[添加和删除 IAM 身份权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html)。
+ `ssm:GetParameters` — 当您在任务定义中引用 Systems Manager Parameter Store 参数时是必需的。添加检索 Systems Manager 参数的权限。
+ `secretsmanager:GetSecretValue` — 当您直接引用 Secrets Manager 密钥或者您的 System Manager Parameter Store 参数在任务定义中引用 Secrets Manager 密钥时，这是必需的。添加从 Secrets Manager 中检索密钥的权限。
+ `kms:Decrypt` — 仅当您的密钥使用客户托管键而不是默认键时才需要。您的自定义密钥的 ARN 应添加为资源。添加解密客户托管密钥的权限。

以下示例策略添加了所需的权限：

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ssm:GetParameters",
        "secretsmanager:GetSecretValue",
        "kms:Decrypt"
      ],
      "Resource": [
        "arn:aws:ssm:us-east-1:111122223333:parameter/parameter_name",
        "arn:aws:secretsmanager:us-east-1:111122223333:secret:secret_name",
        "arn:aws:kms:us-east-1:111122223333:key/key_id"
      ]
    }
  ]
}
```

------

## Fargate 任务通过接口端点拉取 Amazon ECR 映像的权限
<a name="task-execution-ecr-conditionkeys"></a>

在 Amazon ECR 配置为使用接口 VPC 端点的情况下，当启动使用 Fargate 的任务（该任务从 Amazon ECR 中拉取映像）时，可以限制任务对特定 VPC 或 VPC 端点的访问。可通过为要使用 IAM 条件键的任务创建任务执行角色来做到这一点。

使用以下 IAM 全局条件键来限制对特定 VPC 或 VPC 端点的访问。有关更多信息，请参阅 [AWS Global Condition Context Keys](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html)。
+ `aws:SourceVpc`：限制对特定 VPC 的访问。可以将 VPC 限制为托管任务和端点的 VPC。
+ `aws:SourceVpce`：限制对特定 VPC 端点的访问。

以下任务执行角色策略提供了一个添加条件键的示例：

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "ecr:GetAuthorizationToken",
                    "logs:CreateLogStream",
                    "logs:PutLogEvents"
                ],
                "Resource": "*"
            },
            {
                "Effect": "Allow",
                "Action": [
                    "ecr:BatchCheckLayerAvailability",
                    "ecr:GetDownloadUrlForLayer",
                    "ecr:BatchGetImage"
                ],
                "Resource": "arn:aws:ecr:*:*:repository/*",
                "Condition": {
                    "StringEquals": {
                            "aws:sourceVpce": "vpce-0123456789abcdef0"
                    }
                }
            }
    ]
}
```

------

## Amazon ECR 权限
<a name="task-execution-ecr-permissions"></a>

当您需要从 Amazon ECR 私有存储库提取容器映像时，将需要以下权限。任务执行角色应具有这些权限，以允许 Amazon ECS 容器和 Fargate 代理代表您提取容器映像。对于基本 ECS 实施，应将这些权限添加到任务执行角色，而不是任务 IAM 角色。

Amazon ECS 任务执行角色托管策略（`AmazonECSTaskExecutionRolePolicy`）包含从 Amazon ECR 提取映像所需的权限。如果您使用托管策略，则无需单独添加这些权限。

如果您要创建自定义策略，则请包含以下权限以允许从 Amazon ECR 提取映像：

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecr:BatchGetImage",
                "ecr:GetDownloadUrlForLayer",
                "ecr:GetAuthorizationToken"
            ],
            "Resource": "*"
        }
    ]
}
```

------

请注意，如果您的应用程序代码需要直接与 Amazon ECR API 交互，则这些权限与任务 IAM 角色中可能需要的权限不同。有关 Amazon ECR 的任务 IAM 角色权限的信息，请参阅 [Amazon ECR 权限](task-iam-roles.md#ecr-required-iam-permissions)。

## Amazon S3 存储桶文件存储权限
<a name="s3-required"></a>

指定某个在 Amazon S3 中托管的配置文件时，任务执行角色必须包含对此配置文件的 `s3:GetObject` 权限以及对此文件所在 Amazon S3 存储桶的 `s3:GetBucketLocation` 权限。有关更多信息，请参阅《Amazon Simple Storage Service 用户指南》**中的 [Amazon S3 的策略操作](https://docs.aws.amazon.com/AmazonS3/latest/userguide/security_iam_service-with-iam.html#security_iam_service-with-iam-id-based-policies-actions)。

以下示例策略添加了从 Amazon S3 中检索文件所需的权限。指定 Amazon S3 存储桶的名称和配置文件名称。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject"
      ],
      "Resource": [
        "arn:aws:s3:::amzn-s3-demo-bucket/folder_name/config_file_name"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetBucketLocation"
      ],
      "Resource": [
        "arn:aws:s3:::amzn-s3-demo-bucket"
      ]
    }
  ]
}
```

------

### 重要的安全注意事项
<a name="s3-required-considerations"></a>

 使用与 Amazon S3 存储桶集成的 Amazon ECS 功能时，请实施存储桶所有权验证，以防止存储桶接管攻击。如果未进行适当验证，而恶意行为者删除并使用相同名称重新创建了 Amazon S3 存储桶，则您的任务可能会在不知情的情况下加载恶意配置或将敏感数据发送到攻击者控制的存储桶。

**建议的 IAM 策略条件：**

```
               "Condition": {
                 "StringEquals": {
                   "aws:ResourceAccount": "TRUSTED-ACCOUNT-ID"
                 }
               }
```

将 *TRUSTED-ACCOUNT-ID* 替换为拥有 S3 存储桶的 AWS 账户 ID。

此条件确保您的任务执行角色只能访问指定的受信任账户拥有的 Amazon S3 存储桶。