エンジニアを目指す日常ブログ

日々勉強したことのメモ。独学ですので間違っていたらコメント等で教えてください。

ECS(Fargate)でコンテナを起動その2(ALBを利用したルーティング&CodeDeployの下準備)

はじめに

記事の目的

以前の記事では、パブリックサブネット上に直接ECSサービスを作成し、タスクに割り当てられたIPアドレスに直接アクセスした。

tomiko0404.hatenablog.com

これだとタスクを起動するたびにIPアドレスが変わってしまうので、今回は、ALBを用意してコンテナへのルーティングを実施する。

前提・環境

VPCの作成方法とパブリックサブネットの作成方法は以下に記載。 tomiko0404.hatenablog.com

実施内容(サマリ)

ALBを作成→ECSのサービスを作成の順番で実施する。

参考資料:
https://pages.awscloud.com/rs/112-TZM-766/images/AWS_CICD_ECS_Handson.pdf

ALBの作成

ALB用セキュリティグループ作成

マネジメントコンソールの「VPC」→「セキュリティグループ」

インバウンドルールの設定を実施。

  • タイプ:HTTP
  • ソース:0.0.0.0/0(フルオープン)
    インバウンドルールの設定
    インバウンドルールの設定

ALBの作成

マネジメントコンソールの「EC2」→「ロードバランサー」→「ロードバランサーの作成」

  • 今回はALBを選択
  • Schemeは「Internet-facing」を選択。(インターネットからアクセスしたいので)
  • IP address type は「IPv4」を選択。
  • VPCは先ほど作ったVPCを選択。
  • Mappingにサブネットを設定する。「public-subnet-1a」と「public-subnet-1c」を選択。(インターネットからアクセスしたいので)
    サブネットの設定は、ヘルプを見ると「2つ以上のアベイラビリティーゾーン(AZ)を有効にする」「AZごとに1つのサブネットを選択」とのこと。
  • 「Security Group」は先ほど作成したものを選択。
  • Listenerの設定でターゲットグループの設定を求められるので、適当にCreate target groupしておく。(このターゲットグループは使わないので後で消す)
    リスナーとは「リスナーとは、設定したプロトコルとポートを使用して接続リクエストをチェックするプロセスです。リスナーに対して定義したルールにより、ロードバランサーが登録済みターゲットにリクエストをルーティングする方法が決まります。」とのこと。

Application Load Balancer のリスナー - Elastic Load Balancing

リスナーとターゲットグループの削除

先ほど作ったリスナーとターゲットグループを削除しておく。

リスナーはロードバランサの詳細画面から、ターゲットグループはEC2コンソールの「ターゲットグループ」から。

IAMロールの作成

Fargateサービスで「ブルーグリーンデプロイメント」をする際に、CodeDeployを利用可能なIAMロールを与える必要があるので、事前に作成する。

IAMロールの作成 → 「CodeDeploy」→「CodeDeploy - ECS」を選択する。

Fargateサービスの作成

タスク定義の作成

  • 起動タイプはFargateとする。
  • タスクロールは無しとする。
  • ネットワークモードは変更しない。
  • タスクメモリ(GB)とタスクCPU(vCPU)は最小のものにする。
  • コンテナを追加。
    • イメージはECRからURLコピーしてdockerイメージを指定する。
    • ポートマッピングは80とする。

サービスの作成

作成したタスク定義から「アクション」→「サービスの作成」

基本設定

  • 起動タイプはFargateとする。
  • プラットフォームのバージョンはLATESTとする。
  • クラスターは以前作成したクラスターを選択する。
  • タスクの数は今回1とする。
  • 最小ヘルス率は50としておく。最大率は200としておく。
  • デプロイメント方法を指定する。
    • ローリングアップデート:最小ヘルス率と最大率で指定されたタスク数を守りながら、旧バージョンから新バージョンにタスク定義を切り替える。
    • Blue/Greenデプロイメント:そもそもブルーグリーンデプロイメントは、本番環境を2つ用意しておき、ロードバランサの向き先を旧環境から新環境に変更することでリリースする方法。

参考:3分でわかる ブルーグリーンデプロイメント | 日経クロステック(xTECH)

今回はBlue/Greenデプロイメントを選択する。

  • デプロイ設定は「CodeDeployDefault.ECSAllAtOnce」とする。
  • CodeDeploy のサービスロールは先ほど作ったIAMロールを設定する。

ネットワーク設定

  • クラスタVPCは作成したVPCを設定する。
  • サブネットは以下を設定する。(「現時点ではプライベートサブネットのみサポートしています。」との注意が表示される。以前パブリックサブネットでもできたが…)
    • private-subnet-1a
    • private-subnet-1c
  • セキュリティグループは新規作成でHTTPのフルオープンを設定しておく。
  • パブリックIPの自動割り当ては「Disabled」にする。(今回はALB経由でアクセスするため)
  • ロードバランサの種類は「ALB」を選択する。
  • ロードバランサ名は先ほど作ったロードバランサを設定する。
  • ロードバランス用のコンテナを追加する。
    • プロダクションリスナーポートは80とする。
    • テストリスナーはチェックを外しておく。
    • Blue/Greenデプロイメントのために2つのターゲットグループを作成する。
  • AutoScalingは無しにしておく。

結果の確認

タスクが作成された。

タスク作成結果
タスク作成結果

作成していたロードバランサーにリスナーが追加された。

リスナーが追加
リスナーが追加

ターゲットグループが作成された。 IPアドレス欄に記載されているプライベートIPアドレスは、先ほど作成されたタスクのプライベートIPアドレスと一致する。

ターゲットグループ
ターゲットグループ

ALBのDNS名にアクセスすると、作成したアプリが表示された。

ALBのDNS名
ALBのDNS

Webアプリ
Webアプリ

構成図(イメージ)

おそらくこんな感じ。

構成図(イメージ)
構成図(イメージ)

おわりに

ECS Fargateでコンテナを立ち上げてALB経由でアクセスすることができた。デプロイの方法は後日実施する。

関連記事

このあと実施したこと