😸

【TIPS】ECSで用いる環境変数をS3から参照する時は「タスク実行ロール」の考慮が必要

2022/09/04に公開

1. はじめに

 こんにちわ、Mitsuoです。
ECSで用いる環境変数をS3から参照する場合のTIPSをブログにしてみました。

先に言っておきますが、使った事がある人には役に立たないTIPSです。


2. ECSの環境変数機能とは?

 その名の通り、ECSで実行するコンテナが参照する環境変数を指定する機能です。
タスク定義内、細かく言うとタスク定義内のコンテナ定義で指定が出来ます。
指定の仕方は2つあり、コンテナ定義で指定する方法と、S3にある環境変数用ファイルを指定して読み込む方法です。

image

今回は後者の「S3にある環境変数用ファイルを指定して読み込む方法」についてのTIPSです。

3. 本題に入る前に

 環境変数データは、センシティブなデータが多くこの機能を使わず、Systems Manager Parameter StoreやSecrets Managerを使う事が推奨されています。
ただし、アプリケーション担当がECSの機能で環境変数を参照したいというケースは、往々にしてあると思っているので、役に立てばな、というお気持ちで書いています。

4. タスク実行ロールに権限付与が必要

 はい、言いたい事はそれだけなのです。
公式ドキュメントにしっかりと書いています。

Passing environment variables to a container:Required IAM permissions

The Amazon ECS task execution role is required to use this feature. This allows the container agent to pull the environment variable file from Amazon S3. For more information, see Amazon ECS task execution IAM role.

To provide access to the Amazon S3 objects that you create, manually add the following permissions as an inline policy to the task execution role. Use the Resource parameter to scope the permission to the Amazon S3 buckets that contain the environment variable files. For more information, see Adding and Removing IAM Policies.

JSONサンプルも載せてくれています。親切です。

In the following example, the permissions are added to the inline policy.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject"
      ],
      "Resource": [
        "arn:aws:s3:::examplebucket/folder_name/env_file_name"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetBucketLocation"
      ],
      "Resource": [
        "arn:aws:s3:::examplebucket"
      ]
    }
  ]
}

タスク実行ロールです。タスクロールではありません。

5. タスクロールとタスク実行ロールについて

 ECSには、タスクロールとタスク実行ロールという非常に似通った名前のロールを2つアタッチする必要があります。両者の違いは色々な方がブログにまとめてくださっているので、詳細はそちらを参照いただければと思いますが、ざっくりいうと次の通りです。

  • コンテナアプリが利用するAWSサービスに対するアクションを指定するのがタスクロール
  • コンテナエージェントが利用するアクション(ECRへのDocker ShipやLoggingなど)を指定するのがタスク実行ロール

ここで間違えてはいけないのは、コンテナアプリがS3に対してアクションを行うためにタスクロールの考慮が必要であるのは正しいですが、環境変数ファイルを参照する時はタスク実行ロール側で設定が必要です。

例えば「コンテナがS3にアクセスする時はタスクロールを使います!」だけを見てしまうと「S3へのアクセス=タスクロールなのか」と解釈してしまう可能性があります。

6. まとめ

 とはいえ他ブログで「タスク実行ロールに対して設定する」と書いているので、間違って解釈している人は少なそうですが、意外とそれぞれのロールの境界線が分からずに使っている人がいるのではないかと思い、書いてみました。
自分がやりたい事は、タスク定義したコンテナが行うのか、それともECS側のエージェントが行うのか、を考えてみると自ずと答えは見えてくるかもしれません。(と言いますか、公式ドキュメントを見よう)

このブログが誰かの役に立てば嬉しいです、Mitsuoでした!

7. 参考資料

Passing environment variables to a container:Required IAM permissions
IAM roles for tasks

Discussion