やりたかった事
{
"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での指定が優先される。