1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ECR・ECSを使用して、Blue/Greenデプロイを行う

Posted at

目次

  1. 背景
  2. 前提条件
  3. ECSクラスターの作成
  4. Blue/Greenデプロイに必要なリソースを作成
  5. デプロイをしてみる

背景

前回記事 NuxtのアプリをDockerに移行して、ECRにプッシュするまで

とりあえず、ECRにプッシュするのはできましたよ~と。
ECRにプッシュしたら、それをトリガーにして本番環境にも自動で反映される様にしたいなと。(ざっくり)
色々調べてみたら、Blue/Greenデプロイっていうのが良さそうなのよね。

Blue-Green Deploymentは、検証環境をそのまま本番環境として利用することで、システムの停止時間を最小にするデプロイ手法です。 Blue-Green Deploymentをクラウドで実現するには、容易に検証環境を用意できることや、システムを簡単に切り替えられることが重要です。

うんうん、いいじゃん。
これやってみよう。

参考

AWS FargateでBlue/Greenデプロイを行う

いつものごとく、先人たちの知恵に乗っかっていくパターン。

前提条件

  1. ECRにリポジトリが作成されていること
  2. ECRにリポジトリにlatestタグがついたDockerメージがpushされていること
  3. 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デプロイはできたっぽい。
あとはこれを自動化すれば…ってところでしょうか。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?