AWSでコンテナを動かすサービス、ECS (Elastic Container Service) や Fargate を使い始めると、必ずと言っていいほど遭遇するのが、「タスクロール」と「タスク実行ロール」という二つのIAMロールですが、名前が似ているので、「どっちがどっち?」「何が違うの?」と混乱する方が私の周りではとても多かったので、少しまとめてみました。
この二つのロールの役割を、役割分担という視点でできるだけ丁寧に解説してみます。
1. そもそも「タスク」って何?
タスクロールとタスク実行ロールを理解する前に、AWSにおける 「タスク (Task)」 のイメージを簡単に掴んでおくのが大事かなと思います。
ECSやFargateの世界では、「タスク」とは、「プログラムを動かすための最小単位の実行環境」 として考えるとわかりやすいです。
例えるなら、「荷物を運ぶトラック(コンテナ)」 と、「そのトラックを動かす運転手(実行環境)」 がセットになったものです。このタスクは、Dockerコンテナを実行し、Webサーバーを動かしたり、データを処理したりといった、実際の仕事(プログラム)を行います。
2. 二つのロールの役割分担
タスクロールとタスク実行ロールは、名前は似ていますが、それぞれ全く異なるタイミングと目的で使われます。
| 比較項目 | タスク実行ロール (Task Execution) | タスクロール (Task Role) |
|---|---|---|
| 誰が使うか? | AWSのECSエージェントやFargateのシステム | タスク(プログラム)自身 |
| いつ使うか? | タスクの準備 (起動前)の段階 | タスクが実行中の段階 |
| 主な目的 | 「起動準備」 に関する権限 | 「実際の仕事」 に関する権限 |
| 権限の例 | ECRからのイメージ取得、ログのCloudWatchへの送信 | S3へのデータ保存、DynamoDBの読み書き |
これを身近なものに例えるなら、「引越し作業」 とかがイメージしやすいかなと思います。
| AWSロール | 引越しの例え |
|---|---|
| タスク実行ロール | 引越し業者(トラックの準備係)の権限 |
| トラック(コンテナ)を準備し、荷物(プログラムの実行ファイル)を倉庫(ECR)から運び出す権限 | |
| タスクロール | 引越し後の生活(プログラムの実行)の権限 |
| 新居で家具(S3)を使ったり、電気(RDS)を操作したりする権限 |
3. 【タスク実行ロール】: 起動のための準備係
タスク実行ロール (Task Execution Role) は、タスクが起動する前に、AWSのシステム側(ECSエージェントやFargate) が利用するための権限セットとなります。
そのため、ECSやFargateがコンテナを起動するためには、以下の「準備作業」を行う必要があります。
-
コンテナイメージの取得: どこからコンテナのプログラム(イメージ)を持ってくるか?
- 例: ECR (Elastic Container Registry) からイメージをプル(取得) する権限
-
ログの送信: コンテナの起動ログなどをどこに書き込むか?
- 例: CloudWatch Logs にログを 書き込む 権限
このロールを設定しないと、タスクはそもそも起動すらできないため、
ECS/Fargateが 「タスクの実行を任された」 という証拠と、その準備に必要な最低限の許可証のようなものになります。
📝 設定例 (最低限のポリシー)
タスク実行ロールには、通常、AWSが提供する管理ポリシーをアタッチします。
※参考例です
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ecr:GetAuthorizationToken",
"ecr:BatchCheckLayerAvailability",
"ecr:GetDownloadUrlForLayer",
"ecr:BatchGetImage",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "*"
}
]
}
4. 【タスクロール】: 実際の仕事をする本体の権限
タスクロール (Task Role) は、タスク(コンテナ内で動いているプログラム)自身が、実行中にAWSの他のサービスへアクセスするために利用する権限セットのこと。
プログラムが、外部のAWSサービス(S3、DynamoDB、RDSなど)と連携して「実際の仕事」をするときに使われる。
💡 簡単なイメージ
例えば、Pythonで書いたWebサーバーのプログラムが、ユーザーからアップロードされた画像をS3に保存したいとします。
このとき、プログラムはS3に対して 「画像を保存させてください」というアクセスを試みます。このアクセスを許可するのが タスクロールの役割になります。
📝 設定例 (S3への読み書き権限)
タスクロールには、プログラムが実行する具体的な操作の権限を記述します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::my-application-bucket/*"
}
]
}
このタスクロールをアタッチされたタスク(コンテナ)だけが、S3バケット my-application-bucket に対してファイルの読み込み (GetObject) や書き込み (PutObject) ができるようになります。
5. まとめ: 使い分けのポイント
結局のところ、使い分けは非常にシンプルです。
| シーン | 使うロール | 理由 |
|---|---|---|
| ログをCloudWatchに送信したい | タスク実行ロール | システム側の起動準備・ログ収集の機能だから |
| S3から設定ファイルを読み込みたい | タスクロール | プログラム自身が行う「実際の仕事」だから |
| ECRからイメージをダウンロードしたい | タスク実行ロール | システム側のタスク起動準備だから |
| RDS (データベース) にデータを書き込みたい | タスクロール | プログラム自身が行う「実際の仕事」だから |
タスク実行ロールは 「ECS/Fargateのための最低限の準備係」 、タスクロールは 「コンテナ内で動くプログラムのための仕事の許可証」 と覚えておけば、迷った時に答えを繋げる糸口にできるんじゃないかなと思います。