AWS CloudFormationテンプレートのススメ#1 ALB編


この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。

CloudFormationテンプレートに興味を持ち、最近構築したものをテンプレートを使って再現できるか試してみました。

 

第一回は、シンプルなApplication Load Balancerの構築をテンプレートにしたものです。

 

 

CloudFormationテンプレートでALBを構築

■前提

CloudFormationのスタックを作成する前に、以下が前提条件ですのでご確認ください。

 

  • VPC作成済み
  • 別々のアベイラビリティゾーンにパブリックサブネットが一つずつ
  • 各サブネットにEC2が一つずつ

 

 

■CloudFormationテンプレート

今回のテンプレートは、シンプルなApplication Load Balancerの構築ができるものです。

 

AWSTemplateFormatVersion: "2010-09-09"

Description:
  create ALB,TG,SG

Parameters:
  VPCID:
    Type: AWS::EC2::VPC::Id
  Subnet1ID:
    Type: AWS::EC2::Subnet::Id
  Subnet2ID:
    Type: AWS::EC2::Subnet::Id
  Instance1ID:
    Type: AWS::EC2::Instance::Id
  Instance2ID:
    Type: AWS::EC2::Instance::Id

Resources:
  ALBSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
        GroupDescription: ALB SG
        GroupName: !Sub ${AWS::StackName}-alb-sg
        SecurityGroupIngress:
          - IpProtocol: tcp
            FromPort: 80
            ToPort: 80
            CidrIp: 0.0.0.0/0
          - IpProtocol: tcp
            FromPort: 443
            ToPort: 443
            CidrIp: 0.0.0.0/0
        Tags:
          - Key: Name
            Value: !Sub ${AWS::StackName}-alb-sg
        VpcId: !Ref VPCID

  ALB:
    Type: AWS::ElasticLoadBalancingV2::LoadBalancer
    Properties:
      IpAddressType: ipv4
      Name: !Sub ${AWS::StackName}-alb
      Scheme: internet-facing
      SecurityGroups: 
        - !Ref ALBSecurityGroup
      Subnets: 
        - !Ref Subnet1ID
        - !Ref Subnet2ID
      Tags:
        - Key: Name
          Value: !Sub ${AWS::StackName}-alb
      Type: application

  ListenerHTTP:
    Type: AWS::ElasticLoadBalancingV2::Listener
    Properties:
      DefaultActions:
        - Type: forward
          TargetGroupArn: !Ref TargetGroup
      LoadBalancerArn: !Ref ALB
      Port: 80
      Protocol: HTTP

  TargetGroup:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
      Matcher: 
        HttpCode: 200
      Name: !Sub ${AWS::StackName}-tg
      Port: 80
      Protocol: HTTP
      Tags:
        - Key: Name
          Value: !Sub ${AWS::StackName}-tg
      Targets:
        - Id: !Ref Instance1ID
        - Id: !Ref Instance2ID
      TargetType: instance
      VpcId: !Ref VPCID

Outputs:
  ALBURL:
    Description: ALB endpoint URL
    Value: !Join
        - ""
        - - http://
          - !GetAtt ALB.DNSName

  ALBARN:
    Description: ALB ARN
    Value: !Join
        - ""
        - - 'arn:aws:elasticloadbalancing:'
          - !Ref AWS::Region
          - ':'
          - !Ref AWS::AccountId
          - ':loadbalancer/'
          - !GetAtt ALB.LoadBalancerFullName

 

 

■結果

今回のテンプレートを利用してスタックを作成してみました。

 

テンプレートの汎用性を高めるため、EC2やVPC,サブネットのIDをパラメータとして入力できるようにしてります。

 

作成する際に、自身の環境の該当IDを入力してください。

 

 

saitou-cfn-template01-alb

 

入力が完了したら、[スタックの作成]を押しましょう。

 

saitou-cfn-template01-alb

 

 

ステータスが“CREATE_COMPLETE”になりましたので、実際に構築できたか確認してみます。

 

 

↓インバウンドルールはHTTPとHTTPSを許可しています。

 

saitou-cfn-template01-alb

saitou-cfn-template01-alb

saitou-cfn-template01-alb

 

↓スタック作成時に入力したEC2インスタンス2つも、ターゲットグループに無事に紐づいているようです。

 

saitou-cfn-template01-alb

 

 

以上です。

 

 

まとめ:AWS CloudFormationテンプレートのススメ#1 ALB編

CloudFormationのテンプレートを自在に作れるようになりたいと思い、現在関わっているプロジェクトの構築をテンプレート化してみました。

 

詳細設計書を見て、テンプレートに落とし込めるレベルになるまで、“CloudFormationテンプレートのススメ”を書き続けようと思います。

 

作成したテンプレートは公式ドキュメントを見ながら独自に書いてものです。こんな風にしたほうがいいよ、というのがありましたらどんどんご連絡ください!

 

 

参考リンク:AWS公式ドキュメント
 

 

↓ほかの協栄情報メンバーもAWS CloudFormationに関する記事を公開しています。ぜひ参考にしてみてください。

 

■CloudFormation作成を効率化するValidate Template機能について(INAMURA)
https://cloud5.jp/cfn-validatetemplate-function/

 

■CloudFormationでRDS(Aurora PostgreSQL リージョン別クラスター)を構築する(小林 剛)
https://cloud5.jp/create-rds-aurora-postgresql-region-by-cfn/

 

■CloudFormationによる【S3】の構築(umemoto)
https://cloud5.jp/cf-s3/

Last modified: 2023-01-14

Author