

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 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 Managed Policy Reference Guide* 中的 [AmazonECSTaskExecutionRolePolicy](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonECSTaskExecutionRolePolicy.html)。針對特殊使用案例，可能需要將內嵌政策新增至任務執行角色

Amazon ECS 主控台會建立任務執行角色。您可手動連接任務的受管 IAM 政策，讓 Amazon ECS 為日後推出的功能和增強功能新增許可。您可以使用 IAM 主控台搜尋功能來搜尋 `ecsTaskExecutionRole`，確認帳戶是否已具備任務執行角色。如需詳細資訊，請參閱 *IAM user guide* 中的 [IAM console search](https://docs.aws.amazon.com/IAM/latest/UserGuide/console_search.html)。

如果您以經身分驗證的使用者提取映像，受到 [Docker Hub usage and limits](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 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 的 IAM 主控台。

1. 在 IAM 主控台的導覽窗格中，選擇**角色**，然後選擇**建立角色**。

1. 對於 **Trusted entity type** (信任的實體類型)，請選擇 **AWS 服務**。

1. 在**服務或使用案例**欄位中選擇 **Elastic Container Service**，然後選擇 **Elastic Container Service 任務**使用案例。

1. 選擇**下一步**。

1. 在**新增許可**區段中，搜尋 **AmazonECSTaskExecutionRolePolicy** 並選取政策。

1. 選擇**下一步**。

1.  在**角色名稱**欄位中，輸入 **ecsTaskExecutionRole**。

1. 檢閱角色，然後選擇 **Create role** (建立角色)。

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

將所有 *user input* 取代為自己的資訊。

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 Resource Name (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 秘密，或者 Systems 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 全域條件內容金鑰](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 User Guide* 中的 [Policy actions for 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 儲存貯體。