ECS を利用すると「タスクロール」と「タスク実行ロール」というものが出てきます。名前が似ている上に、どのように設定するのが良いか分かりづらかったので調べたことをメモ。
目次
タスクロール
コンテナで利用される IAM ロールです。コンテナの中のアプリケーションから AWS のサービスを利用する場合にこのロールを設定します。
たとえば、コンテナの中のアプリケーションから S3 を利用する場合にはここを設定します。アプリケーションから AWS サービスを利用しない場合は「なし」で良いです。EC2 インスタンスに設定する IAM ロールのコンテナ版をイメージすると理解しやすいと思います。
詳細は タスク用の IAM ロール - Amazon Elastic Container Service を参照。
タスク実行ロール
タスク実行ロールとは
AWS ドキュメントの Amazon ECS タスク実行 IAM ロール によると ECS コンテナエージェント が利用する IAM ロールという説明があります。タスクの要件に応じて設定する必要があるとのことです。
ECS コンテナエージェントと言われてもよく分からないので、具体例を見ていきましょう。
よく使う例
- ECR にあるコンテナイメージを使う。詳細は Amazon ECS による Amazon ECR の使用 を参照。
- CloudWatch Logs にログを保存する。詳細は awslogs ログドライバーを使用する を参照。
上記 2 つはよく利用するためにデフォルトの IAM ロール ecsTaskExecutionRole
が用意されています。ecsTaskExecutionRole は、マネジメントコンソールで ECS のタスク定義を作成するときに、タスク実行ロールで「新しいロールの作成」を選択すると自動で作成されます。
CloudFormation や Terraform で ECS を構築していてマネジメントコンソールを使わない環境ではこのロールが存在していないことがあるので、その場合は、マネジメントコンソールで操作をして IAM ロールを作成しましょう。
ecsTaskExecutionRole にアタッチされているポリシー
ecsTaskExecutionRole
には AWS マネージドポリシーの AmazonECSTaskExecutionRolePolicy がアタッチされており、AWS により自動でメンテナンスされます。
AmazonECSTaskExecutionRolePolicy(2020年10月時点)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ecr:GetAuthorizationToken",
"ecr:BatchCheckLayerAvailability",
"ecr:GetDownloadUrlForLayer",
"ecr:BatchGetImage",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "*"
}
]
}
他によく使う例
他によく使う例として、タスク定義の環境変数に AWS System Manager パラメータストアの値を利用する例があります。DB の接続情報をパラメータストアに入れておいて、ECS の環境変数や Secret に情報を送り込むときなどに使います。詳細は Amazon ECS シークレットで必須の IAM アクセス許可 を参照。
タスク実行ロールまとめ
「タスク実行ロール」は、ECS コンテナエージェントがタスクを実行(起動)するときに必要なロールを定義するところ、とイメージをすると、名前と動作が一致して覚えやすいと思います。タスクが権限エラーで起動しない場合はタスク定義で AWS サービスを使っていないか確認をして、「タスク実行ロール」の権限不足を疑ってみるとよいと思います。
タスク実行ロールの詳細は Amazon ECS タスク実行 IAM ロール を参照。
番外編:EC2 起動タイプのコンテナインスタンスの IAM ロール
番外編としてもうひとつ。EC2 起動タイプの ECS クラスターを作成するときに「コンテナインスタンスの IAM ロール」というものがでてきます。これは ECS タスクを動かす土台となる EC2 インスタンスに設定される IAM ロールです。EC2 インスタンスから AWS サービスを利用する際に使われます。
デフォルトとして AWS があらかじめ用意してくれている IAM ロール ecsInstanceRole
があるので、ほとんどの場合はこれを使えば OK です。ecsInstanceRole
は、マネジメントコンソールで EC2 起動タイプを選択して ECS のクラスタを作成するとき「新しいロールの作成」を選択すると作成されます。
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 を参照。
まとめ
- タスクロールはコンテナの中のアプリケーションから AWS サービスを利用するときに設定する。
- タスク実行ロールはタスク定義で AWS サービスを利用する設定をしたときに設定が必要。ecsTaskExecutionRole を基本に、タスク定義の内容に応じて設定。
- コンテナインスタンスの IAM ロールは、 EC2 起動モードのときに、土台となる EC2 インスタンスが利用するもの。ここは ecsInstanceRole を設定し、基本的にはいじらなくて良い。