CloudFormation UpdatePolicyを使用してAuto Scaling Groupの更新を処理する

2021.11.10

CloudFormation UpdatePolicyとは?

UpdatePolicyはCloudFormationのリソース属性です。UpdatePolicyを使用して、AWS Resourcesの更新を処理することができます。

更新ポリシーをサポートしている AWS CloudFormation リソースは:

  • AWS::AutoScaling::AutoScalingGroup
  • AWS::ElastiCache::ReplicationGroup
  • AWS::ElastiCache::Domain
  • AWS::AppStream::Fleet
  • AWS::Lambda::Alias
  • AWS::OpenSearchService::Domain

この記事では、更新ポリシーを使用してAutoScalingGroupの更新を処理してみました。AWS::AutoScaling::AutoScalingGroupリソースでは、3 つの更新ポリシーがあります。

  • AutoScalingReplacingUpdate
  • AutoScalingRollingUpdate
  • AutoScalingScheduledAction

 

やってみた

CloudFormationでAuto Scaling グループを作成しておきます。このAuto Scaling グループは3つのEC2インスタンス(t2.micro)を作成されます。

Replacing Updateポリシー

Replacing Updateポリシーでは、Auto Scaling グループまたはAuto Scaling グループのインスタンスが更新時に置き換えられます。この更新とき、新しいAuto Scalingグループの作成が完了するまでCloudFormationが古いAuto Scalingグループを保持します。失敗した場合、CloudFormation は古いグループにロールバックして、新しい  グループを削除します。

 

UpdatePolicy:
  AutoScalingReplacingUpdate:
   # The WillReplace attribute is set to true for replace update
    WillReplace: True

 

CloudFormationは新しいグループの作成が完了した後で、古いAuto Scalingグループを削除します。WillReplaceパラメーターを設定するときは、 CreationPolicyを指定する必要がある。

 

ReplacingUpdateのテンプレート:

インスタンスタイプをt2.microからt2.small に変更して、Auto ScalingグループをAutoScalingReplacingUpdateで更新しておきます。

 

Parameters:
  LatestAMIID:
    Type: 'AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>'
    Default: '/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2'

Resources: 
  LaunchConfig:
    Type: AWS::AutoScaling::LaunchConfiguration
    Properties:
      ImageId: !Ref LatestAMIID
      InstanceType: t2.small  #t2.micro
      UserData:
        Fn::Base64:
          !Sub |
            #!/bin/bash -xe
            /opt/aws/bin/cfn-signal --resource AutoScalingGroup --region ${AWS::Region} --stack ${AWS::StackName}

  AutoScalingGroup:
    Type: AWS::AutoScaling::AutoScalingGroup
    Properties:
      AvailabilityZones: 
        - us-east-1a
        - us-east-1b
        - us-east-1c
      LaunchConfigurationName:
        Ref: LaunchConfig
      DesiredCapacity: 3
      MinSize: 1
      MaxSize: 4
    CreationPolicy:
      ResourceSignal:
        Count: 3
        Timeout: PT5M
    UpdatePolicy:
      AutoScalingReplacingUpdate:
        WillReplace: 'true'

 

更新する前に、変更セットのプレビューで変更を見ることができます。

 

下の画像は、作成中の新しいAuto Scalingグループを示しています。

 

ReplacingUpdateポリシーは、新しいLaunchConfigurationと新しいAuto Scalingグループを作成されます。CloudFormation がインスタンスの作成の成功シグナルを受信します。

 

CloudFormation が成功シグナルを受信した後で、古いAuto Scalingグループと古いLaunch Configurationを削除されます。

 

この画像では、古いAuto Scalingグループのイインスタンスが終了しています。

 

RollingUpdateポリシー

RollingUpdateでは、Auto Scaling グループのインスタンスをバッチでまたは一度にすべて更新します。ローリング更新の場合、バッチサイズとインスタンスの最小数とPauseTimeを指定必要があります。CloudFormationがバッチで更新した後で、古いLaunch Configurationを削除されます。

 

Rolling更新のテンプレート

インスタンスタイプをt2.microからt2.small に変更して、Auto ScalingグループをAutoScalingRollingUpdateで更新しておきます。

Parameters:
  LatestAMIID:
    Type: 'AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>'
    Default: '/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2'

Resources: 
  LaunchConfiguration:
    Type: AWS::AutoScaling::LaunchConfiguration
    Properties:
      ImageId: !Ref LatestAMIID
      InstanceType: t2.small 
      UserData:
        Fn::Base64:
          !Sub |
            #!/bin/bash -xe
            /opt/aws/bin/cfn-signal --resource AutoScalingGroup --region ${AWS::Region} --stack ${AWS::StackName}

  AutoScalingGroup:
    Type: AWS::AutoScaling::AutoScalingGroup
    Properties:
      AvailabilityZones: 
        - us-east-1a
        - us-east-1b
        - us-east-1c
      LaunchConfigurationName:
        Ref: LaunchConfiguration
      DesiredCapacity: 3
      MinSize: 1
      MaxSize: 4
    CreationPolicy:
      ResourceSignal:
        Count: 3
        Timeout: PT5M
    UpdatePolicy:
      AutoScalingRollingUpdate:
        MaxBatchSize: 2   
        MinInstancesInService: 1
        PauseTime: PT1M
        WaitOnResourceSignals: 'true'

 

AutoScalingRollingUpdate ポリシーのプロパティ

  • MaxBatchSize ー バッチで更新するインスタンスの最大数を指定します。バッチあたりの最大インスタンス数は100です。
  • MinInstancesInService ー 更新の時、InServiceにするインスタンスの最小数を指定します。
  • PauseTime ー バッチ更新の後 CloudFormation が止する時間の長さを指定します。
  • WaitOnResourceSignals ー Auto Scaling グループがインスタンスのシグナルを待機すかどうかを指定します。

 

変更セットのプレビュー

 

このAuto Scaling グループで3つのインスタンがありますから、この更新は2つのバッチで行われます。

  • 最初のバッチで2つのインスタンスが更新されます。この画像では、2つのインスタンスが作成され、2つのインスタンスが削除されいます。

 

  • 2番目のバッチ1つのインスタンスが更新されます。

 

RollingUpdateの後、CloudFormation が古いLaunch Configurationを削除されます。

 

Scheduled Action更新ポリシー

Scheduled Action更新ポリシーはスケジュールされたアクションが関連付けられている Auto Scaling グループを更新するとき使います。この更新ポリシーでは、Auto Scaling グループのグループサイズプはいつでも変更されます。

グループサイズを変更したくない場合は、IgnoreUnmodifiedGroupSizeProperties : "True" に設定してください。

UpdatePolicy:
  AutoScalingScheduledAction:
    IgnoreUnmodifiedGroupSizeProperties: True

まとめ

CloudFormationでAuto Scaling グループのReplacingUpdateとRollingUpdateポリシートライしてみました。UpdatePolicyは、Auto Scaling グループのインスタンスを更新するプロセスを自動化します。

Reference : CloudFormation UpdatePolicy