ecs-deployのコードリーディングをしました。バージョンは3.4.0です。

以下のパターンで追ってみます。/ecs-deployのシェルスクリプトが実体になります。

最初の方は定数とメソッドが定義されていて、最後にメインの処理が書かれています。

シェルからecs-deployのコマンドを実行した場合は$BASH_SOURCE = $0になり、分岐の中が実行されます。while, case文の中でoptionをパースしています。

requireではコマンドがインストールされていてパスが通っているかを確認しています。

ecs-deployはaws-cliとjq(JSONパースして属性値取り出す用)を使っているのでrequireで確認しています。

次にassertRequiredArgumentsSet関数で必須のオプションが指定されているかどうかをチェックしています。

assumeRoleでは aws sts assume-roleでAssumeRoleした後、レスポンスのAPIクレデンシャルを各環境変数(AWS_ACCESS_KEY_IDなど)にセットします。

次にparseImageName関数で指定したイメージ名をパースしてecs-deploy用にイメージ名を再構築します。

getCurrentTaskDefinition関数ではaws ecs describe-servicesaws ecs describe-task-definitionでクラスタ・サービスに紐づくタスク定義を抽出します。

createNewTaskDefJson関数では既存のタスク定義をsedで書き換えて更新用のタスク定義JSONを生成します。

 registerNewTaskDefinition関数でcreateNewTaskDefJsonで生成したJSONファイルを元に aws ecs register-task-definitionを使って新しいタスク定義を登録します。

-nオプションが指定されている場合は、updateServiceが実行されます。

updateService関数はaws ecs update-serviceでクラスター・サービス・タスク定義を引数に既存サービスを更新します。

最後にwaitForGreentDeploy関数を実行します。 aws ecs describe-servicesでサービスのデプロイ数を取得し、1であればループを抜け、そうでなければ2秒sleepしたのち再度デプロイ数をチェックします。

 タイムアウトした場合はrollbackが走ります。

rollbackは aws ecs update-serviceでtask-definitionに$LAST_USED_TASK_DEFINITION_ARNを指定します。

LAST_USED_TASK_DEFINITION_ARNはgetCurrentTaskDefinitionで設定されるデプロイ前の最新のタスク定義ARNになります。