LoginSignup
1
1

More than 1 year has passed since last update.

ECSのタスク定義で環境変数をS3から取得しようとしてハマったポイント

Posted at

やりたかった事

{
    "family": "",
    "containerDefinitions": [
        {
            "name": "",
            "image": "",
            ...
            "environment": [
                {
                    "name": "variable",
                    "value": "value"
                }
            ],
            ...
        }
    ],
    ...
}

こんな感じで定義していた環境変数をS3バケットに入れた.envファイルから取得したい。
公式ドキュメントをみるとenvironmentFilesっていうのでいけそう。

やってみる

ECSで紐づけていたIAMロールに別途S3へのアクセスを付与する必要がある。
ここは本題ではないので割愛。こちらの記事を参考にする。

最初IAMロールにS3の権限なくて怒られたけど、↑を参考にやったら怒られなくなった。
しかしログを確認してみると。migrationでこけてる。。なぜだ。。

原因

タスク定義で指定する環境変数はenvironment→environmentFilesの優先順位で動いている。
つまりenvironmentで指定していると上書きしてしまう挙動だった。

間違い

  "containerDefinitions": [
    {
     ...
      "environmentFiles": [
        {
          "value": "arn:aws:s3:::sample-bucket/prod.env",
          "type": "s3"
        }
      ],
      "environment": [],
      ...
    }
  ]

正しい

  "containerDefinitions": [
    {
     ...
      "environmentFiles": [
        {
          "value": "arn:aws:s3:::sample-bucket/prod.env",
          "type": "s3"
        }
      ],
      "environment": null,
      ...
    }
  ]

"environment": nullにする事で上書きされる事なくmigration実行されるようになった。

どうやらDockerの仕様らしい

ECSのタスク定義で設定したenvironmentとenvironmentFilesは以下のように対応している(はず)。認識間違ってたらコメントください。

environment environmentFiles
docker run --env docker run --env-file
docker run --env 'HOGE=hoge' --env-file='prod.env'

こうした場合は--envでの指定が優先される。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1