ECS を利用すると「タスクロール」と「タスク実行ロール」というものが出てきます。名前が似ている上に、どのように設定するのが良いか分かりづらかったので調べたことをメモ。
EC2 起動タイプと Fargate 起動タイプの順に説明します。
目次
EC2 起動タイプの場合
EC2 起動タイプの場合、以下の IAM ロールが使われます。
- コンテナインスタンスの IAM ロール
- タスク用の IAM ロール
- タスク実行 IAM ロール
順番に見ていきましょう
コンテナインスタンスの IAM ロール
EC2 起動タイプを使っているとき、EC2 インスタンスに設定される IAM ロールです。EC2 インスタンスから AWS サービスを利用する際に使われます。
マネジメントコンソールで ECS のクラスタを作成するときに「新しいロールの作成」を選択すると ecsInstanceRole
作成されるので、これをそのまま利用するのが良いです。ecsInstanceRole には AWS マネージドポリシーの AmazonEC2ContainerServiceforEC2Role がアタッチされており、AWS により自動でメンテナンスされます。
AmazonEC2ContainerServiceforEC2Role(2020年10月時点)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:DescribeTags",
"ecs:CreateCluster",
"ecs:DeregisterContainerInstance",
"ecs:DiscoverPollEndpoint",
"ecs:Poll",
"ecs:RegisterContainerInstance",
"ecs:StartTelemetrySession",
"ecs:UpdateContainerInstancesState",
"ecs:Submit*",
"ecr:GetAuthorizationToken",
"ecr:BatchCheckLayerAvailability",
"ecr:GetDownloadUrlForLayer",
"ecr:BatchGetImage",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "*"
}
]
}
詳細は Amazon ECS コンテナインスタンス IAM ロール - Amazon Elastic Container Service を参照。
タスク用の IAM ロール
コンテナで利用される IAM ロールです。コンテナの中のアプリケーションから AWS のサービスを利用する場合にこのロールを設定します。
たとえば、コンテナの中のアプリケーションから S3 を利用する場合にはここを設定します。コンテナから AWS サービスを利用しない場合は「なし」で良いです。EC2 インスタンスに設定する IAM ロールのコンテナ版をイメージすると理解しやすいと思います。
詳細は タスク用の IAM ロール - Amazon Elastic Container Service を参照。
タスク実行 IAM ロール
ECS コンテナエージェント が利用する IAM ロールです。タスクの要件に応じて設定する必要があります。
ここが少し分かりづらいですが、タスク定義で AWS サービスを利用する設定を行ったときにこのロールを設定します。例として、ドキュメントには以下が紹介されています。
- ECR にあるコンテナイメージを使う。詳細は Amazon ECS による Amazon ECR の使用 を参照。
- CloudWatch Logs にログを保存する。詳細は awslogs ログドライバーを使用する を参照。
- プライベートレジストリの認証をする。詳細は プライベートレジストリの認証で必須の IAM アクセス許可 を参照。
- WS Systems Manager パラメータストアを利用する。詳細は Amazon ECS シークレットで必須の IAM アクセス許可 を参照。
上記の下2つ「ECR にあるコンテナイメージを使う」「CloudWatch Logs にログを保存」についてはすでにポリシー AmazonECSTaskExecutionRolePolicy
が用意されています。マネジメントコンソールで ECS のタスク定義を作成するときに、タスク実行ロールで「新しいロールの作成」を選択すると、このポリシーがアタッチされた ecsTaskExecutionRole
が作成されます。タスク実行ロールはこれを基本にすると良いでしょう。
AmazonECSTaskExecutionRolePolicy(2020年10月時点)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ecr:GetAuthorizationToken",
"ecr:BatchCheckLayerAvailability",
"ecr:GetDownloadUrlForLayer",
"ecr:BatchGetImage",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "*"
}
]
}
「タスク IAM 実行ロール」は、タスクを実行(起動)するときに必要なロールを定義するところ、とイメージをすると名前と役割が一致して理解しやすいと思います。タスクが権限エラーで起動しない場合はここの権限が不足していることが多いので確認を。詳細は Amazon ECS タスク実行 IAM ロール - Amazon Elastic Container Service を参照。
Fargate 起動タイプの場合
Fargate 起動タイプの場合は以下 2 つの IAM ロールが使われます。
- タスク用の IAM ロール
- タスク実行 IAM ロール
タスク用の IAM ロール
コンテナで利用される IAM ロールです。EC2 起動タイプと同様、コンテナの中のアプリケーションから AWS のサービスを利用する場合はこのロールを設定しましょう。コンテナから AWS サービスを利用しない場合は「なし」で良いです。
詳細は タスク用の IAM ロール - Amazon Elastic Container Service を参照。
タスク実行 IAM ロール
Fargate エージェントが利用する IAM ロールです。EC2 起動タイプと同様に ecsTaskExecutionRole を基本に、必要に応じて追加で設定が必要です。
タスク実行 IAM ロールの詳細は Amazon ECS タスク実行 IAM ロール - Amazon Elastic Container Service を参照してください。
まとめ
- コンテナインスタンスの IAM ロールは、 EC2 起動モードのときに、土台となる EC2 インスタンスが利用するもの。ここは ecsInstanceRole を設定し、基本的にはいじらない。
- タスクロールはコンテナの中のアプリケーションから AWS サービスを利用するときに設定する。
- タスク実行ロールはタスク定義で AWS サービスを利用する設定をしたときに設定が必要。ecsTaskExecutionRole を基本に、タスク定義の内容に応じて設定。