📘

【AWS】【ECS】 タスク実行ロールとタスクロールの違い

2022/08/04に公開

先日、ECSを構築をしていた際に掲題のロールについて調べてみましたので備忘として残します。

1.タスク実行ロール

公式ドキュメントより

タスク実行ロールは、ユーザーに代わって AWS API コールを実行するためのアクセス許可を Amazon ECS コンテナと Fargate エージェントに付与します。タスク実行 IAM ロールは、タスクの要件に応じて必要です。さまざまな目的とサービスのタスク実行ロールを、アカウントに複数関連付けることができます。

「Amazon ECS タスク実行IAM ロール」より

「タスク実行」という命名にもあることから、タスクを実行する際に必要な権限をこのロールにまとめている ことがわかりました。

このロールにデフォルトで付与されている「AmazonECSTaskExecutionRolePolicy」の内容を確認すると、
・コンテナイメージをECRからgetしてpullするためにECRの権限諸々を付与
・ログの出力先の作成と出力のためにCloudWatchLogsの権限諸々を付与
していることがわかります。

デフォルトで付与されているポリシーの権限

AmazonECSTaskExecutionRolePolicy
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecr:GetAuthorizationToken",
                "ecr:BatchCheckLayerAvailability",
                "ecr:GetDownloadUrlForLayer",
                "ecr:BatchGetImage",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": "*"
        }
    ]
}

他にも、SecretsManagerで環境変数を管理していて、コンテナにその環境変数を読み込ませたい場合には、タスク実行ロールにSecretsManagerの権限を付与してあげなければなりません。
確かに環境変数を読み込ませるタイミングはタスクを実行する時になるので、「タスク実行ロール」 に権限付与が必要になるということになります。

2.タスクロール

公式ドキュメントより

Amazon ECS タスクには IAM ロールを関連付けることができます。IAM ロールで付与される許可は、タスクで実行されているコンテナによって引き受けられます。コンテナ化したアプリケーションは AWS API を呼び出す必要がある場合、AWS 認証情報でそれらの AWS API リクエストに署名する必要があります。なお、タスクの IAM ロールは、アプリケーションを使用するための認証情報を管理する戦略を利用できます。これは、Amazon EC2 インスタンスプロファイルが Amazon EC2 インスタンスに認証情報を提供する方法と似ています。AWS 認証情報を作成してコンテナに配布したり、Amazon EC2 インスタンスのロールを使用したりする代わりに、IAM ロールを Amazon ECS のタスク定義または RunTask API オペレーションに関連付けることができます。コンテナは、AWS SDK または AWS CLI を使用して認可された AWS サービスへの API リクエストを実行できます。

「タスク用の IAM ロール」より

こちらは タスク実行して起動したコンテナたちがAWSリソースにアクセスする際の権限を付与している ことがわかりました。

例えばFireLensを利用して、メインコンテナのログをS3やCloudWatchlogsへルーティングしたい際には、FireLensから各サービスへアクセスするための権限が必要になります。
 その際は、タスクロールにS3とCloudWatchLogsのアクセス権限を付与したポリシーを作成してロールに付与して、この権限を利用してFireLensはログをルーティングすることができます。

3.まとめ

  • タスク実行ロール

    • タスク実行時にアクセスしたいAWSリソースの権限を管理
  • タスクロール

    • タスク実行して起動したコンテナがアクセスしたいAWSリソースの権限を管理

筆者が構築時に「あれ?この権限ってタスクロールに付与すればいいの?タスク実行ロールに付与すればいいの?」と迷ったので今回まとめてみました。
今後、どちらのロールに付与するか考える際は、「どのタイミングでAWSリソースへアクセスが必要になるか?(タスク実行時?それともタスク実行してコンテナ起動後?)」を考えてみると、迷わなくなりそうです。

最後までお読みいただきありがとうございました。

Discussion