我正在尝试在封装以下内容的模板中使用AWS autoscaling 生命周期挂钩 :
AWS::AutoScaling::AutoScalingGroup具有关联的扩展/缩小策略,启动configuration,IAMangular色等。 AWS::AutoScaling::LifecycleHook用于EC2启动/终止事件。 AWS::SQS::Queue (在一个简化示例中)生命周期通知发布。 AWS::IAM::Role自动调节组的AWS::IAM::Roleangular色将通知发送到SQS队列。 启动ASG时,队列最终会生成两个生成周期挂钩的testing通知,但不会发送实例启动通知。
这里是比赛条件。
AWS::AutoScaling::LifecycleHook对象引用AWS::AutoScaling::AutoScalingGroup (因此取决于它)。 这决定了CloudFormation创build资源的顺序(首先创build组)。
问题是,组在钩子创build完成之前开始启动实例(实例启动不是模板的一部分,因此它开始并行执行)。 在创build钩子时,不会再有事件发布,因为已经创build了实例。
有什么办法可以解决它,并在堆栈启动时捕获启动事件?
这不是一个理想的解决scheme,但是一个两遍的堆栈创build是一个有效的解决方法?
AutoScalingGroup资源中的DesiredCapacity属性设置为0 。 这允许LaunchConfiguration , AutoScalingGroup和LifecycleHook资源,而不实际启动任何实例。 DesiredCapacity设置为所需的计数(> 0 )。 这应该在创buildLifecycleHook之后启动所需的实例。 我不确定这是否会起作用,但是看起来您可能能够使用ASG资源中的NotificationConfiguration获得类似的结果。
NotificationConfiguration可以向SQS队列订阅的SNS主题发送通知。 很明显,生命周期将以这种方式进展,而不是等待complete-lifecycle-action ,但至less所有实例启动都将在队列中可用。
HTH
编辑
另一个select可能是使用WaitCondition或CreationPolicy – 不确定是否在生命周期钩子处理之前应用这些选项。