在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中实例的滚动重启
答案 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': ........