AWS初心者向け~ゼロからECSアプリケーションの構築まで~ ECS 後編(ALB中心)
5. ALB 編(ECS 後編)
目次
- ALB(Application Load Balancer)とは。
- ALBのリスナーについて
- ALBのターゲットグループについて
- ALB、リスナー、ターゲットグループ、セキュリティグループをCloudformationで作成する
- HTTPS接続のためのopenssl証明書の作成とアップロード
- 終わりに...更に踏み込んで実用的なAWSでのアプリ構築に役に立つ書籍の紹介
1. ALBとは?
AWSのApplication Load Balancer (ALB) は、Amazon Web Services (AWS) が提供するロードバランサーの一種で、アプリケーション層 (OSIモデルのレイヤー7) で動作します。ALBは、HTTPおよびHTTPSトラフィックを処理し、リクエストを複数のターゲット(例: EC2インスタンス、コンテナ、Lambda関数など)に分散させることで、高可用性とスケーラビリティを実現します。
主な特徴
- レイヤー7のロードバランシング:
HTTP/HTTPSリクエストの内容(ヘッダー、パス、クエリ文字列など)に基づいてルーティングを行います。 - ターゲットグループ:
トラフィックを分散する先をターゲットグループとして管理します。ターゲットにはEC2インスタンス、 ECSタスク、Lambda関数などを指定可能です。 - リスナーとルール:
リスナーは特定のポート(例: 80, 443)で受信するトラフィックを定義します。
ルールを設定することで、リクエストの条件に応じたルーティングが可能です。 - ヘルスチェック:
ターゲットの正常性を監視し、正常なターゲットにのみトラフィックを送信します。 - SSL/TLSのサポート:
HTTPSトラフィックを処理するためにSSL/TLS証明書を設定できます。 - ウェブソケットとHTTP/2のサポート:
モダンなウェブアプリケーションの要件に対応しています。
主なユースケース
- マイクロサービスアーキテクチャでのトラフィック分散。
- コンテンツベースのルーティング(例: 特定のURLパスに基づくルーティング)。
- サーバーレスアプリケーション(Lambda関数)へのトラフィック分散。
- HTTPSトラフィックの終端処理(SSL/TLSのオフロード)。
- ALBは、スケーラブルで柔軟なアプリケーション層のトラフィック管理を提供するため、モダンなウェブアプリケーションやマイクロサービスに適しています。
2. リスナーについて
リスナーは特定のポート(例: 80, 443)で受信するトラフィックを定義します。
ルールを設定することで、リクエストの条件に応じたルーティングが可能です。
3. ターゲットグループについて
トラフィックを分散する先をターゲットグループとして管理します。ターゲットにはEC2インスタンス、 ECSタスク、Lambda関数などを指定可能です。
4. CloudformationでALBを作成する。
本講座で利用するDockerfileと関連するファイル、Cloudformationテンプレートファイルは、
こちらのGithubリポジトリに配置してます。
上記の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をインストールします。
- 証明書に利用するPrivate Keyの作成
openssl genrsa 2048 > my-private-key
- 自己署名証明書の作成
openssl req -new -x509 -nodes -sha256 -days 365 -key my-private-key.pem -outform PEM - out my-certificate.pem
-
作成した証明書のACMへのアップロード
ACMから証明書をインポートでインポートします。
証明書本文に作成した証明書本体を、証明書のプライベートキーに手順1で作成したpemファイルの中身を貼り付けます。インポート実施することでAWS上に証明書をアップロード完了です。 -
HTTPSでの接続を実施するためALBとECSのセキュリティグループIgressルールを設定する。
↓HTTPSの許可ルールをIgressに追加
-
ALBのリスナーに「HTTPS」ルールを追加する。
-
プロトコルHTTPSとターゲットグループを指定する。
-
証明書としてACMにアップロードした自己署名証明書を設定する
-
これでHTTPSでのリスナールールへの証明書自体の追加作業は、終わりですが自己署名証明書なのでブラウザでのHTTPS通信時にエラー出ます..正式にCAで署名したものであればエラーなくアクセスできます。
6.終わりに...更に踏み込んで実用的なAWSでのアプリ構築に役に立つ書籍の紹介
ここまで読んで頂きありがとうございます。
基本的なECSアプリケーションの構築は、できましたがまだまだProductionレベルの設計ではないためさらに踏み込んでコンテナアプリケーションを構築するための書籍を紹介します。
AWSコンテナ設計・構築[本格]入門
様々なユースケースに合わせたアーキテクチャ設計、データベースへの接続箇所の実装や
実アプリケーションベースでの構築ができる良書です。
AWS Cookbook: Recipes for Success on AWS
AWSで全体的にスキルアップできる以下の本もオススメです。
AWS CLI中心のレクチャーですが、GithubリポジトリにPythonでCdkコードがまとまっているので
CDKコードを参考にする上でもおすすめです。
Discussion