AWS Cloudformation:Auto Scaling组中的挂起流程

时间:2019-08-13 22:56:46

标签: amazon-web-services amazon-cloudformation autoscaling

在Cloudformation中定义自动伸缩组资源时,我需要将AZRebalance添加为SuspendProcesses的一部分。

文档https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-updatepolicy.html#cfn-attributes-updatepolicy-rollingupdate指出,此操作是 AutoScalingRollingUpdate UpdatePolicy的一部分。

"UpdatePolicy" : {
  "AutoScalingRollingUpdate" : {
    "MaxBatchSize" : Integer,
    "MinInstancesInService" : Integer,
    "MinSuccessfulInstancesPercent" : Integer,
    "PauseTime" : String,
    "SuspendProcesses" : [ List of processes ],
    "WaitOnResourceSignals" : Boolean
  }
}

不幸的是,这会导致ASG中的实例在LaunchConfig中发生更改时重新启动。创建堆栈时,有什么方法可以同时兼顾两者吗?即

1)在堆栈创建时挂起ASG中的某些进程
2)在LaunchConfig更改时,禁用ASG中实例的滚动重启

2 个答案:

答案 0 :(得分:0)

我认为您不能使用云形成来暂停自动伸缩组中的流程,但是会忽略启动配置更改。

一种选择是直接调用自动缩放以暂停进程,而不是通过云形成

答案 1 :(得分:0)

当前,CloudFormation AutoScaling组资源不具有任何启用挂起进程的属性。

此外,使用UpdatePolicy意味着这些选项仅在从CloudFormation进行更新而不是创建期间适用于ASG。

一种解决方法是查看自定义资源以实现此目的:

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-custom-resources.html

此外,下面的链接可能会帮助您通过示例了解操作方法:

https://gist.github.com/atward/9573b9fbd3bfd6c453158c28356bec05

以下是一个假设的解决方案(我也没有测试上述解决方案):

#"Create" behavior, will make suspend_processes API call for AZ Rebalancing
          client = boto3.client("autoscaling")
          ASGName = event['ResourceProperties']['ASGname']
          if event['RequestType'] == 'Create':
              response = client.suspend_processes(
                  AutoScalingGroupName = ASGName,  
                  ScalingProcesses=['AZRebalance']
              )
              responseData = {}
              cfnresponse.send(event, context, cfnresponse.SUCCESS, responseData) #Telling CFN it was a success here

但是我建议您改进实现,并添加try catch块以处理异常并通知失败,以便CloudFormation堆栈不会挂起(即它将等待来自Custom资源的信号(成功/失败)) )并正确失败。

您以类似的方式处理更新行为:

elif event['RequestType'] == 'Update': ........