AWS Copilot は copilot task run
コマンドで単発のタスクを実行することができますが、環境変数やVPCなどの設定を毎回指定する必要があり面倒です。そこで --generate-cmd
オプションを利用してコマンドの雛形を生成してから一部を書き替えてデプロイ時に実行します。
CodeBuild に組み込む
buildspec.yml
の post_build
フェーズにマイグレーション用のコマンドを追加します。
Laravel の php artisan app:release
コマンドを実行する例
# {APP_NAME} {SVC_NAME} は書き替えてください
- cmd="$(./copilot-linux task run --generate-cmd {APP_NAME}/${env}/{SVC_NAME} 2>&1 | \
sed -E \
-e 's/--entrypoint ""/--entrypoint php/' \
-e 's/--command ""/--command \"artisan app:release\"/' \
-e 's/copilot /.\/copilot-linux /' \
) --follow --task-group-name app-release-${env}"
- eval "$cmd"
copilot task run
コマンドは --generate-cmd application/env/service
オプションを指定するとコマンドの雛形が出力されます。
この出力は環境変数やVPCなどの設定が含まれていますが entrypoint
command
オプションだけは空欄になっているので sed
などで置換しましょう。出力先がなぜか標準エラー出力なので 2>&1
で標準出力に結合してからパイプで処理します。
CodeBuild で実行するときは copilot
コマンドが copilot-linux
コマンドになっているのでそれも合わせて sed
で置換します。
変数 $cmd
に入れてから eval
で実行すると空白のエスケープ処理などを気にしなくて良いので簡単です。