この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
こんにちは。大阪オフィスの林です。
2020年5月14日(木)の公式アナウンスにて、「AWS Global AcceleratorがAWS CloudFormationをサポートするようになりました」と発表がありました。公式ページはこちら
ちょうどAWS Global Acceleratorを触ってたのと、久しぶりにCloudFormationを触ってみたかったので試してみました!
AWS Global Acceleratorの機能だったりは下記の記事をご参照頂ければと思います。
今回やること
- ALBに紐づけるAWS Global AcceleratorをCloudFormationで作成する。
- ALB及びTargetgroupも、同じCloudFormationテンプレートの中で作成する。
- Targetgroupに紐づけるEC2は予め作成済みのリソースをCloudFormation実行時のパラメータで指定する。
リファレンスの紹介
CloudFormationでAWS Global Acceleratorを扱う際、大きく3つのリソースを定義してあげる必要があります。
- 1つ目 AWS :: GlobalAccelerator :: Accelerator
AWS Global Acceleratorの本体(?)というか、大枠を作成するリソースを定義します。
今回はスタック名をそのままAWS Global Acceleratorの名前にします。Enabled
のパラメータはデフォルトでtrue
ですが今回は明示的に指定しておきます。
MyAccelerator:
Type: AWS::GlobalAccelerator::Accelerator
Properties:
Name: !Sub '${AWS::StackName}'
Enabled: true
IpAddressType: IPV4
- 2つ目 AWS :: GlobalAccelerator :: Listener
AWS Global Acceleratorに紐づけるリスナーを定義します。コードの中ではAcceleratorArn
で上記「1つ目」で指定したリソースのARNを参照させることで紐付けを行っています。
MyListener:
Type: AWS::GlobalAccelerator::Listener
Properties:
AcceleratorArn: !Ref MyAccelerator
Protocol: TCP
PortRanges:
- FromPort: 80
ToPort: 80
ClientAffinity: SOURCE_IP
- 3つ目 AWS :: GlobalAccelerator :: EndpointGroup
リスナーに紐づけるエンドポイントを定義します。EndpointId
で紐付けるエンドポイントのARNを参照して紐付けを行っています。。今回はALBをエンドポイントとして紐づけるので、ALBのARNを参照させています。※CloudFormationテンプレートの全体は本記事の最後に載せていますので全体はそちらからご確認頂ければと思います。
MyEndpointGroup:
Type: AWS::GlobalAccelerator::EndpointGroup
Properties:
ListenerArn: !Ref MyListener
#TrafficDialPercentage: !Ref TrafficPercentage
EndpointGroupRegion: !Ref AWS::Region
EndpointConfigurations:
- EndpointId: !Ref MyLoadBalancer
Weight: 100
上記コードの中で使ってるPropertiesや、使っていないPropertiesの一覧や説明は下記を参照ください。
AWS::GlobalAccelerator::Accelerator
AWS::GlobalAccelerator::Listener
AWS :: GlobalAccelerator :: EndpointGroup
実行してみた
CloudFormation実行時に予め準備していたEC2を指定します。今回はTargetgroupに2台のEC2を割り当てるため、2つのインスタンスを指定出来るようにしています。
CloudFormationでのデプロイが完了後、Global Acceleratorのダッシュボードを見に行くと、定義したGlobal Accelerator作成されていることが確認できます。
ロードバランサーとの紐付きも確認します。ロードバランサーのダッシュボードから「統合サービス」タブを確認すると、作成したGlobal Acceleratorに関連付けられていることが確認できます。
動作確認で、Global AcceleratorのDNS名にブラウザからアクセスすると、EC2で準備しておいたテストページが表示されました。これで、Global Accelerator
→ ALB
→ EC2
という経路で接続出来たことが確認できます。
まとめ
CloudFormationを使って、AWS Global Acceleratorを簡単にデプロイする方法をご紹介させて頂きました!AWS Global Acceleratorに限らず、CloudFormationを触ってると「このサービス、こんなパラメータも指定できるのかぁ~」といった発見もあったりで非常に面白いです!ぜひ皆さんもお試しください!
以上、大阪オフィスの林がお送りしました!
参考
あわせて読みたい
Cloudformationテンプレート
AWSTemplateFormatVersion: '2010-09-09'
Description: "GlobalAccelerator Create by Classmethod"
Resources:
# ------------------------------------------------------------#
# Input Parameters
# ------------------------------------------------------------#
Metadata:
AWS::CloudFormation::Interface:
ParameterGroups:
-
Parameters:
- Target1
- Target2
Parameters:
Target1:
Description: Please Select EC2 Target.
Type: AWS::EC2::Instance::Id
Target2:
Description: Please Select EC2 Target.
Type: AWS::EC2::Instance::Id
Resources:
# ------------------------------------------------------------#
# GlobalAccelerator
# ------------------------------------------------------------#
Accelerator:
Type: AWS::GlobalAccelerator::Accelerator
Properties:
Name: !Sub '${AWS::StackName}'
Enabled: true
IpAddressType: IPV4
MyListener:
Type: AWS::GlobalAccelerator::Listener
Properties:
AcceleratorArn: !Ref Accelerator
Protocol: TCP
PortRanges:
- FromPort: 80
ToPort: 80
ClientAffinity: SOURCE_IP
MyEndpointGroup:
Type: AWS::GlobalAccelerator::EndpointGroup
Properties:
ListenerArn: !Ref MyListener
#TrafficDialPercentage: !Ref TrafficPercentage
EndpointGroupRegion: !Ref AWS::Region
EndpointConfigurations:
- EndpointId: !Ref LoadBalancer
Weight: 100
# ------------------------------------------------------------#
# ALB
# ------------------------------------------------------------#
MyLoadBalancer:
Type: AWS::ElasticLoadBalancingV2::LoadBalancer
Properties:
Scheme: internal
Subnets:
- "subnet-xxxxxxxxxxxxxxxxx"
- "subnet-xxxxxxxxxxxxxxxxx"
SecurityGroups:
- "sg-xxxxxxxxxxxxxxxxx"
# ------------------------------------------------------------#
# TargetGroup
# ------------------------------------------------------------#
MyTargetGroup:
Type: AWS::ElasticLoadBalancingV2::TargetGroup
Properties:
Name: test-tg
Port: 80
Protocol: HTTP
TargetType: instance
Targets:
- Id: !Sub ${Target1}
- Id: !Sub ${Target2}
Tags:
- Key: Name
Value: test-tg
VpcId: "vpc-xxxxxxxxxxxxxxxxx"
# ------------------------------------------------------------#
# Listener
# ------------------------------------------------------------#
MyLBListener:
Type: "AWS::ElasticLoadBalancingV2::Listener"
Properties:
DefaultActions:
- TargetGroupArn: !Ref MyTargetGroup
Type: forward
LoadBalancerArn: !Ref MyLoadBalancer
Port: 80
Protocol: HTTP