

# Amazon ECS 容器实例 IAM 角色
<a name="instance_IAM_role"></a>

Amazon ECS 容器实例（包括 Amazon EC2 和外部实例）运行 Amazon ECS 容器代理，并需要服务的 IAM 角色，以便了解属于您的代理。在启动容器实例并将其注册到集群之前，必须为容器实例创建 IAM 角色以供使用。该角色在您用于登录控制台或运行 AWS CLI 命令的账户中创建。

**重要**  
如果要将外部实例注册到集群，则您使用的 IAM 角色也需要 Systems Manager 权限。有关更多信息，请参阅 [Amazon ECS Anywhere IAM 角色](iam-role-ecsanywhere.md)。

Amazon ECS 提供 `AmazonEC2ContainerServiceforEC2Role` 托管 IAM 策略，该策略包含使用完整 Amazon ECS 功能集所需的权限。此托管策略可以附加到 IAM 角色并与您的容器实例相关联。或者，您可以在创建要使用的自定义策略时使用托管策略作为指导。容器实例角色为 Amazon ECS 容器代理和 Docker 进程守护程序提供代表您调用 AWS API 所需的权限。有关托管策略的更多信息，请参阅 [AmazonEC2ContainerServiceforEC2Role](security-iam-awsmanpol.md#security-iam-awsmanpol-AmazonEC2ContainerServiceforEC2Role)。

## 创建容器实例角色
<a name="instance-iam-role-create"></a>

**重要**  
如果要将外部实例注册到集群，请参阅 [Amazon ECS Anywhere IAM 角色](iam-role-ecsanywhere.md)。

您可以手动为容器实例创建角色和附加托管 IAM 策略，以便 Amazon ECS 能够在引入未来功能和增强功能时添加这些功能的权限。如果需要，可使用以下过程附加托管 IAM 策略。

------
#### [ 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 的 EC2 角色**使用案例。

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

1. 在**权限策略**部分，确认是否选择了 **AmazonEC2ContainerServiceforEC2Role** 策略。
**重要**  
**AmazonEC2ContainerServiceforEC2Role** 托管策略应附加到容器实例 IAM 角色，否则使用 AWS 管理控制台 创建集群时将收到错误。

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

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

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

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

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

1. 创建以下内容的名为 `instance-role-trust-policy.json` 的文件。  
****  

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

1. 使用以下命令通过信任策略文档创建实例 IAM 角色。

   ```
   aws iam create-role \
       --role-name ecsInstanceRole \
       --assume-role-policy-document file://instance-role-trust-policy.json
   ```

1. 使用 [create-instance-profile](https://docs.aws.amazon.com/cli/latest/reference/iam/create-instance-profile.html) 命令创建名为 `ecsInstanceRole-profile` 的实例配置文件。

   ```
   aws iam create-instance-profile --instance-profile-name ecsInstanceRole-profile
   ```

   响应示例

   ```
   {
       "InstanceProfile": {
           "InstanceProfileId": "AIPAJTLBPJLEGREXAMPLE",
           "Roles": [],
           "CreateDate": "2022-04-12T23:53:34.093Z",
           "InstanceProfileName": "ecsInstanceRole-profile",
           "Path": "/",
           "Arn": "arn:aws:iam::123456789012:instance-profile/ecsInstanceRole-profile"
       }
   }
   ```

1. 将 `ecsInstanceRole` 角色添加到 `ecsInstanceRole-profile` 实例配置文件。

   ```
   aws iam add-role-to-instance-profile \
       --instance-profile-name ecsInstanceRole-profile \
       --role-name ecsInstanceRole
   ```

1. 使用以下命令以将 `AmazonEC2ContainerServiceForEC2Role` 托管策略附加到角色。

   ```
   aws iam attach-role-policy \
       --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceforEC2Role \
       --role-name ecsInstanceRole
   ```

------

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


|  功能  |  其他权限  | 
| --- | --- | 
|  Amazon ECR 具有容器映像  |  [Amazon ECR 权限](#container-instance-role-ecr)  | 
| 使用 CloudWatch Logs 监控容器实例 | [监控容器实例的权限](#cwl_iam_policy) | 
| 在 Amazon S3 存储桶中托管配置文件 | [Amazon S3 只读访问权限](#container-instance-role-s3) | 

## Amazon ECR 权限
<a name="container-instance-role-ecr"></a>

用于容器实例的 Amazon ECS 容器实例角色必须具有以下有关 Amazon ECR 的 IAM 策略权限。

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

****  

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

------

如果您对容器实例使用 `AmazonEC2ContainerServiceforEC2Role` 托管策略，则您的角色将具有适当的权限。

## 设置 awsvpcTrunking 账户设置所需的权限
<a name="container-instance-role-awsvpcTrunking-setting"></a>

Amazon ECS 支持使用受支持的 Amazon EC2 实例类型启动已增加 ENI 密度的容器实例。使用此功能时，建议您创建两个容器实例角色。为一个角色启用 `awsvpcTrunking` 账户设置，并将该角色用于需要 ENI 中继的任务。有关 `awsvpcTrunking` 账户设置的信息，请参阅[通过账户设置访问 Amazon ECS 功能](ecs-account-settings.md)。

用于容器实例的容器实例角色必须具有以下 IAM 策略权限才能设置账户设置 

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecs:ListAccountSettings", 
                "ecs:ListAttributes", 
                "ecs:PutAccountSetting" 
            ],
            "Resource": "*"
        }
    ]
}
```

------

要使用容器实例角色，请向实例用户数据添加以下内容：

```
#!/bin/bash
aws ecs put-account-setting --name awsvpcTrunking --value enabled --region region
ECS_CLUSTER=MyCluster>> /etc/ecs/ecs.config
EOF
```

有关将用户数据添加到 EC2 实例的更多信息，请参阅《Amazon EC2 用户指南》**中的[启动时在 Linux 实例上运行命令](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html)。

## Amazon S3 只读访问权限
<a name="container-instance-role-s3"></a>

将配置信息存储在 Amazon S3 中的私有存储桶中并向您的容器实例 IAM 角色授予只读访问权限，这是一个允许在启动时配置容器实例的安全方便的方法。您可以将 `ecs.config` 文件的副本存储在私有存储桶中，使用 AWS CLI Amazon EC2 用户数据安装 ，然后在实例启动时将配置信息复制到 `/etc/ecs/ecs.config`。

有关创建 `ecs.config` 文件，将该文件存储在 Amazon S3, 中并使用此配置启动实例的更多信息，请参阅 [将 Amazon ECS 容器实例配置存储在 Amazon S3 中](ecs-config-s3.md)。

可以使用以下 AWS CLI 命令允许 Amazon S3 对容器实例角色的只读访问。将 *ecsInstanceRole* 替换为您创建的角色的名称。

```
aws iam attach-role-policy \
      --role-name ecsInstanceRole \
      --policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess
```

您也可以使用 IAM 控制台将 Amazon S3 只读访问权限（`AmazonS3ReadOnlyAccess`）添加到您的角色。有关更多信息，请参阅《AWS Identity and Access Management 用户指南》**中的[更新角色权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_update-role-permissions.html)。

## 监控容器实例的权限
<a name="cwl_iam_policy"></a>

在您的容器实例可以将日志数据发送到 CloudWatch Logs 之前，您必须创建一个 IAM 策略，进而允许 Amazon ECS 代理将客户的应用程序日志写入 CloudWatch（通常通过 `awslogs` 驱动程序处理）。创建策略后，将策略附加到 `ecsInstanceRole`。

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

**使用 JSON 策略编辑器创建策略**

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

1. 在左侧的导航窗格中，选择**策略**。

   如果这是您首次选择**策略**，则会显示**欢迎访问托管式策略**页面。选择**开始使用**。

1. 在页面的顶部，选择**创建策略**。

1. 在**策略编辑器**部分，选择 **JSON** 选项。

1. 输入以下 JSON 策略文档：

   ```
   {
       "Version": "2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "logs:CreateLogGroup",
                   "logs:CreateLogStream",
                   "logs:PutLogEvents",
                   "logs:DescribeLogStreams"
               ],
               "Resource": ["arn:aws:logs:*:*:*"]
           }
       ]
   }
   ```

1. 选择**下一步**。
**注意**  
您可以随时在**可视化**和 **JSON** 编辑器选项卡之间切换。不过，如果您进行更改或在**可视化**编辑器中选择**下一步**，IAM 可能会调整策略结构以针对可视化编辑器进行优化。有关更多信息，请参阅*《IAM 用户指南》*中的[调整策略结构](https://docs.aws.amazon.com/IAM/latest/UserGuide/troubleshoot_policies.html#troubleshoot_viseditor-restructure)。

1. 在**查看并创建**页面上，为您要创建的策略输入**策略名称**和**描述**（可选）。查看**此策略中定义的权限**以查看策略授予的权限。

1. 选择**创建策略**可保存新策略。

创建策略后，将策略附加到容器实例角色。有关如何将策略附加到角色的信息，请参阅《AWS Identity and Access Management 用户指南》中的[更新角色权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_update-role-permissions.html)**。

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

1. 使用以下内容创建名为 `instance-cw-logs.json` 的文件。  
****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "logs:CreateLogGroup",
                   "logs:CreateLogStream",
                   "logs:PutLogEvents",
                   "logs:DescribeLogStreams"
               ],
               "Resource": ["arn:aws:logs:*:*:*"]
           }
       ]
   }
   ```

1. 使用以下命令通过 JSON 策略文档文件创建 IAM 策略。

   ```
   aws iam create-policy \
         --policy-name cwlogspolicy \
         --policy-document file://instance-cw-logs.json
   ```

1. 使用以下命令检索您创建的 IAM 策略的 ARN。将 *cwlogspolicy* 替换为您创建的策略的名称。

   ```
   aws iam list-policies --scope Local --query 'Policies[?PolicyName==`cwlogspolicy`].Arn'
   ```

1. 使用以下命令通过策略 ARN 将策略附加到容器实例 IAM 角色。

   ```
   aws iam attach-role-policy \
         --role-name ecsInstanceRole \
         --policy-arn arn:aws:iam:111122223333:aws:policy/cwlogspolicy
   ```

------