

# 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) を参照してください。

機能や機能強化が今後導入されたときに Amazon ECS がそれらに対するアクセス許可を追加できるように、手動でロールを作成し、その IAM 管理ポリシーをコンテナインスタンスにアタッチできます。必要に応じて、以下の手順を使用してマネージド IAM ポリシーをアタッチします。

------
#### [ 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. **[サービスまたはユースケース]** で **[エラスティックコンテナサービス]** を選択し、次に **[エラスティックコンテナサービスのユースケースの 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 密度が高いコンテナインスタンスの起動をサポートします。この機能を使用する場合は、2 つのコンテナインスタンスロールを作成することをお勧めします。1 つのロールで `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` ファイルのコピーをプライベートバケットに保存し、Amazon EC2 ユーザーデータを使用して AWS CLI をインストールします。その後、インスタンスの起動時に設定情報を `/etc/ecs/ecs.config` にコピーします。

`ecs.config` ファイルの作成と Amazon S3 への保存、およびこの構成を使用したインスタンスの起動の詳細については、「[Amazon S3 に Amazon ECS コンテナインスタンスの設定を保存する](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 にログデータを送信する前に、Amazon ECS エージェントがお客様のアプリケーションログを CloudWatch に書き込むことを許可する IAM ポリシーを作成する必要があります (通常は `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. [**次へ**] を選択します。
**注記**  
いつでも **Visual** と **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
   ```

------