はじめに
AWS を触り始めたばかりの頃にやらかした初歩的なミスをまとめたアドベントカレンダー、題して「AWS初歩ミス図鑑」の 17 日目です。
今回は Blue-Greenデプロイメントで手動切り替えを忘れて原因を探し続けた話 を書いていきます。もはやタイトルがオチとなっておりますが、最後まで読んでいただけますと幸いです。
やっていたこと
新機能のリリースに向けて、前任者から引き継いだ環境で Blue-Green デプロイの準備をしていました。
当時は Code三兄弟を用いて良い感じに一生懸命やっておりましたが、いまはなんと…! ECS標準機能になっているみたいです。
話が若干それてしまいましたが、構成はおおまかに以下のような感じでした。
- CodePipeline と CodeDeploy を用いて Blue-Green デプロイ
- Blue環境 → 現在稼働中の ECS
- Green環境 → 新バージョンをデプロイする ECS
- ALB のリスナーで向き先を設定
- TargetGroup が二つあり、Blue-Green デプロイ をするたびアタッチ先が切り替わるイメージ
前任者が残した手順書を頼りに CodePipeline でデプロイを開始し、Green 環境への新バージョンデプロイが順調に完了。CodeDeploy のコンソールを見ても特にエラー等なく完了しているように見えます。
あまりにあっさり終わったので「これで完了…なのか?」と思い、ALB のエンドポイントへアクセスしてみました。
結果
案の定、古いバージョンのサイトが表示されています。
タイトルにオチが書いてありますので、これを読んでいる皆様におかれましては何が原因か一目瞭然かと思いますが、そんなことは知らない初心者エンジニアである私は「でもデプロイ完了って出てるしな…」と、いろいろなリソースを確認してみます。
- ECS の状態
- Blue環境 → 稼働中(古いバージョン)
- Green環境 → 稼働中(新バージョン)
- ターゲットグループの状態
- Blue の TargetGroup → Blue環境のタスクが登録済み
- Green の TargetGroup → Green環境のタスクが登録済み
- もちろん両方とも healthy
- ALBのリスナー設定
- Blue環境の TargetGroup が紐づいている
ALB のリスナーを見たときに古い環境が表示されている理由はわかりましたが、それにしてもどうして CodeDeploy が成功したのに ALB がまだ Blue環境と紐づいているのかがわかりませんでした。このときは。あとはタイトルの通りです。
何を考えていたのか
CodePipeline の「手動承認」設定を完全に忘れていました。
手動承認を設定していると、デプロイ後に「こんな感じで環境出来上がりましたけど、本当に良いですか?」的な画面が表示され、そちらに任意のコメントをつけ足して文字通り手動で「承認」ボタンをクリックして初めて、トラフィックの切り替えや旧環境の削除などの切り替えが行われるようになります。
つまり、ただ待っているだけでは一生環境が切り替わりません。それを理解していませんでした…。
まとめ
デプロイが終わっているにも関わらずいつまでも環境が切り替わらない場合、手動承認等どこかで処理が詰まっている可能性が高いです。エラーログ等で負えないのでわかりにくいですが、事前に設定をよく確認するようにしましょう。
余談になりますが、いまでは ECS だけでも Blue-Green デプロイが完結するようなので、CodePipeline 事態の存在感がちょっと薄れているのかな? という印象です。
個人的には CodeCommit も復活したことですし、また CodeCommit → CodeDeploy → CodePipeline の構築が流行する確率が微レ存、と思っています。(触っていて面白くて好きなので、したらいいな…という願望も含まれております。)