3
0

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 1 year has passed since last update.

ECSブルーグリーンデプロイメントをゼロから構築する。(その5:ECSとCodeDeployの作成)

Last updated at Posted at 2023-11-25

はじめに

前回はブルーグリーンデプロイ用のELBとレコード作成を行いました。

ここまで長くかかりましたが、今回はブルーグリーンデプロイメントの設定としては最後となるECSの各種設定を行っていこうと思います。

ECSの設定について

ECSにはクラスタ、サービス、タスクの概念があり、ブルーグリーンデプロイメントの設定を行うため、それぞれ設定を行う必要があります。

タスクはその3で作成したタスク定義を使って起動したコンテナプロセスとなることから、ここで設定することは無いため、クラスタとサービスについて以下より作成していきます。

ECSクラスタの作成

Amazon Elastic Container Service」ダッシュボードの「クラスター」→「クラスターの作成」でECSクラスタを以下のように作成します。

項目 設定 備考
クラスター名 blue-green-cluster 任意の名前を指定
デフォルトの名前空間 blue-green-cluster 任意の名前を指定
インフラストラクチャ AWS Fargate(サーバーレス) 今回はFargateを指定
モニタリング 無効 今回はデフォルトのまま
タグ 空欄 今回はデフォルトのまま

もし、ECSクラスタ作成時にエラーが発生した場合は以下「ECSクラスタ初回作成時のエラー」を参照してください。

ECSクラスタ初回作成時のエラー

何かしらのECSクラスタを作成すると、裏でCloudFormationが動作してAWSServiceRoleForECSというIAMロールなどの必要リソースやECSクラスタが自動作成されますが、ECSクラスタが一度も作成されておらず、AWSServiceRoleForECSが存在しない場合、以下のようなエラーが発生します。

クラスター blue-green-cluster の作成中にエラーが発生しました。
Resource handler returned message: "Error occurred during operation 'CreateCluster SDK error: Service Unavailable. Please try again later. (Service: AmazonECS; Status Code: 500; Error Code: ServerException; Request ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx; Proxy: null)'." (RequestToken: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, HandlerErrorCode: GeneralServiceException)

再度同じECSクラスタ名で作成しようとしても、すでに存在するといったエラーが表示されてしまうため、上記のエラーが発生した場合は「CloudFormation」ダッシュボードの「スタック」→「スタックの詳細」より、「ROLLBACK_COMPLETE」となっている「Infra-ECS-Cluster-[ECSクラスタ名]-xxxxxxxx」というスタックを選択し、「削除」でスタックを削除します。

Monosnap_20231112_160549.png

なお、上記CloudFormationのスタックを削除してもAWSServiceRoleForECSロールは削除されないため、再度ECSクラスタを作成すればエラーにならずに作成できます。

ECSサービスの作成

続いてECSサービスも作成していきます。

私の記憶では、2023年秋くらいまでは旧タイプのGUIコンソール形式に変えないとブルーグリーンデプロイメントの設定を行うことができませんでしたが、2023年11月現在では、新タイプのGUIコンソールでも設定できるようになっていたので、そのまま進めていきます。

作成したECSクラスタの画面の「作成」よりECSサービスを作成していきます。

Monosnap_20231112_163324.png

項目が多いですが、以下のようにECSサービスを作成していきます。

項目 設定 備考
コンピューティングオプション キャパシティープロバイダー戦略 今回はデフォルトのまま指定
キャパシティープロバイダー戦略 カスタムを使用(アドバンスト)
キャパシティープロバイダー FARGATE 任意に指定
ベース 0 任意に指定
ウェイト 1 任意に指定
プラットフォームのバージョン LATEST
アプリケーションタイプ サービス ブルーグリーンデプロイメント設定のためサービスを指定
リビジョンの手動指定 チェックなし
ファミリー blue-green-test-taskdef その3で作成したタスク定義を指定
リビジョン 1(最新)
サービス名 blue-green-service 任意の名前を指定
サービスタイプ レプリカ
必要なタスク 1 今回はテストのため1を指定
デプロイタイプ ブルー/グリーンデプロイ(AWS CodeDeployを使用) デプロイオプションより指定
デプロイ設定 CodeDeployDefault.ECSAllAtOnce 任意のデプロイ設定を指定
CodeDeployのサービスロール blue-green-test-role その3で作成したIAMロールを指定
Service Connect チェックなし デフォルトのままチェックなし
サービス検出 チェックなし デフォルトのままチェックなし
VPC blue-green-vpc その1で作成したVPCを指定
サブネット blue-green-subnet-private1-ap-northeast-1a
blue-green-subnet-private2-ap-northeast-1c
その1で作成したプライベートサブネットを指定
セキュリティグループ 既存のセキュリティグループを使用 その3で作成したFargate用セキュリティグループを指定
セキュリティグループ名 blue-green-test-fargate-sg その3で作成したFargate用セキュリティグループを指定
パブリックIP オフ 今回はELB経由でFargateにアクセスするためオフとする
ロードバランサーの種類 Application Load Balancer
Application Load Balancer 既存のロードバランサーを使用
ロードバランサー blue-green-elb その4で作成したロードバランサーを指定
ヘルスチェックの猶予期間 0 今回は0のままとする
ロードバランス用のコンテナの選択 nginx 80:80
プロダクションリスナー 既存のリスナーを使用 作成済みのリスナー指定のため既存のリスナーを指定
プロダクションリスナー 443:HTTPS 作成済みのリスナーを指定
テストリスナーを追加 チェック テストリスナーを作成するためチェック
テストリスナー 既存のリスナーを使用 作成済みのリスナー指定のため既存のリスナーを指定
テストリスナー 4430:HTTPS 作成済みのリスナーを指定
ターゲットグループ1 既存のターゲットグループを使用 作成済みのターゲットグループを指定
ターゲットグループ1名 blue-green-blue-tg
ターゲットグループ1ヘルスチェックパス /index.html
ターゲットグループ1ヘルスチェックプロトコル HTTP
ターゲットグループ2 既存のターゲットグループを使用 作成済みのターゲットグループを指定
ターゲットグループ2名 blue-green-green-tg
ターゲットグループ2ヘルスチェックパス /index.html
ターゲットグループ2ヘルスチェックプロトコル HTTP
サービスのオートスケーリングを使用 チェックなし 今回はテストのためチェックなし
Amazon ECSマネージドタグを有効にする チェックする デフォルトのままチェックあり
タグの伝播元 伝播しない デフォルトのまま指定

リスナー設定がややこしいので、以下リスナー設定部分のみ抜粋。

その4で設定したリスナールール設定でプロダクションリスナーとテストリスナー共に同じターゲットグループを指定していた場合、ECSサービスの作成に失敗するため、もし同じターゲットグループを指定していた場合は、リスナールールのターゲットグループ設定を修正してください。

Monosnap_20231112_172835.png

なお、今回ブルーグリーンデプロイ用の設定を行うため、「デプロイタイプ」は「ブルー/グリーンデプロイ」を選択しましたが、デプロイタイプの設定は後から変更できないため、もし誤って「ローリングアップデート」を選択してしまった場合は、再度作り直しを行ってください。

無事正常に作成できれば以下のように表示されるため、ECSサービスがアクティブになることを確認します。

Monosnap_20231112_173807.png

CodeDeploy設定の確認

ECSサービスのデプロイタイプをブルーグリーンデプロイで作成した場合、ブルーグリーンデプロイメント用のCodeDeployアプリケーションが自動的に作成されます。

CodeDeploy」ダッシュボードの「デプロイ・CodeDeploy」→「アプリケーション」にAppECS-[ECSクラスタ名]-[ECSサービス名]のように作成されていることを確認します。

Monosnap_20231112_174520.png

もし自動作成されるCodeDeployアプリケーションではなく、自分で名前を指定して作成したい場合は以下を参照してください。

CodeDeployの名前を手動で設定する場合

CodeDeployアプリケーション名を手動で設定したい場合に実施してください。

自動作成されるCodeDeployアプリケーションは名前を指定したり修正することができないため、任意の名前を指定するためには、CloudFormationterraform等のIaCツールでコーディングして作成するか、自動作成されるCodeDeployアプリケーションを一度削除して、再度手動で作成する必要があります。

CodeDeploy」ダッシュボードの「デプロイ・CodeDeploy」→「アプリケーション」より、自動作成のアプリケーション名を選択し、「アプリケーションの削除」で削除します。

Monosnap_20231112_175232.png

削除後、「アプリケーションの作成」より以下のようにCodeDeployアプリケーションを作成します。

項目 設定 備考
アプリケーション名 blue-green-deploy-app 任意の名前を指定
コンピューティングプラットフォーム Amazon ECS ブルーグリーンデプロイメントのためECSを指定
タグ 空欄 今回は未指定

続いて「デプロイグループの作成」から以下のようにデプロイグループを手動で作成します。

項目 設定 備考
デプロイグループ名の入力 blue-green-deploy-group 任意の名前を指定
サービスロールの入力 blue-green-test-role その3で作成したIAMロールを指定
ECSクラスター名を選択します blue-green-cluster 先程作成したECSクラスタ名を指定
ECSサービス名を選択します blue-green-service 先程作成したECSサービス名を指定
Load balancerを選択 blue-green-elb その4で作成したロードバランサーを指定
本稼働リスナーポート HTTPS:443 その4で作成した本稼働リスナーポートを指定
テストリスナーポート HTTPS:4430 その4で作成したテストリスナーポートを指定
ターゲットグループ1の名前 blue-green-blue-tg それぞれ別々のターゲットグループを指定
ターゲットグループ2の名前 blue-green-green-tg それぞれ別々のターゲットグループを指定
トラフィックの再ルーティング すぐにトラフィックを再ルーティング 今回はデフォルトのままとする
デプロイ設定 CodeDeployDefault.ECSAllAtOnce 今回はデフォルトのままとする
元のリビジョンの終了 ※デフォルトのまま 今回はデフォルトのままとする
詳細 ※デフォルトのまま 今回はデフォルトのままとする

おわりに

5回にわたり設定を行ってきたブルーグリーンデプロイメントですが、今回で設定としては完了となります。

次回はブルーグリーンデプロイ動作の確認や外部からのアクセスを試してみようと思います。

3
0
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
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?