CloudFrontのオリジンにALBを指定する
以下のページで、CloudFrontの基本な事項を取り上げました。
上記のページでは、CloudFrontのオリジンサーバはEC2インスタンスでした。
本ページでは、CloudFrontのオリジンにALBを指定した構成をご紹介します。
構築する環境
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を書き込んで、ルートに配置します。
ユーザデータに関する詳細は、以下のページをご確認ください。
(参考)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に関する詳細は、以下のページをご確認ください。
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に関する基本的な事項は、以下のページをご確認ください。
ポイントはオリジンに関する設定です。
DomainNameプロパティに、先述のALBのDNS名を指定します。
なおキャッシュのTTLは0とします。
これはALB配下のインスタンスへのアクセスを、即座に確認するためです。
環境構築
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を確認します。
正常にALBが作成されています。
ALBのターゲットグループを見ると、2つのインスタンスが登録されていることがわかります。
CloudFrontを確認します。
正常に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を指定する方法をご紹介しました。