

# Amazon ECS タスク実行IAM ロール
<a name="task_execution_IAM_role"></a>

タスク実行ロールは、ユーザーに代わって AWS API コールを実行するためのアクセス許可を Amazon ECS コンテナと Fargate エージェントに付与します。タスク実行 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)」を参照してください。
  + Runtime Monitoring を使用します。
  + タスク定義は、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 リファレンスガイド*」の「[AmazonECSTaskExecutionRolePolicy](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonECSTaskExecutionRolePolicy.html)」を参照してください。特殊なユースケースでは、タスク実行ロールにインラインポリシーを追加する必要がある可能性があります。

Amazon ECS コンソールで、ECS タスク実行ロールを作成します。追加の機能や機能強化が導入された場合に Amazon ECS がそのアクセス許可を追加できるように、タスクのマネージド IAM ポリシーを手動でアタッチすることができます。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 パブリックを使用することで、Docker によって課せられる制限を回避できます。Amazon ECR からイメージをプルすると、ネットワークのプル時間を短縮し、トラフィックが VPC を離れる際のデータ転送の変更を減らすのにも役立ちます。

Fargate を使用するときは、`repositoryCredentials` を使用してプライベートイメージレジストリの認証を行う必要があります。Amazon ECS コンテナエージェントの環境変数である `ECS_ENGINE_AUTH_TYPE` および `ECS_ENGINE_AUTH_DATA` を設定したり、Fargate でホストされているタスクの `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. **信頼できるエンティティタイプ** で、**AWS のサービス** を選択します。

1. **[サービスまたはユースケース]** で **[エラスティックコンテナサービス]** を選択し、次に **[エラスティックコンテナのサービスタスク]** を選択します。

1. [**次へ**] を選択します。

1. **[アクセス許可の追加]** セクションで **[AmazonECSTaskExecutionRolePolicy]** を検索し、ポリシーを選択します。

1. [**次へ**] を選択します。

1.  **[ロール名]** に **[ECSTaskExecutionRole]** と入力します。

1. ロールを確認したら、**[ロールを作成]** を選択します。

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

すべての *[ユーザー入力]* は、お客様の情報で置き換えてください。

1. IAM ロールに使用する信頼ポリシーが含まれている `ecs-tasks-trust-policy.json` という名前のファイルを作成します。ファイルには次の内容が含まれます。

------
#### [ 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 イメージをプルできるようにする | [インターフェイスエンドポイントのアクセス許可によって Amazon ECR イメージをプルする Fargate タスクです。](#task-execution-ecr-conditionkeys) | 
| 設定ファイルを Amazon S3 バケットでホストする | [Amazon S3 ファイルストレージのアクセス許可](#s3-required) | 
| Amazon ECS ライフサイクルイベントを表示するように Container Insights を設定する |  [Amazon ECS ライフサイクルイベントを Container Insights で表示するために必要なアクセス許可](console-permissions.md#required-permissions-configure)  | 
| Container Insights に Amazon ECS ライフサイクルイベントを表示する |  [Amazon ECS ライフサイクルイベントを Container Insights で表示するには、以下のアクセス許可が必要です。](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 ID のアクセス許可の追加および削除](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 ID のアクセス許可の追加および削除](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"
      ]
    }
  ]
}
```

------

## インターフェイスエンドポイントのアクセス許可によって Amazon ECR イメージをプルする Fargate タスクです。
<a name="task-execution-ecr-conditionkeys"></a>

Amazon ECR がインターフェイス VPC エンドポイントを使用するように設定されている場合、Amazon ECR からイメージをプルする Fargate を使用するタスクを起動するときは、特定の VPC または VPC エンドポイントへのアクセスにタスクを制限できます。この操作を行うには、IAM 条件キーを使用するタスクのタスク実行ロールを作成します。

次の IAM グローバル条件キーを使用して、特定の VPC または VPC エンドポイントへのアクセスを制限します。詳細については、「[AWSvグローバル条件コンテキストキー](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html)」を参照してください。
+ `aws:SourceVpc` - 特定の 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 バケットにのみアクセスできるようになります。