CodeDeployの「トラフィックの再ルーティング」と「元のタスクセットの終了」をCLIから実行する

2022.04.22

こんにちは、岩城です。

ECSでBlue/Greenデプロイを行っている環境でトラフィックの再ルーティング元のタスクセットの終了をCLIから実行できるか確認する機会がありましたので共有します。

トラフィックの再ルーティング

トラフィックの再ルーティングとは、Greenタスクの起動が完了した後にユーザーのトラフィックをBlueタスクから切り替えることです。

ECSタスクを更新するとCodeDeployが動いてGreenタスクが起動します。トラフィックをGreenタスクへ切り替える際、トラフィックの再ルーティングを行う必要があります。

CodeDeployのデプロイメントグループで設定すると、すぐに再ルーティングさせたり、設定した時間を経過すれば再ルーティングするといったことが可能です。

すぐに再ルーティングさせたくないし、自分の任意のタイミングで再ルーティングさせたい。だけど、マネジメントコンソールからの作業だと操作ミスするかも知れないから、CLIで対応したいという場合、以下で対応できます。

$ aws deploy continue-deployment \
    --deployment-id "[デプロイメントID]" \
    --deployment-wait-type "READY_WAIT"

元のタスクセットの終了

元のタスクセットの終了とは、BlueタスクからGreenタスクへの切り替わった後にBlueタスクを終了させることです。

こちらもデプロイメントグループで設定すると、元のタスクを終了させる時間をコントロールすることができ、マネジメントコンソールだけでなくCLIでも対応できます。

$ aws deploy continue-deployment \
    --deployment-id "[DEPLOYMENT+ID]" \
    --deployment-wait-type "TERMINATION_WAIT"

ちなみに、当初はaws deploy continue-deploymentではなくaws ecs delete-task-setで元のタスクを終了できないか試しました。 ところが以下のようなエラーが出力され、CodeDeployでコントロールされているサービスであるため削除できないことを知りました。

$ aws ecs delete-task-set \
    --cluster "[CLUSTER_NAME]" \
    --service "[SERVICE_NAME]" \
    --task-set "[TASKSET_ID]" \
    --force

An error occurred (InvalidParameterException) when calling the DeleteTaskSet operation: Amazon ECS does not support task set management on services where deployments are controlled by AWS CodeDeploy.

おわりに

トラフィックの再ルーティング元のタスクセットの終了は、CodeDeployのデプロイメントグループで設定した期間に達したら勝手に実行されます。

任意のタイミングで実行したい場合、長めに期間を設定しておき、マネジメントコンソールやCLIから実行することで実現できます。

本エントリがどなかたのお役に立てれば幸いです。