AWS ECSコンテナのBlue/Greenデプロイ
ハンズオンのリンク
https://pages.awscloud.com/rs/112-TZM-766/images/AWS_CICD_ECS_Handson.pdf
↑の詳しい動作解説
https://blog.serverworks.co.jp/cicd-ecs-build-deploy-flow
Blue/Greenデプロイメントの図解
https://www.sunnycloud.jp/column/20210620-01/
今回はテストリスナー無しパターンで実施しました。
ハンズオンからの変更点
- NAT Gatewayで課金されたくなかったのでCloudformationテンプレートから
NAT Gateway、プライベートサブネットのルート定義を削除
- NAT Gatewayを削除したのでECSはプライベートではなくパブリックに配置
- ハンズオンではGitクライアント、Dockerを利用するためにcloud9を 構築しているが自分のPCに変更
ハマった点
ECSが画面から入力する設定が多く、設定間違いでタスクやらALBを
何度も作り直す。。。
あとはaws CLIのバージョンアップの影響らしく、Codeシリーズでハマった。
1.コマンドの使い方が違いますエラー
[Container] 2023/01/22 10:16:26 Running command $(aws ecr get-login --region $AWS_DEFAULT_REGION --no-include-email)
usage: aws [options] <command> <subcommand> [<subcommand> ...] [parameters] To see help text, you can run:
→ハンズオンではなく公式ドキュメントを確認すると、なんかコマンドが違う。
コマンドをget-login-passwordに変更
2.Login: not foundエラー
/codebuild/output/tmp/script.sh: 4: Login: not found
→1行目コマンドの先頭の$(と末尾の)を削除
3.またエラー
Phase context status code: COMMAND_EXECUTION_ERROR Message: Error while executing command: docker push $REPOSITORY_URI:latest. Reason: exit status 1
サンプルのリージョンがusになってたので東京リージョンに変更
10度目のデプロイにしてようやく成功。3時間ぐらいかかりました。
あれ?CodePipeline使って何しようとしてたんだっけ?となる。
動作確認
リリース前
リリース前ALBのターゲットグループ Blue側(~fargate-1)にリンクしている
タスクは1つだけ稼働している
リリース後
ターゲットグループは1系から2系へ変わる(~fargate-2)
新コンテナがリリースされ、旧コンテナは設定した猶予期間だけ残る
猶予期間経過後
旧コンテナは自動削除
感想
始めてcodeシリーズを使いましたがデプロイ時間が意外と長い。
10分は待たされているイメージ。
待たされた挙句エラーで止まるので構築に時間がかかる。
※成功すると2分ぐらいで終了するようです。
gitからリポジトリにpushしてしまえば、あとは全自動でリリースなのは素晴らしい。
結構色々準備は必要ですが、ここまで一貫したリリースの仕組みをベンダーから
提供しているのはすごいことだと思います。