【ECS】ECSに関するIAM Roleを整理する【AWS】

# はじめに
ECSには4つのIAM Roleが出てきます。それぞれAWS Management Consoleや公式ドキュメントには説明がありますが、実際の設定・挙動と突き合わせてどうなっているか分かりにくいため、整理しました。
なお、本稿では情報過多を避けるため、一旦、Service IAM role (Service-Linked Role) の説明は省いています。


# 3つのIAM Role
ECSで稼働するコンテナの動作には、主に以下の3つのIAM Roleが関わってきます。それぞれの役割、利用されるタイミングを説明します。

- Container Instance IAM Role
- Task Execution Role
- Task Role

# TL;DR
※ [Launch Typeによる挙動の違い](#launch-type%E3%81%AB%E3%82%88%E3%82%8B%E6%8C%99%E5%8B%95%E3%81%AE%E9%81%95%E3%81%84) 参照。


# 解説
## Container Instance IAM Role
Fargateを利用しない場合、コンテナが稼働するためのEC2インスタンスをあらかじめ稼働させておく必要がありますが、このEC2インスタンスに付与するIAM Roleとなります。ECS Clusterを作成する際に設定します。

公式ドキュメントのURLは下記のとおりです。

Amazon ECS Container Instance IAM Role - Amazon Elastic Container Service
https://docs.aws.amazon.com/AmazonECS/latest/developerguide/instance_IAM_role.html

AWS Management Console上の操作からは、以下のように確認できます。AWS Management Consoleから作成する場合、「ecsInstanceRole」という名称のIAM Roleが併せて作成されます。

ECS Cluster作成時。
![Container Instance IAM Role 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137777/68f180c1-4ea0-e160-bce3-df34029f7cf1.png)

作成したECS ClusterのContainer Instance (EC2インスタンス)の確認。
![Container Instance IAM Role 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137777/19abe477-023c-db67-f7e4-c630c0d5c5b4.png)

上記のContainer InstanceのIAM Instance Profileの確認。「ecsInstanceRole」が付与されていることが確認できます。
![Container Instance IAM Role 3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137777/9204fc7b-02b9-c097-a068-d316094c39e0.png)


## Task Execution Role
ECS上でコンテナを実行するために必要な操作を行うためのIAM Roleとなります。Task Execution Roleを使う主体は、コンテナプロセスではなくECS Agentになります。ECRからのコンテナイメージのpull、CloudWatch LogsのLog Streamの作成とログの出力（awslogsログドライバを利用している場合）、Secret ManagerやSSM Parameter Storeからの値の取得、などの操作が対象となります。

**Launch TypeがEC2／Fargateであるかにより、カバーする範囲が違いますので注意が必要です。**それぞれのカバー範囲は下記のとおりです。また後述して整理します。

> The task execution role grants the Amazon ECS container and Fargate agents permission to make AWS API calls on your behalf. The task execution IAM role is required depending on the requirements of your task. You can have multiple task execution roles for different purposes and services associated with your account.
> 
> The following are common use cases for a task execution IAM role:
> 
> - Your task uses the Fargate launch type and...
>  - is pulling a container image from Amazon ECR.
>  - uses the awslogs log driver. For more information, see Using the awslogs log driver.
> 
> - Your tasks uses either the Fargate or EC2 launch type and...
>  - is using private registry authentication. For more information, see Required IAM permissions for private registry authentication.
>  - the task definition is referencing sensitive data using Secrets Manager secrets or AWS Systems Manager Parameter Store parameters. For more information, see Required IAM permissions for Amazon ECS secrets.

Amazon ECS task execution IAM role - Amazon Elastic Container Service
https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_execution_IAM_role.html

AWS Management ConsoleからTask Definitionを作成する際、Task Execution Roleは下記個所で指定可能です。
![Task Execution Role 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137777/9db5bfd2-7b78-df25-cf40-4ea9313ef96b.png)

Taskを実行する際にも、Task OverridesでTask Execution Roleを指定可能です。
![Task Execution Role 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137777/cea75c60-b4a1-9190-c0e4-908c0ae1561a.png)


## Task Role
ECS上で稼働するコンテナアプリケーションからAWSサービスを利用する際に利用するIAM Roleとなります。例えばコンテナアプリケーションからS3上のファイルを操作する、DynamoDB上のデータを読み書きする、といった際に利用されるものとなります。

**Task Roleは、Launch Typeによる挙動の違いはありません。**

IAM Roles for Tasks - Amazon Elastic Container Service
https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html

AWS Management ConsoleからTask Definitionを作成する際、Task Roleは下記個所で指定可能です。
![Task Role 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137777/f561c964-bb9d-5eae-5ca3-14fb748b9a92.png)

Task実行の際にも、Task OverridesでTask Roleを指定可能です。
![Task Role 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137777/923bab14-dedf-d188-2c74-793e3ddc7e1b.png)


# Launch Typeによる挙動の違い
上記で見てきた3つのRoleのそれぞれの役割と用いられるタイミングについて、Launch Typeごとに整理します。

- Launch Type: EC2
    - Container Instance IAM Role (EC2インスタンスのIAM Role)
        - Task開始時のECRからのimageのpull
        - コンテナのログのCloudWatchLogsへの出力
    - Task Execution Role
        - プライベートレジストリ認証機能
        - secrets機能（Secrets ManagerやSSM Parameter Storeから機密とするべきデータを取り出し、環境変数に載せる）
    - Task Role
        - コンテナ内のアプリケーションから実行するAWS API全て
- Launch Type: Fargate
    - Container Instance IAM Role (EC2インスタンスのIAM Role)
        - ※指定不可　
    - Task Execution Role
        - Task開始時のECRからのimageのpull
        - コンテナのログのCloudWatchLogsへの出力
        - プライベートレジストリ認証機能
        - secrets機能（Secrets ManagerやSSM Parameter Storeから機密とするべきデータを取り出し、環境変数に載せる）
    - Task Role
        - コンテナ内のアプリケーションから実行するAWS API全て

# おわりに
FargateはEC2インスタンスを管理できない分、Launch Type: EC2におけるContainer Instance IAM Roleの機能が、Launch Type: FargateにおいてはTask Execution Roleに寄せられた、というようにとらえることが出来るかと思います。

なお、ECSのServiceを利用する場合、Task Execution Role/Task RoleをOverrideできなかったり、ALBのTarget Groupの操作でService-Linked Roleが関わってきたり、考慮するべきポイントがまた違います。
こちらは稿を改めて整理する予定です。