1. はじめに

Application Load Balancerを構築を簡単に構築したので、構築手順と構成をまとめておきます。

2. CloudFormationテンプレート

構成図

2.1. VPCの作成

VPC:
  Type: AWS::EC2::VPC
  Properties:
    CidrBlock: 192.168.0.0/20
    EnableDnsSupport: true
    EnableDnsHostnames: true
    Tags:
      - Key: Name
        Value: 'vpc'

2.2. インターネットゲートウェイの作成

VPCにアタッチするインターネットゲートウェイを作成する

InternetGateway:
  Type: AWS::EC2::InternetGateway
  Properties:
      Tags:
      - Key: Name
        Value: 'internet-gateway'

AttachGateway:
  Type: AWS::EC2::VPCGatewayAttachment
  Properties:
    VpcId: !Ref VPC
    InternetGatewayId: !Ref InternetGateway

2.3. ルートテーブルの作成

パブリックサブネット用のルートテーブルをサブネットごとに作成する。

  Az1PublicRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC

  Az1PublicRoute:
    Type: AWS::EC2::Route
    DependsOn: GymManagementAttachGateway
    Properties:
      RouteTableId: !Ref Az1PublicRouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref InternetGateway

  Az1PublicSubnetRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref EcsPublicSubnetAZ1
      RouteTableId: !Ref Az1PublicRouteTable

  Az2PublicRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC

  Az2PublicRoute:
    Type: AWS::EC2::Route
    DependsOn: GymManagementAttachGateway
    Properties:
      RouteTableId: !Ref Az2PublicRouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref InternetGateway

2.4. パブリックサブネットの作成

パブリックサブネットは、ALBの使用上、複数作成する必要あります。

PublicSubnetAZ1:
  Type: AWS::EC2::Subnet
  Properties:
    VpcId: !Ref VPC
    AvailabilityZone: !Select [0, !GetAZs '']
    CidrBlock: 192.168.4.0/24
    MapPublicIpOnLaunch: false
    Tags:
      - Key: Name
        Value: 'ecs-public-subnet1'
PublicSubnetAZ2:
  Type: AWS::EC2::Subnet
  Properties:
    VpcId: !Ref VPC
    AvailabilityZone: !Select [2, !GetAZs '']
    CidrBlock: 192.168.5.0/24
    MapPublicIpOnLaunch: false
    Tags:
      - Key: Name
        Value: 'ecs-public-subnet2'

2.5. セキュリティグループ

ALBには、セキュリティグループをあタッチすることができます。 許可するポートやIPをここで設定します。

AlbSecurityGroup:
  Type: AWS::EC2::SecurityGroup
  Properties:
    GroupDescription: Security Group for Application Load Balancer
    VpcId: !Ref VPC
    SecurityGroupIngress:
      - IpProtocol: tcp
        FromPort: 8080
        ToPort: 8080
        CidrIp: 0.0.0.0/0
    SecurityGroupEgress:
      - IpProtocol: -1
        FromPort: -1
        ToPort: -1
        CidrIp: 0.0.0.0/0
    Tags:
      - Key: Name
        Value: 'alb-sg'

2.6. ALBの作成

ALBを作成します。セキュリティグループとサブネットを指定します。

LoadBalancer:
  Type: AWS::ElasticLoadBalancingV2::LoadBalancer
  Properties:
    # Typeにapplicationを指定するとALBを作成。
    Type: application
    Name: alb
    SecurityGroups:
      - !ImportValue AlbSecurityGroup
    Subnets:
      - !ImportValue PublicSubnetAZ1
      - !ImportValue PublicSubnetAZ2

2.7. リスナー

リスナーは指定されたプロトコル/ポートを監視します。 これに合致したリクエストをターゲットグループに転送します。

※ この他にリスナーのルールを設定することによって、URLごとに送信する対象を変更することが可能です。

Listener:
  Type: AWS::ElasticLoadBalancingV2::Listener
  Properties:
    DefaultActions:
      - Type: forward
        TargetGroupArn: !GetAtt TargetGroup.TargetGroupArn
    LoadBalancerArn: !Ref LoadBalancer
    Port: 8080
    Protocol: HTTP

2.8. ターゲットグループ

TargetGroup:
  Type: AWS::ElasticLoadBalancingV2::TargetGroup
  Properties:
    HealthCheckPath: /
    Name: alb-target
    Port: 8080
    Protocol: HTTP
    TargetType: ip
    HealthCheckProtocol: HTTP
    VpcId: !Ref VPC
    TargetGroupAttributes:
        # ターゲットがターゲットグループから外されてからリクエストを送るのをやめるまでの時間。
      - Key: deregistration_delay.timeout_seconds
        Value: '300'

※ ECSをターゲットグループに指定する場合は、ECSサービスの作成時にターゲットグループを指定することでターゲットグループに追加できます。 ※ ECSの構築方法は割愛します。