CloudFrontのオリジンにALBを指定する

CloudFrontのオリジンにALBを指定する

CloudFrontのオリジンにALBを指定する

以下のページで、CloudFrontの基本な事項を取り上げました。

https://awstut.com/2022/03/12/cloudfront-cache

上記のページでは、CloudFrontのオリジンサーバはEC2インスタンスでした。

本ページでは、CloudFrontのオリジンにALBを指定した構成をご紹介します。

構築する環境

Diagram of specifying ALB as the origin of CloudFront.

ALBを作成します。
ターゲットグループに2台のEC2インスタンスを配置します。

EC2インスタンスのOSは最新版のAmazon Linux 2です。
両インスタンスには、Apacheをインストールし、Webサーバとして動作させます。

CloudFrontディストリビューションを作成します。
オリジンサーバにALBを指定します。

CloudFormationテンプレートファイル

上記の構成をCloudFormationで構築します。
以下のURLにCloudFormationテンプレートファイルを設置しています。

https://github.com/awstut-an-r/awstut-saa/tree/main/02/011

テンプレートファイルのポイント解説

(参考)EC2

Resources:
  Instance1:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !Ref ImageId
      InstanceType: !Ref InstanceType
      NetworkInterfaces:
        - DeviceIndex: 0
          SubnetId: !Ref PrivateSubnet1
          GroupSet:
            - !Ref InstanceSecurityGroup
      UserData: !Ref UserData
Code language: YAML (yaml)

2台のインスタンスを定義します。
両者は全く同一の設定のため、インスタンス1のみ取り上げます。

ユーザデータ機能を使用して、インスタンスの初期化処理を定義します。

#!/bin/bash -xe
yum update -y
yum install -y httpd
systemctl start httpd
systemctl enable httpd
ec2-metadata -i > /var/www/html/index.html
Code language: Bash (bash)

Apacheをインストールし、インデックスファイルにインスタンスIDを書き込んで、ルートに配置します。

ユーザデータに関する詳細は、以下のページをご確認ください。

https://awstut.com/2021/12/02/ec2-init-4ways

(参考)ALB

Resources:
  ALB:
    Type: AWS::ElasticLoadBalancingV2::LoadBalancer
    Properties:
      Name: !Sub "${Prefix}-ALB"
      Scheme: internet-facing
      SecurityGroups:
        - !Ref ALBSecurityGroup
      Subnets:
        - !Ref PublicSubnet1
        - !Ref PublicSubnet2
      Type: application

  ALBTargetGroup:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
      VpcId: !Ref VPC
      Name: !Sub "${Prefix}-ALBTargetGroup"
      Protocol: HTTP
      Port: !Ref HTTPPort
      HealthCheckProtocol: HTTP
      HealthCheckPath: /
      HealthCheckPort: traffic-port
      HealthyThresholdCount: !Ref HealthyThresholdCount
      UnhealthyThresholdCount: !Ref UnhealthyThresholdCount
      HealthCheckTimeoutSeconds: !Ref HealthCheckTimeoutSeconds
      HealthCheckIntervalSeconds: !Ref HealthCheckIntervalSeconds
      Matcher:
        HttpCode: !Ref HttpCode
      Targets:
        - Id: !Ref Instance1
        - Id: !Ref Instance2

  ALBListener:
    Type: AWS::ElasticLoadBalancingV2::Listener
    Properties:
      DefaultActions:
        - TargetGroupArn: !Ref ALBTargetGroup
          Type: forward
      LoadBalancerArn: !Ref ALB
      Port: !Ref HTTPPort
      Protocol: HTTP
Code language: YAML (yaml)

ALBターゲットグループに、先述のEC2インスタンスを指定します。

ALBに関する詳細は、以下のページをご確認ください。

https://awstut.com/2021/11/28/attach-private-ec2-to-elb

CloudFront

Resources:
  Distribution:
    Type: AWS::CloudFront::Distribution
    Properties:
      DistributionConfig:
        DefaultCacheBehavior:
          AllowedMethods:
            - GET
            - HEAD
          CachedMethods:
            - GET
            - HEAD
          Compress: true
          ForwardedValues:
            Cookies:
              Forward: none
            QueryString: false
          TargetOriginId: !Ref ALBDNSName
          ViewerProtocolPolicy: allow-all
          DefaultTTL: !Ref CacheTTL
          MaxTTL: !Ref CacheTTL
          MinTTL: !Ref CacheTTL
        Enabled: true
        Origins:
          - CustomOriginConfig:
              OriginProtocolPolicy: http-only
            DomainName: !Ref ALBDNSName
            Id: !Ref ALBDNSName
        PriceClass: PriceClass_All
Code language: YAML (yaml)

CloudFrontディストリビューションを定義します。

CloudFrontに関する基本的な事項は、以下のページをご確認ください。

https://awstut.com/2022/03/12/cloudfront-cache

ポイントはオリジンに関する設定です。
DomainNameプロパティに、先述のALBのDNS名を指定します。

なおキャッシュのTTLは0とします。
これはALB配下のインスタンスへのアクセスを、即座に確認するためです。

環境構築

CloudFormationを使用して、本環境を構築し、実際の挙動を確認します。

CloudFormationスタックを作成し、スタック内のリソースを確認する

CloudFormationスタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。

https://awstut.com/2021/12/02/cloudformation-nested-stacks

各スタックのリソースを確認した結果、今回作成された主要リソースの情報は以下の通りです。

  • インスタンス1:i-02cd16bf6c9c34cdc
  • インスタンス2:i-0672f0350d8976a57
  • ALBのDNS名:saa-02-011-ALB-570513604.ap-northeast-1.elb.amazonaws.com
  • CloudFrontディストリビューションのDNS名:dl2r8lkbxkxkr.cloudfront.net

AWS Management Consoleからも、リソースの作成状況を確認します。

ALBを確認します。

Detail of ALB 1.
Detail of ALB 2.

正常にALBが作成されています。
ALBのターゲットグループを見ると、2つのインスタンスが登録されていることがわかります。

CloudFrontを確認します。

Detail of CloudFront 1.
Detail of CloudFront 2.

正常にCloudFrontディストリビューションが作成されています。
ディストリビューションのオリジンに、先述のALBが指定されています。

動作確認

準備が整いましたので、CloudFrontにアクセスします。

$ curl https://dl2r8lkbxkxkr.cloudfront.net
instance-id: i-0672f0350d8976a57

$ curl https://dl2r8lkbxkxkr.cloudfront.net
instance-id: i-02cd16bf6c9c34cdc
Code language: Bash (bash)

応答がありました。
ALB配下の2台のインスタンスにアクセスできています。

ちなみに直接ALBにアクセスすることもできます。

$ curl http://saa-02-011-ALB-570513604.ap-northeast-1.elb.amazonaws.com
instance-id: i-02cd16bf6c9c34cdc

$ curl http://saa-02-011-ALB-570513604.ap-northeast-1.elb.amazonaws.com
instance-id: i-0672f0350d8976a57
Code language: Bash (bash)

CloudFrontのオリジンにALBを指定したとしても、引き続きALBへの直接アクセスは可能だということです。

まとめ

CloudFrontのオリジンにALBを指定する方法をご紹介しました。