🦉

【CFn】テンプレを眺めて理解。Auto ScalingのSampleテンプレから各プロパティを深堀りしてみる。

2022/10/27に公開

公式のサンプルテンプレートを眺めて一緒にCFnのAutoScaling構成の一例を勉強しましょう。

「眺めて理解。」としていますが、

これを書いている私自信もテンプレートを見ながらドキュメントや技術記事を検索してコメントをつけて勉強する意味でもありますし、

記事を覗いてくださった方も、テンプレ内に添えたコメントと各設定項目(プロパティ)を一緒に眺めておさらい出来たり、

リソースの参照関係などを「見て理解」出来るようになれたらいいなという感覚のものです。

書く側が変に包丁を入れずに調べた内容を記入していくだけにしているので、テンプレを上から下まで眺められるので逆に良いのではと思ったりしてます。

今回はAutoScalingです。

テンプレ内にコメントをつけたいというのもありますがjsonからyamlに変換しています。

以下、テンプレート内容です

元の場所

Load-based-auto-scaling.yml
AWSTemplateFormatVersion: 2010-09-09
Description: >-
  AWS CloudFormation Sample Template AutoScalingMultiAZWithNotifications: Create
  a multi-az, load balanced and Auto Scaled sample web site running on an Apache
  Web Serever. The application is configured to span all Availability Zones in
  the region and is Auto-Scaled based on the CPU utilization of the web servers.
  Notifications will be sent to the operator email address on scaling events.
  The instances are load balanced with a simple health check against the default
  web page. **WARNING** This template creates one or more Amazon EC2 instances
  and an Application Load Balancer. You will be billed for the AWS resources
  used if you create a stack from this template.
Parameters:
  #既存VPCを選択させるリストを用意。
  VpcId:
    Type: 'AWS::EC2::VPC::Id'
    Description: VpcId of your existing Virtual Private Cloud (VPC)
    ConstraintDescription: must be the VPC Id of an existing Virtual Private Cloud.
  #既存サブネットを選択させるリストを用意。説明文で「同一AZでない最低2つの」を強制。
  Subnets:
    Type: 'List<AWS::EC2::Subnet::Id>'
    Description: The list of SubnetIds in your Virtual Private Cloud (VPC)
    ConstraintDescription: >-
      must be a list of at least two existing subnets associated with at least
      two different availability zones. They should be residing in the selected
      Virtual Private Cloud.
  #インスタンスタイプを選択させるリストを用意。説明文でウェブサーバー用である事を説明。
  InstanceType:
    Description: WebServer EC2 instance type
    Type: String
    #デフォルトをt2.smallに。
    Default: t2.small
    AllowedValues:
      - t1.micro
      - t2.nano
      - t2.micro
      - t2.small
      - t2.medium
      - t2.large
      - m1.small
      - m1.medium
      - m1.large
      - m1.xlarge
      - m2.xlarge
      - m2.2xlarge
      - m2.4xlarge
      - m3.medium
      - m3.large
      - m3.xlarge
      - m3.2xlarge
      - m4.large
      - m4.xlarge
      - m4.2xlarge
      - m4.4xlarge
      - m4.10xlarge
      - c1.medium
      - c1.xlarge
      - c3.large
      - c3.xlarge
      - c3.2xlarge
      - c3.4xlarge
      - c3.8xlarge
      - c4.large
      - c4.xlarge
      - c4.2xlarge
      - c4.4xlarge
      - c4.8xlarge
      - g2.2xlarge
      - g2.8xlarge
      - r3.large
      - r3.xlarge
      - r3.2xlarge
      - r3.4xlarge
      - r3.8xlarge
      - i2.xlarge
      - i2.2xlarge
      - i2.4xlarge
      - i2.8xlarge
      - d2.xlarge
      - d2.2xlarge
      - d2.4xlarge
      - d2.8xlarge
      - hi1.4xlarge
      - hs1.8xlarge
      - cr1.8xlarge
      - cc2.8xlarge
      - cg1.4xlarge
    #正しくない値が選択された際のエラーメッセージを指定。
    ConstraintDescription: must be a valid EC2 instance type.
  OperatorEMail:
    Description: EMail address to notify if there are any scaling operations
    Type: String
    #正規表現(EMail)
    AllowedPattern: >-
      ([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)
    ConstraintDescription: must be a valid email address.
  #キーペアを選択させるリストを用意。
  KeyName:
    Description: The EC2 Key Pair to allow SSH access to the instances
    Type: 'AWS::EC2::KeyPair::KeyName'
    ConstraintDescription: must be the name of an existing EC2 KeyPair.
  #EC2にSSHアクセスする際に使うIPレンジを入力させるテキストボックス。
  SSHLocation:
    Description: The IP address range that can be used to SSH to the EC2 instances
    Type: String
    #文字の長さを9-18文字に限定。
    MinLength: '9'
    MaxLength: '18'
    Default: 0.0.0.0/0
    #正規表現(IPレンジ)
    AllowedPattern: '(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/(\d{1,2})'
    ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x.
#Stack作成リージョンや選択したインスタンスタイプなどに応じてAMIの要素を準備キー/バリュー対応させる。(後で起動設定でAMIがこの対応付から決まる。)
Mappings:
  Region2Examples:
    ap-east-1:
      Examples: 'https://s3-ap-east-1.amazonaws.com/cloudformation-examples-ap-east-1'
    ap-northeast-1:
      Examples: >-
        https://s3-ap-northeast-1.amazonaws.com/cloudformation-examples-ap-northeast-1
    ap-northeast-2:
      Examples: >-
        https://s3-ap-northeast-2.amazonaws.com/cloudformation-examples-ap-northeast-2
    ap-northeast-3:
      Examples: >-
        https://s3-ap-northeast-3.amazonaws.com/cloudformation-examples-ap-northeast-3
    ap-south-1:
      Examples: 'https://s3-ap-south-1.amazonaws.com/cloudformation-examples-ap-south-1'
    ap-southeast-1:
      Examples: >-
        https://s3-ap-southeast-1.amazonaws.com/cloudformation-examples-ap-southeast-1
    ap-southeast-2:
      Examples: >-
        https://s3-ap-southeast-2.amazonaws.com/cloudformation-examples-ap-southeast-2
    ca-central-1:
      Examples: >-
        https://s3-ca-central-1.amazonaws.com/cloudformation-examples-ca-central-1
    cn-north-1:
      Examples: >-
        https://s3.cn-north-1.amazonaws.com.cn/cloudformation-examples-cn-north-1
    cn-northwest-1:
      Examples: >-
        https://s3.cn-northwest-1.amazonaws.com.cn/cloudformation-examples-cn-northwest-1
    eu-central-1:
      Examples: >-
        https://s3-eu-central-1.amazonaws.com/cloudformation-examples-eu-central-1
    eu-north-1:
      Examples: 'https://s3-eu-north-1.amazonaws.com/cloudformation-examples-eu-north-1'
    eu-west-1:
      Examples: 'https://s3-eu-west-1.amazonaws.com/cloudformation-examples-eu-west-1'
    eu-west-2:
      Examples: 'https://s3-eu-west-2.amazonaws.com/cloudformation-examples-eu-west-2'
    eu-west-3:
      Examples: 'https://s3-eu-west-3.amazonaws.com/cloudformation-examples-eu-west-3'
    me-south-1:
      Examples: 'https://s3-me-south-1.amazonaws.com/cloudformation-examples-me-south-1'
    sa-east-1:
      Examples: 'https://s3-sa-east-1.amazonaws.com/cloudformation-examples-sa-east-1'
    us-east-1:
      Examples: 'https://s3.amazonaws.com/cloudformation-examples-us-east-1'
    us-east-2:
      Examples: 'https://s3-us-east-2.amazonaws.com/cloudformation-examples-us-east-2'
    us-west-1:
      Examples: 'https://s3-us-west-1.amazonaws.com/cloudformation-examples-us-west-1'
    us-west-2:
      Examples: 'https://s3-us-west-2.amazonaws.com/cloudformation-examples-us-west-2'
  AWSInstanceType2Arch:
    t1.micro:
      Arch: HVM64
    t2.nano:
      Arch: HVM64
    t2.micro:
      Arch: HVM64
    t2.small:
      Arch: HVM64
    t2.medium:
      Arch: HVM64
    t2.large:
      Arch: HVM64
    m1.small:
      Arch: HVM64
    m1.medium:
      Arch: HVM64
    m1.large:
      Arch: HVM64
    m1.xlarge:
      Arch: HVM64
    m2.xlarge:
      Arch: HVM64
    m2.2xlarge:
      Arch: HVM64
    m2.4xlarge:
      Arch: HVM64
    m3.medium:
      Arch: HVM64
    m3.large:
      Arch: HVM64
    m3.xlarge:
      Arch: HVM64
    m3.2xlarge:
      Arch: HVM64
    m4.large:
      Arch: HVM64
    m4.xlarge:
      Arch: HVM64
    m4.2xlarge:
      Arch: HVM64
    m4.4xlarge:
      Arch: HVM64
    m4.10xlarge:
      Arch: HVM64
    c1.medium:
      Arch: HVM64
    c1.xlarge:
      Arch: HVM64
    c3.large:
      Arch: HVM64
    c3.xlarge:
      Arch: HVM64
    c3.2xlarge:
      Arch: HVM64
    c3.4xlarge:
      Arch: HVM64
    c3.8xlarge:
      Arch: HVM64
    c4.large:
      Arch: HVM64
    c4.xlarge:
      Arch: HVM64
    c4.2xlarge:
      Arch: HVM64
    c4.4xlarge:
      Arch: HVM64
    c4.8xlarge:
      Arch: HVM64
    g2.2xlarge:
      Arch: HVMG2
    g2.8xlarge:
      Arch: HVMG2
    r3.large:
      Arch: HVM64
    r3.xlarge:
      Arch: HVM64
    r3.2xlarge:
      Arch: HVM64
    r3.4xlarge:
      Arch: HVM64
    r3.8xlarge:
      Arch: HVM64
    i2.xlarge:
      Arch: HVM64
    i2.2xlarge:
      Arch: HVM64
    i2.4xlarge:
      Arch: HVM64
    i2.8xlarge:
      Arch: HVM64
    d2.xlarge:
      Arch: HVM64
    d2.2xlarge:
      Arch: HVM64
    d2.4xlarge:
      Arch: HVM64
    d2.8xlarge:
      Arch: HVM64
    hi1.4xlarge:
      Arch: HVM64
    hs1.8xlarge:
      Arch: HVM64
    cr1.8xlarge:
      Arch: HVM64
    cc2.8xlarge:
      Arch: HVM64
  AWSInstanceType2NATArch:
    t1.micro:
      Arch: NATHVM64
    t2.nano:
      Arch: NATHVM64
    t2.micro:
      Arch: NATHVM64
    t2.small:
      Arch: NATHVM64
    t2.medium:
      Arch: NATHVM64
    t2.large:
      Arch: NATHVM64
    m1.small:
      Arch: NATHVM64
    m1.medium:
      Arch: NATHVM64
    m1.large:
      Arch: NATHVM64
    m1.xlarge:
      Arch: NATHVM64
    m2.xlarge:
      Arch: NATHVM64
    m2.2xlarge:
      Arch: NATHVM64
    m2.4xlarge:
      Arch: NATHVM64
    m3.medium:
      Arch: NATHVM64
    m3.large:
      Arch: NATHVM64
    m3.xlarge:
      Arch: NATHVM64
    m3.2xlarge:
      Arch: NATHVM64
    m4.large:
      Arch: NATHVM64
    m4.xlarge:
      Arch: NATHVM64
    m4.2xlarge:
      Arch: NATHVM64
    m4.4xlarge:
      Arch: NATHVM64
    m4.10xlarge:
      Arch: NATHVM64
    c1.medium:
      Arch: NATHVM64
    c1.xlarge:
      Arch: NATHVM64
    c3.large:
      Arch: NATHVM64
    c3.xlarge:
      Arch: NATHVM64
    c3.2xlarge:
      Arch: NATHVM64
    c3.4xlarge:
      Arch: NATHVM64
    c3.8xlarge:
      Arch: NATHVM64
    c4.large:
      Arch: NATHVM64
    c4.xlarge:
      Arch: NATHVM64
    c4.2xlarge:
      Arch: NATHVM64
    c4.4xlarge:
      Arch: NATHVM64
    c4.8xlarge:
      Arch: NATHVM64
    g2.2xlarge:
      Arch: NATHVMG2
    g2.8xlarge:
      Arch: NATHVMG2
    r3.large:
      Arch: NATHVM64
    r3.xlarge:
      Arch: NATHVM64
    r3.2xlarge:
      Arch: NATHVM64
    r3.4xlarge:
      Arch: NATHVM64
    r3.8xlarge:
      Arch: NATHVM64
    i2.xlarge:
      Arch: NATHVM64
    i2.2xlarge:
      Arch: NATHVM64
    i2.4xlarge:
      Arch: NATHVM64
    i2.8xlarge:
      Arch: NATHVM64
    d2.xlarge:
      Arch: NATHVM64
    d2.2xlarge:
      Arch: NATHVM64
    d2.4xlarge:
      Arch: NATHVM64
    d2.8xlarge:
      Arch: NATHVM64
    hi1.4xlarge:
      Arch: NATHVM64
    hs1.8xlarge:
      Arch: NATHVM64
    cr1.8xlarge:
      Arch: NATHVM64
    cc2.8xlarge:
      Arch: NATHVM64
  AWSRegionArch2AMI:
    af-south-1:
      HVM64: ami-064cc455f8a1ef504
      HVMG2: NOT_SUPPORTED
    ap-east-1:
      HVM64: ami-f85b1989
      HVMG2: NOT_SUPPORTED
    ap-northeast-1:
      HVM64: ami-0b2c2a754d5b4da22
      HVMG2: ami-09d0e0e099ecabba2
    ap-northeast-2:
      HVM64: ami-0493ab99920f410fc
      HVMG2: NOT_SUPPORTED
    ap-northeast-3:
      HVM64: ami-01344f6f63a4decc1
      HVMG2: NOT_SUPPORTED
    ap-south-1:
      HVM64: ami-03cfb5e1fb4fac428
      HVMG2: ami-0244c1d42815af84a
    ap-southeast-1:
      HVM64: ami-0ba35dc9caf73d1c7
      HVMG2: ami-0e46ce0d6a87dc979
    ap-southeast-2:
      HVM64: ami-0ae99b503e8694028
      HVMG2: ami-0c0ab057a101d8ff2
    ca-central-1:
      HVM64: ami-0803e21a2ec22f953
      HVMG2: NOT_SUPPORTED
    cn-north-1:
      HVM64: ami-07a3f215cc90c889c
      HVMG2: NOT_SUPPORTED
    cn-northwest-1:
      HVM64: ami-0a3b3b10f714a0ff4
      HVMG2: NOT_SUPPORTED
    eu-central-1:
      HVM64: ami-0474863011a7d1541
      HVMG2: ami-0aa1822e3eb913a11
    eu-north-1:
      HVM64: ami-0de4b8910494dba0f
      HVMG2: ami-32d55b4c
    eu-south-1:
      HVM64: ami-08427144fe9ebdef6
      HVMG2: NOT_SUPPORTED
    eu-west-1:
      HVM64: ami-015232c01a82b847b
      HVMG2: ami-0d5299b1c6112c3c7
    eu-west-2:
      HVM64: ami-0765d48d7e15beb93
      HVMG2: NOT_SUPPORTED
    eu-west-3:
      HVM64: ami-0caf07637eda19d9c
      HVMG2: NOT_SUPPORTED
    me-south-1:
      HVM64: ami-0744743d80915b497
      HVMG2: NOT_SUPPORTED
    sa-east-1:
      HVM64: ami-0a52e8a6018e92bb0
      HVMG2: NOT_SUPPORTED
    us-east-1:
      HVM64: ami-032930428bf1abbff
      HVMG2: ami-0aeb704d503081ea6
    us-east-2:
      HVM64: ami-027cab9a7bf0155df
      HVMG2: NOT_SUPPORTED
    us-west-1:
      HVM64: ami-088c153f74339f34c
      HVMG2: ami-0a7fc72dc0e51aa77
    us-west-2:
      HVM64: ami-01fee56b22f308154
      HVMG2: ami-0fe84a5b4563d8f27

Resources:
  #SNSトピック
  NotificationTopic:
    Type: 'AWS::SNS::Topic'
    Properties:
      Subscription:
        #パラメータで入力したEmailをエンドポイント(宛先)に。
        - Endpoint: !Ref OperatorEMail
          Protocol: email

  #オートスケーリンググループ
  WebServerGroup:
    Type: 'AWS::AutoScaling::AutoScalingGroup'
    Properties:
      #パラメータで選択した複数のサブネットを指定。
      VPCZoneIdentifier: !Ref Subnets
      #起動設定を指定。
      LaunchConfigurationName: !Ref LaunchConfig
      #起動するインスタンス数は最低1-最大3
      MinSize: '1'
      MaxSize: '3'
      #ALBのターゲットグループを指定。
      TargetGroupARNs:
        - !Ref ALBTargetGroup
      #通知設定
      NotificationConfiguration:
        #SNSトピックを指定。
        TopicARN: !Ref NotificationTopic
        #通知するタイプを指定。インスタンスの作成・エラー・削除・削除エラー。
        NotificationTypes:
          - 'autoscaling:EC2_INSTANCE_LAUNCH'
          - 'autoscaling:EC2_INSTANCE_LAUNCH_ERROR'
          - 'autoscaling:EC2_INSTANCE_TERMINATE'
          - 'autoscaling:EC2_INSTANCE_TERMINATE_ERROR'
    #作成ポリシー
    CreationPolicy:
      ResourceSignal:
        #15分のタイムアウト
        Timeout: PT15M #ISO8601 日付/時刻形式(「PT#H#M#S」形式。「#」はそれぞれ、時間数、分数、秒数を表す。)
        #一回
        Count: '1'
    #更新ポリシー
    UpdatePolicy:
      #更新はローリングアップデート
      AutoScalingRollingUpdate:
        MinInstancesInService: '1' #更新中 InServiceにするインスタンスの最小数 ↑のMaxサイズ以下である必要がある。
        MaxBatchSize: '1'
        PauseTime: PT15M # バッチ更新後 CFnが停止する時間の長さ。
        WaitOnResourceSignals: 'true' #ASGがインスタンスのシグナルを待機するかどうか。
  #起動設定
  LaunchConfig:
    Type: 'AWS::AutoScaling::LaunchConfiguration'
    #アパッチとindex.htmlを用意。
    Metadata:
      Comment: Install a simple application
      'AWS::CloudFormation::Init':
        config:
          packages:
            yum:
              httpd: []
          files:
            /var/www/html/index.html:
              content: !Join 
                - |+

                - - <img src="
                  - !FindInMap 
                    - Region2Examples
                    - !Ref 'AWS::Region'
                    - Examples
                  - /cloudformation_graphic.png" alt="AWS CloudFormation Logo"/>
                  - >-
                    <h1>Congratulations, you have successfully launched the AWS
                    CloudFormation sample.</h1>
              mode: '000644'
              owner: root
              group: root
            /etc/cfn/cfn-hup.conf:
              content: !Join 
                - ''
                - - |
                    [main]
                  - stack=
                  - !Ref 'AWS::StackId'
                  - |+

                  - region=
                  - !Ref 'AWS::Region'
                  - |+

              mode: '000400'
              owner: root
              group: root
            /etc/cfn/hooks.d/cfn-auto-reloader.conf:
              content: !Join 
                - ''
                - - |
                    [cfn-auto-reloader-hook]
                  - |
                    triggers=post.update
                  - >
                    path=Resources.LaunchConfig.Metadata.AWS::CloudFormation::Init
                  - 'action=/opt/aws/bin/cfn-init -v '
                  - '         --stack '
                  - !Ref 'AWS::StackName'
                  - '         --resource LaunchConfig '
                  - '         --region '
                  - !Ref 'AWS::Region'
                  - |+

                  - |
                    runas=root
              mode: '000400'
              owner: root
              group: root
          services:
            sysvinit:
              httpd:
                enabled: 'true'
                ensureRunning: 'true'
              cfn-hup:
                enabled: 'true'
                ensureRunning: 'true'
                files:
                  - /etc/cfn/cfn-hup.conf
                  - /etc/cfn/hooks.d/cfn-auto-reloader.conf
    Properties:
      #パラメータで選択したキー
      KeyName: !Ref KeyName
      #AMIを指定(※Mappingで該当するもの)
      ImageId: !FindInMap 
        - AWSRegionArch2AMI 
        - !Ref 'AWS::Region'
        - !FindInMap 
          - AWSInstanceType2Arch
          - !Ref InstanceType
          - Arch
      #セキュリティグループを指定。
      SecurityGroups:
        - !Ref InstanceSecurityGroup
      InstanceType: !Ref InstanceType
      #各インスタンス起動時に一度だけ実行されるコマンド。
      UserData: !Base64 
        'Fn::Join':
          - ''
          - - |
              #!/bin/bash -xe
            - |
              yum update -y aws-cfn-bootstrap
            - |
              yum update -y aws-cli
            - '/opt/aws/bin/cfn-init -v '
            - '         --stack '
            - !Ref 'AWS::StackName'
            - '         --resource LaunchConfig '
            - '         --region '
            - !Ref 'AWS::Region'
            - |+

            - '/opt/aws/bin/cfn-signal -e $? '
            - '         --stack '
            - !Ref 'AWS::StackName'
            - '         --resource WebServerGroup '
            - '         --region '
            - !Ref 'AWS::Region'
            - |+

  #スケーリングポリシー(スケールUP)
  WebServerScaleUpPolicy:
    Type: 'AWS::AutoScaling::ScalingPolicy'
    Properties:
      AdjustmentType: ChangeInCapacity #ScalingAdjustmentの数値の解釈。増減か、その数に変更か、パーセンテージ増減か。ここでは指定の数を増減。
      AutoScalingGroupName: !Ref WebServerGroup #どのASGに対するポリシーか。
      Cooldown: '60' #秒単位のクールダウン期間
      ScalingAdjustment: '1' #↑AdjustmentTypeで説明済み。
      
  #スケーリングポリシー(スケールDOWN)
  WebServerScaleDownPolicy:
    Type: 'AWS::AutoScaling::ScalingPolicy'
    Properties:
      AdjustmentType: ChangeInCapacity
      AutoScalingGroupName: !Ref WebServerGroup
      Cooldown: '60'
      ScalingAdjustment: '-1' #同じ条件で1減らす。
  
  #クラウドウォッチアラーム(上)
  CPUAlarmHigh:
    Type: 'AWS::CloudWatch::Alarm'
    Properties:
      #このアラームの説明
      AlarmDescription: Scale-up if CPU > 90% for 10 minutes #「10分でCPUが90%超えたらスケールアップするよ。」
      MetricName: CPUUtilization #CPU使用率メトリック
      Namespace: AWS/EC2 
      Statistic: Average #平均
      Period: '300' #5分が
      EvaluationPeriods: '2' #2回 評価期間
      Threshold: '90' #閾値
      AlarmActions: #このアラームがなった時のアクション
        - !Ref WebServerScaleUpPolicy #スケールアップポリシー
      Dimensions:
        - Name: AutoScalingGroupName
          Value: !Ref WebServerGroup
      ComparisonOperator: GreaterThanThreshold #より大きい ">"の事。 他にはGreaterThanOrEqualToThreshold(以上)、 LessThanOrEqualToThreshold(以下)、LessThanThreshold(より低い)がある。
  
  #クラウドウォッチアラーム(下)
  CPUAlarmLow:
    Type: 'AWS::CloudWatch::Alarm'
    Properties:
      AlarmDescription: Scale-down if CPU < 70% for 10 minutes #「10分でCPUが70%より低くなったらスケールダウンするよ。」
      MetricName: CPUUtilization
      Namespace: AWS/EC2
      Statistic: Average
      Period: '300'
      EvaluationPeriods: '2'
      Threshold: '70'
      AlarmActions:
        - !Ref WebServerScaleDownPolicy
      Dimensions:
        - Name: AutoScalingGroupName
          Value: !Ref WebServerGroup
      ComparisonOperator: LessThanThreshold

  #ALB
  ApplicationLoadBalancer:
    Type: 'AWS::ElasticLoadBalancingV2::LoadBalancer'
    Properties:
      #パラメータで選択した複数サブネットを指定。
      Subnets: !Ref Subnets
  
  #ALBリスナー
  ALBListener:
    Type: 'AWS::ElasticLoadBalancingV2::Listener'
    Properties:
      DefaultActions:
        - Type: forward #指定されたターゲットグループにリクエストを転送。他にauthenticate-cognito/authenticate-oidc/fixed-response/redirect がある(字面でそこそこわかりますが、各詳細はドキュメントを参照ください。)
          TargetGroupArn: !Ref ALBTargetGroup #ターゲットグループを指定
      LoadBalancerArn: !Ref ApplicationLoadBalancer #ALBを指定
      Port: '80' #ポートは80(HTTPの事)
      Protocol: HTTP 
  
  #ターゲットグループ
  ALBTargetGroup:
    Type: 'AWS::ElasticLoadBalancingV2::TargetGroup'
    Properties:
      HealthCheckIntervalSeconds: 30 #個々のターゲットのヘルスチェックの概算間隔 (秒単位) ターゲットがinstanceやipの場合は30、Lambdaの場合は35秒がデフォなので、今回はデフォルトと同じ。
      HealthCheckTimeoutSeconds: 5 #ヘルスチェック失敗と見なす、ターゲットからレスポンスがない時間 (秒単位)instance/ipは5秒がデフォルト Lambdaは30秒がデフォ。
      HealthyThresholdCount: 3 #非正常インスタンスが正常であると見なすまでに必要なヘルスチェックの連続成功回数。デフォは5なので少ない回数を設定している。
      Port: 80 
      Protocol: HTTP
      UnhealthyThresholdCount: 5 #非正常インスタンスが非正常であると見なすまでに必要なヘルスチェックの連続失敗回数。デフォは2なので多く取っている。
      VpcId: !Ref VpcId

  #セキュリティグループ
  InstanceSecurityGroup:
    Type: 'AWS::EC2::SecurityGroup'
    Properties:
      #説明
      GroupDescription: Enable SSH access and HTTP from the load balancer only #「ALBからのSSHとHTTPのみOKにしてるよ。」
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: '22' #22はSSH
          ToPort: '22'
          CidrIp: !Ref SSHLocation #パラメータで入力したIPレンジ
        - IpProtocol: tcp
          FromPort: '80' #80はHTTP
          ToPort: '80'
          SourceSecurityGroupId: !Select #ALBのセキュリティグループ あるいは0.0.0.0/0 いずれかが選択される(とドキュメントを読み解釈)
            - 0 
            - !GetAtt 
              - ApplicationLoadBalancer
              - SecurityGroups
      VpcId: !Ref VpcId
#出力(する値)
Outputs:
  URL:
    Description: The URL of the website
    Value: !Join #結合する
      - '' #何も間に挟まずに
      - - 'http://' #←と↓のALBのDNS名(アクセスするとALBを介してASGで作成したEC2にアクセス出来る。)
        - !GetAtt 
          - ApplicationLoadBalancer
          - DNSName

作成されたリソースタイプまとめ。

上記テンプレートで作成されるタイプは以下(「AWS::」は省略)

AutoScaling::AutoScalingGroup
AutoScaling::LaunchConfiguration
AutoScaling::ScalingPolicy×2
CloudWatch::Alarm×2
SNS::Topic
EC2::SecurityGroup
ElasticLoadBalancingV2::LoadBalancer
ElasticLoadBalancingV2::TargetGroup
ElasticLoadBalancingV2::Listener

ELBはV2と書いてあるのでALBかNLB。(今回はALB)
そのELB用に
・ターゲットグループ
・リスナー

・オートスケーリンググループ
・起動設定
・スケールアップ(インスタンスを増やす時用)
・スケールダウン(減らす時用)
二つのスケーリングポリシー。

入力したメールアドレスに通知を行うSNSトピック

・ハイ(CPU使用率が一定より上がった時用)
・ロー(その逆で下がった時用)
二つのクラウドウォッチアラーム。

入力画面はこのようになっています。

上記パラメータで入力した値が!Refで参照され、各所で使用されていました。
出力タブからhttp:// とALBのDNS名を結合したURLがあります。クリックすると、

このように表示されます。

以上でした。

私自身「Iac=マネコンより難解」と勝手に思ってしまっていた節があるので、実はそんな事なくて「これはここを参照・あれはここで使う」と画面遷移せずに確認出来るので、AWSに触れて短い方にも、
以外と「日本語以外=難しい」という事もないのではという感覚を共有していただけたら幸いです。

思ったよりカタカナを常用している人種ですし、知らない単語の用途に触れたり、慣れていただくきっかけになれば嬉しいです。

日々練習がてら取り組んでいこうと思っているので、また同じようにアップしていきます。

それでは良い一日にしましょう^^ ありがとう御座いました。

Discussion