ECSタスクの動作がおかしい
ECSタスク中でこんな感じのコマンドを実行していました。
aws s3 syc ${S3_DIRECTORY_URL} /var/www/files
S3からファイルをダウンロードする単純なコマンドです。
ところがこんなエラーが発生します。
aws s3 sync <LocalPath> <S3Uri> or <S3Uri> <LocalPath> or <S3Uri> <S3Uri>
ここで ${S3_DIRECTORY_URL}
というのは環境変数ファイルから取得するようタスク定義で指定しています。
# .env の中身
VARIABLE1=value1
VARIABLE2=value2
S3_DIRECTORY_URL="s3://sample-bucket/download_source_dir"
確実に値は渡っているはずなのになんでエラーになるの???
念のため ecs exec で環境変数値を確認してみます。
$ aws ecs execute-command \
--region ap-northeast-1 \
--cluster {ECSクラスタ名} \
--task {ECSタスクのID} \
--container app \
--command "env" \ ※環境変数値を確認
--interactive
The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.
Starting session with SessionId: ecs-execute-command-xxxxxxxxxxxxxx
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
VARIABLE1=value1
VARIABLE2=value2
S3_DIRECTORY_URL="s3://sample-bucket/download_source_dir"
やっぱ値入ってるよなあ・・・ってあれ?
なんでダブルクォート付きで出力されてんの???
もしや・・・
環境変数ファイルを次のように引用符なしに修正してみたら・・・動いた!!
# .env の中身
VARIABLE1=value1
VARIABLE2=value2
S3_DIRECTORY_URL=s3://sample-bucket/download_source_dir
ECSタスクの環境変数ファイルは値を引用符で囲ってはいけない
どうやらECSタスクが参照する環境変数ファイルは値を引用符で囲ってはいけないようです。
マニュアルにこう書いてあります。
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/use-environment-file.html
スペースまたは引用符は、Amazon ECS ファイルの値の一部として含まれます
非常に分かりにくいですが、スペースやダブルクォートも値とみなされるようです。試していないですが多分シングルクォートも同じじゃないでしょうか。
うっかり末尾にスペース入ってたりすると死ぬということですね。こういうの気づきづらいから厄介なんだよな・・・
おまけ
ローカルでは docker compose で動作確認していました。
そこでも環境変数ファイルを読みこんでいたのですが、こちらはダウブルクォートを引用符として認識してくれます。だからECSに上げるまで気づかなかったんですね。
services:
app:
build:
context: .
dockerfile: Dockerfile
env_file:
- .env
まとめ
ECSタスク定義で環境変数ファイルを使う場合はダブルクォートは引用符として使えません。
末尾スペースも削除しましょう。