[アップデート]Global AcceleratorがCloudFormationをサポートするようになりました

2020.05.17

この記事は公開されてから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 AcceleratorALBEC2という経路で接続出来たことが確認できます。

まとめ

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