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

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

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

あわせて読みたい
CloudFrontキャッシュでオリジンサーバのパフォーマンス向上 【CloudFrontキャッシュを使用して、オリジンサーバに対するリクエスト数を抑える構成】 AWS SAAの出題範囲の1つでもある、高性能アーキテクチャの設計に関する内容です...

上記のページでは、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を書き込んで、ルートに配置します。

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

あわせて読みたい
Linuxインスタンスの初期化方法4選 【Linuxインスタンスを初期化する4つの方法】 EC2インスタンスの起動時に初期化処理を実行する方法を考えます。 EC2インスタンスを構築時に初期化する以下の4つの手法を...

(参考)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に関する詳細は、以下のページをご確認ください。

あわせて読みたい
プライベートサブネット内のインスタンスをALBにアタッチする 【プライベートサブネット内のインスタンスをALBにアタッチする構成】 プライベートサブネット内に設置されたインスタンスを、ALBにアタッチする方法を確認します。 AWS...

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に関する基本的な事項は、以下のページをご確認ください。

あわせて読みたい
CloudFrontキャッシュでオリジンサーバのパフォーマンス向上 【CloudFrontキャッシュを使用して、オリジンサーバに対するリクエスト数を抑える構成】 AWS SAAの出題範囲の1つでもある、高性能アーキテクチャの設計に関する内容です...

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

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

環境構築

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

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

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

あわせて読みたい
CloudFormationのネストされたスタックで環境を構築する 【CloudFormationのネストされたスタックで環境を構築する方法】 CloudFormationにおけるネストされたスタックを検証します。 CloudFormationでは、スタックをネストす...

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

  • インスタンス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を指定する方法をご紹介しました。