目次
- 背景
- 前提条件
- ECSクラスターの作成
- Blue/Greenデプロイに必要なリソースを作成
- デプロイをしてみる
背景
前回記事 NuxtのアプリをDockerに移行して、ECRにプッシュするまで
とりあえず、ECRにプッシュするのはできましたよ~と。
ECRにプッシュしたら、それをトリガーにして本番環境にも自動で反映される様にしたいなと。(ざっくり)
色々調べてみたら、Blue/Greenデプロイっていうのが良さそうなのよね。
Blue-Green Deploymentは、検証環境をそのまま本番環境として利用することで、システムの停止時間を最小にするデプロイ手法です。 Blue-Green Deploymentをクラウドで実現するには、容易に検証環境を用意できることや、システムを簡単に切り替えられることが重要です。
うんうん、いいじゃん。
これやってみよう。
参考
いつものごとく、先人たちの知恵に乗っかっていくパターン。
前提条件
- ECRにリポジトリが作成されていること
- ECRにリポジトリにlatestタグがついたDockerメージがpushされていること
- ECSクラスターが作成されていること
1と2は、前回記事までの内容でOKですね。 っていうことで3の「ECSクラスターの作成」からやっていきます。
ECSクラスターの作成
マネジメントコンソールから「クラスターの作成」をクリックし、「ネットワーキングのみ」を選択。
クラスター名はまあ適当につけます。
「VPCを新しく作成する」みたいなチェックボックスがあるけど、VPCははるか昔に作ったのがあるので今回はチェックを入れません。
TagsとかCloudWatch Container Insightsとかもとりあえずいいや…(面倒くさがり)
名前しか決めていないけど、さっくりとクラスターは作成できました。
Blue/Greenデプロイに必要なリソースを作成
IAMロールの作成
「AWSCodeDeployRoleForECS」という管理ポリシーをアタッチしたIAMロールを作成しました。
ALBの作成
ALBは既にあるけど、テストもしたいから別で新しく作成しました。
参考URLの中で「8080」にも許可しているのは、テスト用のポートとしてってことだね。
とりあえず、ブルー用のターゲットグループだけ新規作成してFinish。
タスクの定義の作成
Fargateのタスクの定義の作成方法については省略させていただきます。
省略されても困る!
ってことで、とりあえず色々調べながらこんな感じに。
ECSのコンソールから「新しいタスク定義の作成」をクリック。
「起動タイプの互換性の選択」は「FARGATE」。
タスク定義名はまあ適当に。
タスクロールはさっき作ったIAMロール。
タスクサイズは…現行のNuxtサーバーがt2.smallで動いているから、メモリ2GBの1vCPUにするよと。
コンテナの追加から、
コンテナ名はまあ適当に
イメージはpushしたときのECRのレポジトリをペロッと張り付けて
ポートマッピングについては、Dockerで使用しているPORTを選択。
さくっとタスク定義が作成されました。
ECSサービスの作成
サービスの設定
起動タイプは「FARGATE」。
タスク定義は一個前で作成したタスク定義。
リビジョンは…デフォルトの表示だと「6 (latest)」になっているけど、これって7とか8がlatestになったら自動で変えてくれるんか…?
なんかわからんけど、このままにしておく。
サービス名は、例のごとく適当に。
タスクの数は1にしておく。
デプロイメント
「Blue/Green デプロイメント (AWS CodeDeploy を使用)」を選択。
サービスロールは、さっき作ったIAMロールでいく。
VPC とセキュリティグループ
クラスターVPC・サブネット・セキュリティグループは、Nuxtを動かしたい場所を選択。
ロードバランシング
ALBにチェックを入れ、先ほど作成したALBを選択。
ロードバランス用のコンテナ
デフォルトで、コンテナが選択されている。
「ロードバランサーに追加」をクリック。
プロダクションリスナーポート(たぶんメインで使用されるポート?)はHTTPS:443にして、
テストリスナーポートはHTTP:<テスト用ポート>としました。
Additional configuration
ターゲットグループ1は、ALB作成時に作成したstg-fargate-blueを選択します。
なんでかわからんけど、ここは参考記事のままにはいかない。
「新規作成」しか選べないのだ、なんかわからんけど。
とりあえずHTTPで、パスパターンは「*」ヘルスチェックパスやらは「/」で乗り切る。
サービス作成実行
ここまでの内容で、サービスを作成してみる。
エラーはなし。
気になるのは、ALBのルールが二つできちゃっていること。
デフォルトルールはALB作成時に作られちゃったもので消せないし…
一旦このままでいい…のか?
デプロイグループのデプロイ設定を変更
デプロイグループのデフォルトの設定では、デプロイされた際に、新しくデプロイが行われた側のターゲットグループに、トラフィックが自動で流れ始めてしまいます。
今回は、動作確認をしてからターゲットグループの変更を行いたいため、トラフィックの再ルーティングするタイミングを指定します。今回は15分後に、再ルーティングされるように変更します。この設定をすることで、15分間待たなくても手動で再ルーティングすることも可能です。詳細は後述。また、デフォルトの設定では、タスクの正常な展開後(再ルーティング後)1時間待ってから元のタスクが終了します。今回は30分後にタスクが終了するように設定を変更します。
デプロイグループを選択し、「編集」ボタンを押下することで、デプロイ設定画面が表示されます。
なるほどね。
こちらも15分と30分に設定しておく。
デプロイをしてみる
現状確認
443は通るが、テスト用ポートは通らない。 443はターゲットグループ1、テスト用ポートはターゲットグループ2に向いている。
デプロイ実行
まず、ECRにプッシュ。
ECRのリポジトリ上に新しいイメージができていることを確認。
ECSのサービスで「更新」を押し、「プラットフォームのバージョン」を「LATEST」にしてサービスの更新。
「タスク」タブに2つのタスクが表示されていることを確認。
443の方では変更前のものが、テスト用ポートの方では変更後のものが表示されることを確認。
「デプロイ」タブからデプロイIDをクリックすると、デプロイ状況を確認できる画面に遷移する。
「トラフィックの再ルーティング」をクリック。
443の方でも、変更後のものが表示されることを確認。
443・テスト用ポートのどちらも、ターゲットグループ2に向いている。
「元のタスクセットの終了」をクリック。
443・テスト用ポートのどちらでも、引き続き変更後のものが表示されることを確認。
443・テスト用ポートのどちらも、ターゲットグループ2に向いている。
テスト用ポートはこのまま見れて良いのか…?(テスト用ポートはターゲットグループ1に変わると思ってた)
とりあえずもう一回やってたところ、同じ流れをたどって最終的には443・テスト用ポートどちらもターゲットグループ1になった。なるほどね~。
まとめ
とりあえず、Blue/Greenデプロイはできたっぽい。
あとはこれを自動化すれば…ってところでしょうか。