きなこもち.net

.NET Framework × UiPath,Orchestrator × Azure × AWS × Angularなどの忘備録

ecs-deploy × Powershell × ECSへのデプロイをやってみた

Goal

ECSにサービスをデプロイする。

前提

デプロイ対象のコンテナイメージ:ECRにPush済み。
デプロイ処理の実行環境:Windows
利用するシェル:Powershell
利用するコマンド群:aws cli, jq, Powershellの文字列置換(Replace),ConvertFrom-Json

補足

JQコマンドは、こちらのGithubからダウンロードしておく。必要に応じて環境変数を設定しておく。

Step1:Task Definitionの取得

# 対象のタスク定義のARNを取得する
$myTaskDefinitionArn=(aws ecs describe-services --service $my_service_name --cluster $my_cluster_name --profile $my_aws_profile --region $my_aws_region | `
                      ConvertFrom-Json).services[0].taskDefinition
# 対象のタスク定義を取得する。
$myTaskDefinition = aws ecs describe-task-definition --task-def $myTaskDefinitionArn --profile $my_aws_profile --region $my_aws_region

タスク定義は、ConvertFrom-Jsonでオブジェクト化せず、文字列として保持しておく。次のステップで、コンテナイメージを文字列置換するためである。

Step2:コンテナイメージの書き換え

# 指定したイメージ定義のimageプロパティを取得するためのクエリを設定する。
$jqExpr = '(.taskDefinition.containerDefinitions[] | select(.name ==\"' + $target_image_name + '\").image)'
# JQコマンドに↑で作成したクエリを渡して既存のImage URLを取得する。
# 取得したImage URLと、新しいImage URLをReplaceする。
$myTaskDefinition.Replace(($myTaskDefinition |  jq-win64.exe $jqExpr),"""$target_image_url""")

Powershellで、ダブルクォーテーションの取り扱いがいまいちうまくできなかったため、あきらめてクエリの定義と、JQコマンドによるクエリ処理を分割してみた。
一行が短くなったため、可読性的には、これで満足。
ConvertFrom-Jsonを使って成形しようとすると、Jsonのフォーマットをうまく制御できなかったので、文字列として扱う方式にかじを切った。

Step3:aws ecs register-task-definitionコマンドに渡すためのタスク定義の作成

$myTaskDefinition | jq-win64.exe '.taskDefinition | del (.taskDefinitionArn, .revision, .status, .requiresAttributes, .compatibilities)' > task-definition.json

不要なプロパティを削除して、aws コマンドに渡せるようにフォーマットを成形する。

Step4:デプロイ

# Step3で作成したタスク定義をAWSに登録する。登録後、デプロイのため、タスク定義のARNを取得する。
$myNewTaskDefinitionArn = (aws ecs register-task-definition --profile $my_aws_profile --region $my_aws_region --cli-input-json fileb://task-definition.json | `
                           ConvertFrom-Json).taskDefinition.taskDefinitionArn
# アップロードしたタスク定義を使って、更新したいECSサービスを更新する。
aws ecs update-service --cluster $my_cluster_name --service $my_service_name --task-definition $myNewTaskDefinitionArn --profile $my_aws_profile --region $my_aws_region

References

ecs-deployを使ったAmazon ECSへのデプロイの裏側
ecs-deploy

まとめ

今回は、ecs-deploy相当の作業をWindoes - Powershellで行おうとすると、どうなるかという観点でやってみた。
一通りできたが、デプロイ後の処理については、未確認となっている。デプロイした後、新しいタスク定義を使ったサービスだけが動くようになるまでの観測も必要そうなので、今後実践してみたい。