Zenn
🔰

AWS初心者向け~ゼロからECSアプリケーションの構築まで~ ECS 後編(ALB中心)

2025/03/27に公開

5. ALB 編(ECS 後編)

目次
  1. ALB(Application Load Balancer)とは。
  2. ALBのリスナーについて
  3. ALBのターゲットグループについて
  4. ALB、リスナー、ターゲットグループ、セキュリティグループをCloudformationで作成する
  5. HTTPS接続のためのopenssl証明書の作成とアップロード
  6. 終わりに...更に踏み込んで実用的なAWSでのアプリ構築に役に立つ書籍の紹介

1. ALBとは?

AWSのApplication Load Balancer (ALB) は、Amazon Web Services (AWS) が提供するロードバランサーの一種で、アプリケーション層 (OSIモデルのレイヤー7) で動作します。ALBは、HTTPおよびHTTPSトラフィックを処理し、リクエストを複数のターゲット(例: EC2インスタンス、コンテナ、Lambda関数など)に分散させることで、高可用性とスケーラビリティを実現します。

主な特徴

  1. レイヤー7のロードバランシング:
     HTTP/HTTPSリクエストの内容(ヘッダー、パス、クエリ文字列など)に基づいてルーティングを行います。
  2. ターゲットグループ:
    トラフィックを分散する先をターゲットグループとして管理します。ターゲットにはEC2インスタンス、  ECSタスク、Lambda関数などを指定可能です。
  3. リスナーとルール:
     リスナーは特定のポート(例: 80, 443)で受信するトラフィックを定義します。
     ルールを設定することで、リクエストの条件に応じたルーティングが可能です。
  4. ヘルスチェック:
     ターゲットの正常性を監視し、正常なターゲットにのみトラフィックを送信します。
  5. SSL/TLSのサポート:
     HTTPSトラフィックを処理するためにSSL/TLS証明書を設定できます。
  6. ウェブソケットとHTTP/2のサポート:
     モダンなウェブアプリケーションの要件に対応しています。

主なユースケース

  • マイクロサービスアーキテクチャでのトラフィック分散。
  • コンテンツベースのルーティング(例: 特定のURLパスに基づくルーティング)。
  • サーバーレスアプリケーション(Lambda関数)へのトラフィック分散。
  • HTTPSトラフィックの終端処理(SSL/TLSのオフロード)。
  • ALBは、スケーラブルで柔軟なアプリケーション層のトラフィック管理を提供するため、モダンなウェブアプリケーションやマイクロサービスに適しています。

2. リスナーについて

リスナーは特定のポート(例: 80, 443)で受信するトラフィックを定義します。
ルールを設定することで、リクエストの条件に応じたルーティングが可能です。

3. ターゲットグループについて

トラフィックを分散する先をターゲットグループとして管理します。ターゲットにはEC2インスタンス、  ECSタスク、Lambda関数などを指定可能です。

4. CloudformationでALBを作成する。

本講座で利用するDockerfileと関連するファイル、Cloudformationテンプレートファイルは、
こちらのGithubリポジトリに配置してます。
https://github.com/wat1881mayer/ecs-app-1
上記のcloudformationフォルダから「ecs-template.yml」を利用します。
以前の講座で使用したCloudformationテンプレートに追加した形なので
変更箇所となる部分のみを抜粋して説明します。

ECSService:
    Type: "AWS::ECS::Service"
    DependsOn: ALBListener
    Properties:
      ServiceName: ecs-learning-service
      Cluster: !Ref ECSCluster
      DesiredCount: 1
      LaunchType: FARGATE
      NetworkConfiguration:
        AwsvpcConfiguration:
          AssignPublicIp: ENABLED
          SecurityGroups:
            - your-security-group-id
          Subnets:
            - your-subnet-id
            - your-subnet-id
      TaskDefinition: !Ref ECSTaskDefinition
      LoadBalancers:
        - ContainerName: my-ecs-learning-container
          ContainerPort: 80
          TargetGroupArn: !Ref ALBTargetGroup
  ALBSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Enable HTTP access via port 80
      GroupName: ECS-Learning-ALB-sgs
      VpcId: your-vpc-id
  ALBIngressRule:
    Type: AWS::EC2::SecurityGroupIngress
    Properties:
      GroupId: !GetAtt ALBSecurityGroup.GroupId
      IpProtocol: tcp
      FromPort: 80
      ToPort: 80
      CidrIp: 0.0.0.0/0
  ECSApplicationLoadBalancer:
    Type: AWS::ElasticLoadBalancingV2::LoadBalancer
    Properties:
      IpAddressType: ipv4
      Name: ECS-Learning-Alb
      Scheme: internet-facing
      SecurityGroups:
        - !GetAtt ALBSecurityGroup.GroupId
      Subnets:
        - your-public-subnet-id
        - your-public-subnet-id
  ALBTargetGroup:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
      Name: ECS-Learning-TargetGroup
      Port: 80
      Protocol: HTTP
      TargetType: ip
      VpcId: your-vpc-id
      HealthCheckPath: /
      HealthCheckIntervalSeconds: 30
      HealthCheckTimeoutSeconds: 5
      HealthyThresholdCount: 3
      UnhealthyThresholdCount: 2

  ALBListener:
    Type: AWS::ElasticLoadBalancingV2::Listener
    Properties:
      DefaultActions:
        - Type: forward
          TargetGroupArn: !Ref ALBTargetGroup
      LoadBalancerArn: !Ref ECSApplicationLoadBalancer
      Port: 80
      Protocol: HTTP

以前のECS編で作成した箇所からの変更としては、ECSServiceにDependsOn属性がついているのと、
LoadBalancersプロパティが設定されていることです。
Depends OnはCloudformationがスタックを作成する際に、明示的にDependsOnで指定したスタックより後に作成するように指示できます。これによりある要素が作成される前に値を参照してERRORとなるような状況を回避できます。

LoadBalancers欄にて後述で作成するALBのターゲットグループをコンテナのポートを繋ぎます。
これによりALBがターゲットグループに送った通信が、ECSコンテナ内に入るようになります。

実際に正常にALBとリスナー、ターゲットグループ、セキュリティグループが作成されましたら
ALBのDNS名から目的のECSタスクで動作するWebサーバーにアクセスできます。

5. HTTPS利用のためのSSL/TLS証明書のALBリスナーへの登録

1. ローカルでのopensslを利用した自己署名での証明書の作成手順

前提としてローカルPCにopensslをインストールします。

  1. 証明書に利用するPrivate Keyの作成
 openssl genrsa 2048 > my-private-key
  1. 自己署名証明書の作成
 openssl req -new -x509 -nodes -sha256 -days 365 -key my-private-key.pem -outform PEM - out my-certificate.pem
  1. 作成した証明書のACMへのアップロード
    ACMから証明書をインポートでインポートします。
    証明書本文に作成した証明書本体を、証明書のプライベートキーに手順1で作成したpemファイルの中身を貼り付けます。インポート実施することでAWS上に証明書をアップロード完了です。

  2. HTTPSでの接続を実施するためALBとECSのセキュリティグループIgressルールを設定する。
    ↓HTTPSの許可ルールをIgressに追加

  3. ALBのリスナーに「HTTPS」ルールを追加する。

  4. プロトコルHTTPSとターゲットグループを指定する。

  5. 証明書としてACMにアップロードした自己署名証明書を設定する

  6. これでHTTPSでのリスナールールへの証明書自体の追加作業は、終わりですが自己署名証明書なのでブラウザでのHTTPS通信時にエラー出ます..正式にCAで署名したものであればエラーなくアクセスできます。

6.終わりに...更に踏み込んで実用的なAWSでのアプリ構築に役に立つ書籍の紹介

ここまで読んで頂きありがとうございます。
基本的なECSアプリケーションの構築は、できましたがまだまだProductionレベルの設計ではないためさらに踏み込んでコンテナアプリケーションを構築するための書籍を紹介します。
https://amzn.asia/d/2SRPXPD
AWSコンテナ設計・構築[本格]入門
様々なユースケースに合わせたアーキテクチャ設計、データベースへの接続箇所の実装や
実アプリケーションベースでの構築ができる良書です。

AWS Cookbook: Recipes for Success on AWS
AWSで全体的にスキルアップできる以下の本もオススメです。
AWS CLI中心のレクチャーですが、GithubリポジトリにPythonでCdkコードがまとまっているので
CDKコードを参考にする上でもおすすめです。
https://amzn.asia/d/brqGiPM

Discussion

ログインするとコメントできます