📘

No.4【AWS】ECS Fargate+CodePipeline - ECS Fargate設定編

2023/04/04に公開

はじめに

この記事は以下の続きとなる。

https://zenn.dev/omizunomitaro/articles/8fc2a612a1199b
https://zenn.dev/omizunomitaro/articles/d9d360a15cc7f4
https://zenn.dev/omizunomitaro/articles/f3b24a954d67c9

つまづきポイント

構築する環境構成

構築手順

セキュリティグループ設定

以下、セキュリティグループを作成する。

ECSに設定するセキュリティグループ

役割 IN/OUT IPバージョン タイプ プロトコル ポート範囲 ソース
ECS Fargate用 IN IPv4 カスタムCP TCP 8080 0.0.0.0/0
ECS Fargate用 OUT IPv4 すべてのトラフィック すべて すべて 0.0.0.0/0

ALBに設定するセキュリティグループ

役割 IN/OUT IPバージョン タイプ プロトコル ポート範囲 ソース
ALB用 IN IPv4 カスタムCP TCP 80 自分のIP/32
ALB用 OUT IPv4 すべてのトラフィック すべて すべて 0.0.0.0/0

エンドポイントに設定するセキュリティグループ

役割 IN/OUT IPバージョン タイプ プロトコル ポート範囲 ソース
ALB用 IN IPv4 すべてのトラフィック すべて すべて 0.0.0.0/0
ALB用 OUT IPv4 すべてのトラフィック すべて すべて 0.0.0.0/0

エンドポイント設定

以下、エンドポイントをPrivateサブネットに設定する。

サービス名 エンドポイントタイプ
com.amazonaws.リージョン.ecr.dkr Interface
com.amazonaws.リージョン.logs Interface
com.amazonaws.リージョン.ecr.api Interface
com.amazonaws.リージョン.s3 Gateway

ALB設定

ダミーのターゲットグループを作成する。

  1. EC2ターゲットグループよりターゲットグループ作成画面に遷移する。
  2. 以下設定でターゲットグループを作成する。
  • IP addressを選択する。

  • VPCはECSを動かすために作成した対象のVPCを選択する。

  • 最終的にこのダミーターゲットグループは削除するためその他設定は適宜設定する。

ALBを作成する。

  1. EC2ロードバランサーよりロードバランサー作成画面に遷移する。
  2. 以下設定でロードバランサーを作成する。
  • ALBを選択する。
  • SchemeはInternet-facingでIPv4を選択する。
  • ALB名は任意の名前を設定する。
  • VPCはECSを動かすために作成した対象のVPCを選択し、privateサブネットを選択する。
  • セキュリティグループは上記で作成したものを選択する。
  • リスナーは上記で作成したダミーターゲットグループを選択する。

ダミーターゲットグループを削除

ALBに設定したターゲットグループを設定から外し削除する。

  1. EC2ロードバランサーより作成したALBを選択する。
  2. Listenersタブより設定されているリスナーを削除する。
  3. EC2ターゲットグループより作成したダミーターゲットグループを削除する。

ECS Fargate設定

クラスタ作成

  1. Elastic Container Serviceクラスターの作成よりクラスター新規作成画面へ遷移する。
  2. 以下設定でクラスターの作成をする。
  • クラススター名は任意の名前を設定する。
  • VPCはECSを動かすために作成した対象のVPCを選択し、privateサブネットを選択する。

タスク定義作成

  1. Elastic Container Serviceタスク定義より新規タスク定義作成画面へ遷移する。
  2. 以下、タスク定義とコンテナの設定をする。
  • タスク定義名は任意の名前を設定する。
  • 名前にはコンテナ名を指定する。
  • イメージURIには作成したコンテナイメージを管理しているECRのリポジトリを以下書式で指定する。
    <ECRリポジトリのURL>/イメージ:タグ
    今回の例では以下のように設定する。
    <aws id>.dkr.ecr.<リージョン>.amazonaws.com/node-sample:latest
  • コンテナが提供するサービスのポート番号を指定する。今回は8080を設定する。
  1. 以下、環境設定をする。
  • 環境がFargateが選択されていることを確認する。
  • アーキテクチャを選択する。今回はCloud9上でビルドしたイメージのため、それにあわせてx86_64を設定する。
  • 動かすサービスにあわせてタスクサイズを設定する。
  • タスク実行ロールecsTaskExeuionRoleを設定する。

サービス作成

  1. Elastic Container Service→作成したクラスター選択→サービスタブ→作成からサービス作成画面に遷移する。
  2. 以下、サービス設定をする。
  • コンピューティング設定がキャパシティープロバイダー戦略が選択されていることを確認する。

  • アプリケーションタイプがサービスを選択していることを確認する。

  • 作成したタスク定義を選択する。リビジョンは最新の物を選択する。

  • サービス名は任意の名前を設定する。

  • 必要なタスクは起動するタスク数を記入する。

  • VPCはECSを動かすために作成したものを選択する。

  • サブネットはprivateサブネットのみを選択する。

  • 作成したセキュリティグループを選択する。

  • privateサブネットでECSを起動する場合はパブリックなIPは不要なためパブリックIPはオフにする。

  • ロードバランシングオプションApplication Load Balancerを選択する。

  • 既存のロードバランサーを使用を選択し作成したALBを選択する。

  • 新しいリスナーを作成を選択する。

  • ポート番号:80 プロトコル:HTTPを設定する。

  • 新しいターゲットグループの作成を選択する。

  • 任意のターゲットグループ名を設定する。

  • Auto Scaling設定が必要な場合はAuto Scalingオプションにチェックを入れて設定する。今回は割愛。

動作確認

  1. サービスを作成するとCloudFormationが実行されサービスが作成される。
  2. 作成したALBのDNS nameに対してブラウザからアクセスする。
    以下のように出力されたら構築成功。

動かない時の切り分け

  • 今まで何回かECS環境を構築してきたが一発でうまく動いたためしがない。
  • そのため、切り分け時のチェックポイントをメモしておく。
  1. コンテナは起動しているか。
    タスク定義→実行中のタスクのリビジョン→コンテナタブを確認すると
    コンテナの起動状態と失敗時のログが確認できる。
  2. コンテナイメージをpullできているか。
  • pullに失敗している場合、
    privateサブネットからECRへのアクセスに失敗していると思われる。
  • エンドポイントの設定やエンドポイントに設定したセキュリティグループを見直す。
  • ECSのタスク定義からパブリックIPを付与する設定にしてpublicサブネットで立ち上げて、
    ECRとインターネットGW経由で接続できるか確認するのも有効。
  1. ターゲットグループに立ち上げたECSタスクが認識されているか。
    コンテナが立ち上がっていてターゲットグループに
    ECSタスクが表示されない場合はprivateサブネットとpublicサブネット間の
    通信に問題がある場合が多い。

Discussion