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