

# Amazon ECS タスクの IAM ロール
<a name="task-iam-roles"></a>

Amazon ECS タスクには IAM ロールを関連付けることができます。IAM ロールで付与されるアクセス許可は、タスクで実行中のコンテナに対し発行されます。このロールにより、(コンテナ上で実行) アプリケーションコードが他の AWS サービスを使用できるようになります。タスクロールは、アプリケーションが Amazon S3 などの他の AWS サービスにアクセスするときに必要です。

**注記**  
これらのアクセス許可は、Amazon ECS コンテナと Fargate エージェントからはアクセスされません。Amazon ECS がコンテナイメージをプルしてタスクを実行するために必要な IAM 許可については、「[Amazon ECS タスク実行IAM ロール](task_execution_IAM_role.md)」を参照してください。

タスクロールを使用する利点は次のとおりです。
+ **懸念事項の分離**: EC2 を使用している場合、タスク IAM ロールを使用すると、EC2 インスタンスプロファイルを使わずにコンテナの IAM アクセス許可を指定できます (詳細については、「**AWS Identity and Access Management ユーザーガイド」の「[インスタンスプロファイルの使用](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html)」を参照してください)。したがって、EC2 インスタンスに関連付けられた IAM アクセス許可を変更することなく、アプリケーションを ECS コンテナインスタンスに個別かつ均一にデプロイできます。
+ **監査性:** CloudTrail にアクセスしイベントのログ記録を利用することで、遡及的な監査を確実に行えます。タスクの認証情報には、セッションにアタッチされている `taskArn` のコンテキストがあるため、CloudTrail ログにはロールの認証情報が発行されたタスクが表示されます。
+ **統一された認証情報配信**: ECS は IAM ロール認証情報をコンテナに配信し、タスクに関連付けられたコンピューティングオプションに関係なく、明確に定義されたインターフェイスを介してアクセスできるようにします。ECS Fargate では、EC2 インスタンスプロファイルはタスク内のコンテナでは使用できません。タスク IAM ロールを使用すると、コンテナで AWS SDK または AWS CLI を使用する場合、コンピューティングオプションに関係なく、コンテナに IAM アクセス許可を関連付けることができます。AWS SDK がこれらの認証情報にアクセスする方法の詳細については、「[コンテナ認証情報プロバイダー](https://docs.aws.amazon.com/sdkref/latest/guide/feature-container-credentials.html)」を参照してください。

**重要**  
コンテナはセキュリティ境界ではなく、タスク IAM ロールを使用しても変更されません。Fargate で実行されている各タスクは、独自の分離境界を持ち、基盤となるカーネル、CPU リソース、メモリリソース、Elastic Network Interface を別のタスクと共有しません。ECS 上の EC2 および外部コンテナインスタンスの場合、タスクの分離はなく (Fargate とは異なり）、コンテナは同じコンテナインスタンス上の他のタスクの認証情報にアクセスできる可能性があります。[ECS コンテナインスタンスロール](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/instance_IAM_role.html)に割り当てられたアクセス許可にアクセスすることもできます。[ロールの推奨事項](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/security-iam-roles.html#security-iam-roles-recommendations)に従って、コンテナの Amazon EC2 インスタンスメタデータサービスへのアクセスをブロックします (詳細については、「**Amazon EC2 ユーザーガイド」の「[インスタンスメタデータサービスを使用してインスタンスメタデータにアクセスする](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html)」を参照してください)。  
タスク用の IAM ロールを指定すると、そのタスクのコンテナ内の AWS CLI または他の SDK は、タスクロールによって提供された AWS 認証情報を排他的に使用し、Amazon EC2 または外部インスタンスで実行されていて、それらから IAM 許可を継承しなくなる点に注意してください。

## タスクの IAM ロールを作成する
<a name="create_task_iam_policy_and_role"></a>

タスクで使用する IAM ポリシーを作成するときは、そのポリシーはタスクのコンテナが引き受けるタスクの許可を含める必要があります。既存の AWS マネージドポリシーを使用することも、特定のニーズを満たすカスタムポリシーを最初から作成することもできます。詳細については、「*IAM ユーザーガイド*」の「[IAM ポリシーの作成](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)」を参照してください。

**重要**  
Amazon ECS タスク (すべての起動タイプ) では、タスクに IAM ポリシーとロールを使用することをお勧めします。これらの認証情報により、タスクは `sts:AssumeRole` を呼び出してタスクに既に関連付けられているのと同じロールを引き受けることなく、AWS API リクエストを行うことができます。タスクでロールがそれ自体を引き受けることが必要な場合、そのロールがそれ自体を引き受けることを明示的に許可する信頼ポリシーを作成する必要があります。詳細については、「**IAM ユーザーガイド」の「[ロール信頼ポリシーの更新](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_roles_update-role-trust-policy.html)」を参照してください。

IAM ポリシーを作成した後、Amazon ECS タスク定義で参照するポリシーを含む IAM ロールを作成できます。IAM コンソールで **[Elastic Container Service Task]** (Elastic Container Service タスク) ユースケースを使用してロールを作成できます。その後、タスクのコンテナに必要なアクセス許可を付与するロールに特定の IAM ポリシーをアタッチできます。次の手順では、これを行う方法について説明します。

IAM のアクセス許可を必要とする複数のタスク定義またはサービスがある場合は、各タスクに提供するアクセスを最小限に抑えるために、タスクを操作するために必要な最小限のアクセス許可で特定のタスク定義またはサービスごとにロールを作成することを検討してください。

リージョンのサービスエンドポイントの詳細については、「*Amazon Web Services 全般のリファレンス ガイド*」の「[サービスエンドポイント](https://docs.aws.amazon.com/general/latest/gr/ecs-service.html#ecs_region)」を参照してください。

IAM タスクロールは、`ecs-tasks.amazonaws.com` サービスを特定する信頼ポリシーが必要です。`sts:AssumeRole` 許可は、Amazon EC2 インスタンスが使用するロールとは異なる IAM ロールをタスクに引き受けられるようにします。これにより、タスクは Amazon EC2 インスタンスに関連付けられたロールを継承しません。以下に示しているのは、信頼ポリシーの例です。リージョン識別子を置き換えて、タスク起動時に使用する AWS アカウント番号を特定します。

**重要**  
タスク IAM ロールを作成するときは、ロールに関連付けられた信頼関係ポリシーで `aws:SourceAccount` または `aws:SourceArn` のいずれかの条件キーを使用してアクセス許可のスコープを明確にし、混乱した代理のセキュリティ問題の発生を防止するよう推奨します。特定のクラスターを指定する `aws:SourceArn` 条件キーの使用は現在サポートされていません。ワイルドカードを使用してすべてのクラスターを指定する必要があります。混乱した代理の問題と、お客様の AWS アカウントの保護方法の詳細について学ぶためには、[[The confused deputy problem]](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html) (IAM ユーザーガイド) の*[IAM User Guide]* (混乱した代理の問題) を参照してください。

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

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Principal":{
            "Service":[
               "ecs-tasks.amazonaws.com"
            ]
         },
         "Action":"sts:AssumeRole",
         "Condition":{
            "ArnLike":{
            "aws:SourceArn":"arn:aws:ecs:us-west-2:111122223333:*"
            },
            "StringEquals":{
               "aws:SourceAccount":"111122223333"
            }
         }
      }
   ]
}
```

------

以下の手順では、Amazon S3 からオブジェクトを取得するポリシーを作成する方法を、ポリシー例とともに説明します。すべての*ユーザー入力*を自分の値に置き換えてください。

------
#### [ 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":[
               "s3:GetObject"
            ],
            "Resource":[
               "arn:aws:s3:::my-task-secrets-bucket/*"
            ]
         }
      ]
   }
   ```

1. [**次へ**] を選択します。
**注記**  
いつでも **Visual** と **JSON** エディタオプションを切り替えることができます。ただし、**[ビジュアル]** エディタで **[次へ]** に変更または選択した場合、IAM はポリシーを再構成してビジュアルエディタに合わせて最適化することがあります。詳細については、*IAM ユーザーガイド* の [ポリシーの再構成](https://docs.aws.amazon.com/IAM/latest/UserGuide/troubleshoot_policies.html#troubleshoot_viseditor-restructure) を参照してください。

1. **確認と作成** ページで、作成するポリシーの **ポリシー名** と **説明** (オプション) を入力します。**このポリシーで定義されているアクセス許可** を確認して、ポリシーによって付与されたアクセス許可を確認します。

1. **ポリシーを作成** をクリックして、新しいポリシーを保存します。

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

すべての*ユーザー入力*を自分の値に置き換えてください。

1. `s3-policy.json` というファイルを次の内容で作成します。

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

****  

   ```
   {
      "Version":"2012-10-17",		 	 	 
      "Statement":[
         {
            "Effect":"Allow",
            "Action":[
               "s3:GetObject"
            ],
            "Resource":[
               "arn:aws:s3:::my-task-secrets-bucket/*"
            ]
         }
      ]
   }
   ```

------

1. JSON ポリシードキュメントファイルを使用して IAM ポリシーを作成するには、次の コマンドを使用します。すべての*ユーザー入力*を自分の値に置き換えてください。

   ```
   aws iam create-policy \
         --policy-name taskRolePolicy \
         --policy-document file://s3-policy.json
   ```

------

次の手順を使用してサービスロールを作成します。

------
#### [ 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. **[アクセス許可の追加]** で、作成したポリシーを検索し、選択します。

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

1. **ロール名** に、ロールの名前を入力します。この例では、`AmazonECSTaskS3BucketRole` と入力してロールに名前を付けます。

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

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

1. タスク IAM ロールに使用する信頼ポリシーが含まれている `ecs-tasks-trust-policy.json` という名前のファイルを作成します。ファイルには次の内容が含まれます。リージョン識別子を置き換えて、タスク起動時に使用する AWS アカウント番号を特定します。

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

****  

   ```
   {
      "Version":"2012-10-17",		 	 	 
      "Statement":[
         {
            "Effect":"Allow",
            "Principal":{
               "Service":[
                  "ecs-tasks.amazonaws.com"
               ]
            },
            "Action":"sts:AssumeRole",
            "Condition":{
               "ArnLike":{
               "aws:SourceArn":"arn:aws:ecs:us-west-2:111122223333:*"
               },
               "StringEquals":{
                  "aws:SourceAccount":"111122223333"
               }
            }
         }
      ]
   }
   ```

------

1. 前のステップで作成した信頼ポリシーを使用した `ecsTaskRole` という名前の IAM ロールを作成します。

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

1. 次のコマンドを使用して、作成した IAM ポリシーの ARN を取得します。*taskRolePolicy* は、作成したポリシーの名前に置き換えます。

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

1. 作成した IAM ポリシーを、`ecsTaskRole` ロールにアタッチします。`policy-arn` を、作成したポリシーの ARN に置き換えます。

   ```
   aws iam attach-role-policy \
         --role-name ecsTaskRole \
         --policy-arn arn:aws:iam:111122223333:aws:policy/taskRolePolicy
   ```

------

ロールを作成したら、次の機能のアクセス許可をロールに追加します。


|  機能  |  追加のアクセス許可  | 
| --- | --- | 
|  ECS Exec を使用する  |  [ECS Exec のアクセス許可](#ecs-exec-required-iam-permissions)  | 
| プライベート Amazon ECR リポジトリからのイメージを使用する | [Amazon ECR のアクセス許可](#ecr-required-iam-permissions) | 
| EC2 インスタンスを使用する (Windows および Linux) | [Amazon EC2 インスタンスの追加設定](#task-iam-role-considerations) | 
| 外部インスタンスを使用する | [外部インスタンスの追加設定](#enable_task_iam_roles) | 
| EC2 Windows インスタンスを使用する | [Amazon EC2 Windows インスタンスの追加設定](#windows_task_IAM_roles) | 

## Amazon ECR のアクセス許可
<a name="ecr-required-iam-permissions"></a>

アプリケーションコードが直接 Amazon ECR リポジトリとやり取りする必要がある場合は、次のアクセス許可が必要です。Amazon ECR からイメージをプルするだけの基本的な実装では、これらのアクセス許可はタスク IAM ロールレベルでは必要ありません。代わりに、Amazon ECS タスク実行ロールにこれらのアクセス許可が必要です。タスクの実行ロールの詳細については、「[Amazon ECS タスク実行IAM ロール](task_execution_IAM_role.md)」を参照してください。

コンテナで実行されているアプリケーションコードが Amazon ECR API と直接やり取りする必要がある場合は、タスクの IAM ロールに次のアクセス許可を追加し、タスク定義にタスクの IAM ロールを含める必要があります。詳細については、*IAM ユーザーガイド*の[IAM ポリシーの追加と削除](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html)を参照してください。

タスク IAM ロールに次のポリシーを使用して、Amazon ECR と直接やり取りする必要があるコンテナアプリケーションに必要な Amazon ECR アクセス許可を追加します。

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

****  

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

------

## ECS Exec のアクセス許可
<a name="ecs-exec-required-iam-permissions"></a>

[ECS Exec](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-exec.html) 機能には、マネージド型 SSM エージェント (`execute-command` エージェント) と SSM サービス間の通信に必要なアクセス許可をコンテナに付与するためのタスク IAM ロールが必要です。次のアクセス許可をタスク IAM ロールに追加し、タスク定義にタスク IAM ロールを含める必要があります。詳細については、*IAM ユーザーガイド*の[IAM ポリシーの追加と削除](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html)を参照してください。

タスク IAM ロールに次のポリシーを使用して、必要な SSM アクセス許可を追加します。

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

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
       {
       "Effect": "Allow",
       "Action": [
            "ssmmessages:CreateControlChannel",
            "ssmmessages:CreateDataChannel",
            "ssmmessages:OpenControlChannel",
            "ssmmessages:OpenDataChannel"
       ],
      "Resource": "*"
      }
   ]
}
```

------

## Amazon EC2 インスタンスの追加設定
<a name="task-iam-role-considerations"></a>

コンテナインスタンスのロールの許可は、以下に提供されるマネージド型 `AmazonEC2ContainerServiceforEC2Role` IAM ポリシーの許可のミニマリストに制限することをお勧めします。

Amazon EC2 インスタンスは、タスクのロールを使用するために、コンテナエージェントのバージョン `1.11.0` 以上が必要です。ただし、最新のコンテナエージェントのバージョンを使用することをお勧めします。エージェントのバージョンの確認と最新バージョンへの更新については、「[Amazon ECS コンテナエージェントをアップデートする](ecs-agent-update.md)」を参照してください。Amazon ECS に最適化された AMI を使用している場合、インスタンスには、`ecs-init` パッケージの `1.11.0-1` 以降が必要です。インスタンスが最新 Amazon ECS に最適化された AMI を使用している場合、コンテナエージェントおよび `ecs-init` の必要なバージョンが含まれます。詳細については、「[Amazon ECS に最適化された Linux AMI](ecs-optimized_AMI.md)」を参照してください。

コンテナインスタンスで Amazon ECS に最適化された AMI を使用していない場合、エージェントを開始する `--net=host` コマンドと、目的の設定に次のエージェント設定変数に **docker run** オプションを追加してください (詳細については、「[Amazon ECS コンテナエージェントの設定](ecs-agent-config.md)」を参照してください)。

`ECS_ENABLE_TASK_IAM_ROLE=true`  
`bridge` および `default` のネットワークモードに設定されたコンテナのタスク用の、IAM ロールを使用します。

`ECS_ENABLE_TASK_IAM_ROLE_NETWORK_HOST=true`  
`host` ネットワークモードに設定されたコンテナのタスク用の、IAM ロールを使用します。この変数はエージェントバージョン 1.12.0 以降でのみサポートされています。

実行コマンドの例の詳細については、「[Amazon ECS コンテナエージェントの手動更新（Amazon ECS 最適化以外の AMI の場合）](manually_update_agent.md)」を参照してください。また、タスクのコンテナが AWS 認証情報を取得できるよう、次のネットワーキングコマンドをコンテナインスタンスで設定する必要があります。

```
sudo sysctl -w net.ipv4.conf.all.route_localnet=1
sudo iptables -t nat -A PREROUTING -p tcp -d 169.254.170.2 --dport 80 -j DNAT --to-destination 127.0.0.1:51679
sudo iptables -t nat -A OUTPUT -d 169.254.170.2 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 51679
```

再起動後も有効にするには、コンテナインスタンスにこれらの **iptables** ルールを保存する必要があります。**iptables-save** および **iptables-restore** コマンドを使用して、**iptables** ルールを保存し、起動時にそのルールを復元します。詳細については、特定のオペレーティングシステムのドキュメントを参照してください。

`awsvpc` ネットワークモードを使用するタスクで実行されたコンテナが、Amazon EC2 のインスタンスプロファイルに入力されている認証情報にアクセスを防止するためには (タスクロールで指定されている許可は有効)、エージェントの設定 ファイルで `ECS_AWSVPC_BLOCK_IMDS` エージェント 設定変数を `true` に設定し、そのエージェントを再起動します。詳細については、「[Amazon ECS コンテナエージェントの設定](ecs-agent-config.md)」を参照してください。

`bridge` ネットワークモードを使用するタスクで実行されたコンテナが、Amazon EC2 のインスタンスプロファイルに入力されている認証情報にアクセスを防止するためには (タスクロールで指定されている許可は有効)、Amazon EC2 インスタンスで次の **iptables** コマンドを実行します。このコマンドは、`host` または `awsvpc` ネットワークモードを使用するタスク内のコンテナに影響を与えることはありません。詳細については、「[ネットワークモード](task_definition_parameters.md#network_mode)」を参照してください。
+ 

  ```
  sudo yum install -y iptables-services; sudo iptables --insert DOCKER-USER 1 --in-interface docker+ --destination 169.254.169.254/32 --jump DROP
  ```

  再起動後も有効にするには、Amazon EC2 インスタンスでこの **iptables** ルールを保存する必要があります。Amazon ECS に最適化された AMI を使用する場合は、次のコマンドを使用します。他のオペレーティングシステムの場合、そのオペレーティングシステムのドキュメントを参照してください。

  ```
  sudo iptables-save | sudo tee /etc/sysconfig/iptables && sudo systemctl enable --now iptables
  ```

## 外部インスタンスの追加設定
<a name="enable_task_iam_roles"></a>

外部インスタンスは、タスクの IAM ロールを使用にするために、コンテナエージェントのバージョン `1.11.0` 以上が必要ですが、最新のコンテナエージェントのバージョンを使用することをお勧めします。エージェントのバージョンの確認と最新バージョンへの更新については、「[Amazon ECS コンテナエージェントをアップデートする](ecs-agent-update.md)」を参照してください。Amazon ECS に最適化された AMI を使用している場合、インスタンスは、`1.11.0-1` パッケージの `ecs-init` バージョン以降が必要です。インスタンスが最新 Amazon ECS に最適化された AMI を使用している場合、コンテナエージェントおよび `ecs-init` の必要なバージョンが含まれます。詳細については、「[Amazon ECS に最適化された Linux AMI](ecs-optimized_AMI.md)」を参照してください。

コンテナインスタンスで Amazon ECS に最適化された AMI を使用していない場合、エージェントを開始する `--net=host` コマンドと、目的の設定に次のエージェント設定変数に **docker run** オプションを追加してください (詳細については、「[Amazon ECS コンテナエージェントの設定](ecs-agent-config.md)」を参照してください)。

`ECS_ENABLE_TASK_IAM_ROLE=true`  
`bridge` および `default` のネットワークモードに設定されたコンテナのタスク用の、IAM ロールを使用します。

`ECS_ENABLE_TASK_IAM_ROLE_NETWORK_HOST=true`  
`host` ネットワークモードに設定されたコンテナのタスク用の、IAM ロールを使用します。この変数はエージェントバージョン 1.12.0 以降でのみサポートされています。

実行コマンドの例の詳細については、「[Amazon ECS コンテナエージェントの手動更新（Amazon ECS 最適化以外の AMI の場合）](manually_update_agent.md)」を参照してください。また、タスクのコンテナが AWS 認証情報を取得できるよう、次のネットワーキングコマンドをコンテナインスタンスで設定する必要があります。

```
sudo sysctl -w net.ipv4.conf.all.route_localnet=1
sudo iptables -t nat -A PREROUTING -p tcp -d 169.254.170.2 --dport 80 -j DNAT --to-destination 127.0.0.1:51679
sudo iptables -t nat -A OUTPUT -d 169.254.170.2 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 51679
```

再起動後も有効にするには、コンテナインスタンスにこれらの **iptables** ルールを保存する必要があります。**iptables-save** および **iptables-restore** コマンドを使用して、**iptables** ルールを保存し、起動時にそのルールを復元します。詳細については、特定のオペレーティングシステムのドキュメントを参照してください。

## Amazon EC2 Windows インスタンスの追加設定
<a name="windows_task_IAM_roles"></a>

**重要**  
これは、タスクロールを使用する EC2 上にある Windows コンテナにのみ適用されます。

Windows 機能を使用するタスクロールには EC2 での追加設定が必要です。
+ コンテナインスタンスを起動する際に、コンテナインスタンスのユーザーデータスクリプトの `-EnableTaskIAMRole` オプションを設定して、この機能を有効にする必要があります。`EnableTaskIAMRole`は、タスクの Task IAM ロール機能をオンにします。例えば、次のようになります。

  ```
  <powershell>
  Import-Module ECSTools
  Initialize-ECSAgent -Cluster 'windows' -EnableTaskIAMRole 
  </powershell>
  ```
+ [Amazon ECS コンテナブートストラップスクリプト](#windows_task_IAM_roles_bootstrap) に提供されているネットワーキングコマンドを使用してコンテナをブートストラップする必要があります。
+ タスク用の IAM ロールとポリシーを作成する必要があります。詳細については、「[タスクの IAM ロールを作成する](#create_task_iam_policy_and_role)」を参照してください。
+ タスク認証情報プロバイダーの IAM ロールは、コンテナインスタンスのポート 80 を使用します。したがって、コンテナインスタンスでタスクの IAM ロールを設定にすると、コンテナはポートマッピングのホストポートにポート 80 を使用できません。コンテナをポート 80 で公開するには、負荷分散を使用するサービスをコンテナ用に設定することをお勧めします。ロードバランサーのポート 80 を使用できます。これにより、コンテナインスタンス上の別のホストポートにトラフィックをルーティングできます。詳細については、「[ロードバランサーを使用して Amazon ECS サービストラフィックを分散する](service-load-balancing.md)」を参照してください。
+ Windows インスタンスが再起動された場合は、プロキシインターフェイスを削除して、Amazon ECS コンテナエージェントを再度初期化し、認証情報プロキシを元に戻す必要があります。

### Amazon ECS コンテナブートストラップスクリプト
<a name="windows_task_IAM_roles_bootstrap"></a>

コンテナからコンテナインスタンスの認証情報プロキシにアクセスする前に、必要なネットワーキングコマンドを使用してコンテナをブートストラップする必要があります。起動時にコンテナで次のコードのサンプルスクリプトを実行する必要があります。

**注記**  
Windows で `awsvpc` ネットワークモードを使用している場合は、このスクリプトを実行する必要はありません。

Powershell を含む Windows コンテナを実行する場合は、次のスクリプトを使用します。

```
# Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"). You may
# not use this file except in compliance with the License. A copy of the
# License is located at
#
#	http://aws.amazon.com/apache2.0/
#
# or in the "license" file accompanying this file. This file is distributed
# on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
# express or implied. See the License for the specific language governing
# permissions and limitations under the License.
 
$gateway = (Get-NetRoute | Where { $_.DestinationPrefix -eq '0.0.0.0/0' } | Sort-Object RouteMetric | Select NextHop).NextHop
$ifIndex = (Get-NetAdapter -InterfaceDescription "Hyper-V Virtual Ethernet*" | Sort-Object | Select ifIndex).ifIndex
New-NetRoute -DestinationPrefix 169.254.170.2/32 -InterfaceIndex $ifIndex -NextHop $gateway -PolicyStore ActiveStore # credentials API
New-NetRoute -DestinationPrefix 169.254.169.254/32 -InterfaceIndex $ifIndex -NextHop $gateway -PolicyStore ActiveStore # metadata API
```

コマンドシェルのみを持つ Windows コンテナを実行する場合は、次のスクリプトを使用します。

```
# Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"). You may
# not use this file except in compliance with the License. A copy of the
# License is located at
#
#	http://aws.amazon.com/apache2.0/
#
# or in the "license" file accompanying this file. This file is distributed
# on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
# express or implied. See the License for the specific language governing
# permissions and limitations under the License.
 
for /f "tokens=1" %i  in ('netsh interface ipv4 show interfaces ^| findstr /x /r ".*vEthernet.*"') do set interface=%i
for /f "tokens=3" %i  in ('netsh interface ipv4 show addresses %interface% ^| findstr /x /r ".*Default.Gateway.*"') do set gateway=%i
netsh interface ipv4 add route prefix=169.254.170.2/32 interface="%interface%" nexthop="%gateway%" store=active # credentials API
netsh interface ipv4 add route prefix=169.254.169.254/32 interface="%interface%" nexthop="%gateway%" store=active # metadata API
```