ECS + ALB + ACM + Route53での環境構築とAPIのデプロイ

2023/10/27に公開

ECSを使ってドメインからhttpsでAPIを叩きたいケースの構築例。

今回のAWS環境

  • VPC
    • ECS
      • ECR
    • EC2
      • Load Balancing
        • Load Balancer
          • ALB
        • Target Group
  • ACM
    • Certificate
  • Route53
    • Domain
    • Hostzone
  • DynamoDB
  • Cognito
各項目の説明
  • VPC(Virtual Private Cloud): AWS上で仮想プライベートネットワークを提供するサービス。リソースを安全に実行するための論理的分離されたセクションを設定できる。
    • ECS(Elastic Container Service): Dockerコンテナの実行と管理をするための完全にマネージドされたサービス。
      • ECR(Elastic Container Registry): Dockerコンテナイメージを簡単に保存、管理、デプロイできるフルマネージド型のコンテナリポジトリ。
    • EC2(Elastic Container Registry): クラウド上で仮想サーバーを提供するサービス。スケーラビリティと容量を簡単に調整できる。
      • Load Balancing: 複数のインスタンス、コンテナ、または他のリソースへのトラフィックを自動的に分散させる機能。
        • Load Balancer
          • ALB(Application Load Balancer): アプリケーションのトラフィックを複数のターゲット (EC2インスタンス, ECSタスクなど) に自動的に分散する。レイヤー 7 のロードバランサー。
        • Target Group: ロードバランサーがトラフィックをルーティングする一連のターゲット。
  • ACM (AWS Certificate Manager): SSL/TLS サーバー証明書を簡単に取得、管理するサービス。
    • Certificate: ACM で提供・管理される SSL/TLS 証明書。
  • Route53: スケーラブルで高い可用性を持つクラウドドメイン名システム (DNS) ウェブサービス。
    • Domain: インターネット上の特定のウェブサイトやウェブリソースのアドレス。
    • Hostzone: Route 53でドメインとそのサブドメインのDNS設定を管理するためのコンテナ。
  • DynamoDB
    • フルマネージド型の NoSQL データベースサービス。高い耐障害性とスケーラビリティを持つ。
  • Cognito
    • ウェブアプリやモバイルアプリのユーザー認証、ユーザー登録、アクセスコントロールを提供するサービス。

関係図

全体的なざっくりした解説

  • Application, Client
    • Applicationはバックエンドアプリ、DockerでECR用の環境を作成しておく。
    • ClientはApplicationをAPI経由でアクセスするWebサイトやアプリなど。
  • Cognito, DynamoDB
    • Cognito, DynamoDBはバックエンドアプリ内から実行することが多い。
    • CognitoはAmplifyを使ってフロントからアクセスすることもある。
  • Route53でドメインを購入するとHostZoneが設定される。
    • ClientからドメインにアクセスするとRoute53からロードバランサーへ経由して名前解決されて、TargetGroup→TargetGroupに登録されたECSのタスクのIP→ECSのタスクに結びついてるECR内のバックエンドアプリという順番で実行される。
    • ECSのサービスを作成する時にロードバランサーを選択すると自動的にTargetGroupに追加される。
    • ロードバランサーを作る時にhttpsを使うためにACMで証明書を発行する必要がある。
      • 証明書を作成したら、詳細画面でドメインを追加する
  • ECSにはタスク定義,クラスタ(→サービス→タスク)という概念がある。
    • まず、ECRにアプリをDockerでアップロードする。
    • ECSのタスク定義を作る時にアップロードしたECRアプリを選択。
    • クラスタを作成して、サービスを作成する(この時にタスク定義とロードバランサーを選択)。
  • EC2
    • EC2の画面内にロードバランサーやターゲットグループがあるが、今回の環境構築でEC2自体を意識することはあまりない。

環境構築の流れ

※ DynamoDBやCognitoを使ったバックエンドアプリは準備できている前提です。

  1. VPC (Virtual Private Cloud) の設定

    • VPCを作成します。
    • VPC内にサブネットを作成します。パブリックサブネットとプライベートサブネットの両方を作成します。
  2. Route53 の設定

    • Domain の設定
      • 必要なドメイン名を取得または既存のものを使用します。
    • Hostzone の設定
      • Route53でホストゾーンを作成します。
      • NSタイプのルーティング先にDomainのネームサーバーを追加します。

    ※ドメインを新たに取得する場合は自動的にホストゾーンが作成されます。

  3. ACM (AWS Certificate Manager) の設定

    • Certificate の設定
      • ACMでSSL/TLS証明書を取得またはインポートします。
      • 証明書IDをクリックして、「Amazon Route 53 で DNS レコードを作成」を選択し、Route53のホストゾーンを選択します。
  4. Load Balancing の設定

    • EC2の左メニューからロードバランサーを選択します。

    • ALB (Application Load Balancer) の設定

      • ALBを作成し、パブリックサブネットに配置します。
      • ALBにACMで取得した証明書を関連付けて、HTTPS通信を有効にします。
      スキーム: インターネット向け
      IPアドレスタイプ: IPv4
      ネットワークマッピング: 
      	VPC: [作成したVPC]
      	マッピング: 全てチェック
      セキュリティグループ: default + [任意のセキュリティグループ]*1
      
      *1 以下のインバウンドルールを持つセキュリティグループ
      (無ければEC2のセキュリティグループで作成)
      - IPv4,HTTPS,TCP,ポート:443,ソース:0.0.0.0/0
      - IPv4,HTTP,TCP,ポート:80,ソース:0.0.0.0/0
      
      リスナーとルーティング: 
      	プロトコル: HTTPS
      	リスナー: 443
      セキュリティポリシー: [(推奨)のもの]
      セキュアリスナーの設定: 
      	Certificate source: ACMから
      	Certificate (from ACM): [ACMで作成した証明書]
      
    • Target Group の設定

      • ターゲットグループを作成します。この時点では、まだECSタスクは関連付けません。
      ターゲットタイプ: IPアドレス
      プロトコル: HTTP
      ポート: 80
      IPアドレスタイプ: IPv4
      プロトコルバージョン: HTTP1
      ヘルスチェックプロトコル: HTTP
      ヘルスチェックパス: /
      
      「次へ」を選択してターゲットの登録画面に移動したら、そのまま作成ボタンを押す。
      
    • ALBのリスナーの設定

      • ALBにリスナーを追加する。ここでターゲットグループとACMの証明書を設定する。
      プロトコル: HTTPS
      ポード: 443
      デフォルトアクション: ターゲットグループへ転送
      ターゲットグループ: [作成したターゲットグループ]
      セキュリティポリシー: [(推奨)のもの]
      セキュアリスナーの設定: 
      	Certificate source: ACMから
      	Certificate (from ACM): [ACMで作成した証明書]
      
  5. ECR (Elastic Container Registry) の設定

    • Dockerイメージを保存するためのリポジトリをECRに作成します。
    • サーバアプリのDockerイメージをビルドし、このリポジトリにプッシュします。
  6. ECS (Elastic Container Service) の設定

    • ECSクラスタを作成します。

    • タスク定義を作成し、ECRのリポジトリからイメージを指定します。

    • ECSサービスを作成します。

      コンピューティングオプション: デフォルト(キャパシティプロバイダー戦略)
      アプリケーションタイプ: サービス
      タスク定義: 
      	ファミリー: [作成したタスク定義]
      	リビジョン: [任意]
      サービス名: [好きな名前を付ける]
      サービスタイプ: レプリカ
      必要なタスク: 1
      ネットワーキング: [作成したVPC名]
      サブネット: [任意]
      セキュリティグループ: default + [任意のセキュリティグループ]*1
      
      *1 以下のインバウンドルールを持つセキュリティグループ
      (無ければEC2のセキュリティグループで作成)
      - IPv4,HTTPS,TCP,ポート:443,ソース:0.0.0.0/0
      - IPv4,HTTP,TCP,ポート:80,ソース:0.0.0.0/0
      
      ロードバランシング:
      	ロードバランサー
      		種類: Application Load Balancer
      		「既存のロードバランサーを使用」を選択
      		ロードバランサー: [作成したALB]
      	リスナー:
      		ポート: 443
      		プロトコル: HTTPS
      	ターゲットグループ: [作成したターゲットグループ]
      
      • 作成画面で先ほど作成したALBを設定すると、ALBのターゲットグループに自動でECSタスクのプライベートIPが紐づきます。
  7. Route53 のAレコード設定

    • ホストゾーン内に、ALBのDNS名を指すAレコードを作成します。
    エイリアス: ON
    トラフィックのルーティング先: 
    	エンドポイントを選択: Application Load Balancer と Classic Load Balancer へのエイリアス
    	リージョンを選択: [任意]
    	ロードバランサーを選択: [作成したALB]
    ルーティングポリシー: シンプルルーティング
    

※ Route53やロードバランサーを使わない(httpでドメイン設定なしの)環境の場合、ECSタスクのネットワーキング→ENI ID→パブリック IPv4 DNS に記載されたURLでアクセスできます。

Discussion