有没有办法使用CloudFormation创buildAWS自动调整生命周期钩子而没有竞争条件?

我正在尝试在封装以下内容的模板中使用AWS autoscaling 生命周期挂钩 :

  1. AWS::AutoScaling::AutoScalingGroup具有关联的扩展/缩小策略,启动configuration,IAMangular色等。
  2. AWS::AutoScaling::LifecycleHook用于EC2启动/终止事件。
  3. AWS::SQS::Queue (在一个简化示例中)生命周期通知发布。
  4. AWS::IAM::Role自动调节组的AWS::IAM::Roleangular色将通知发送到SQS队列。

启动ASG时,队列最终会生成两个生成周期挂钩的testing通知,但不会发送实例启动通知。

这里是比赛条件。

AWS::AutoScaling::LifecycleHook对象引用AWS::AutoScaling::AutoScalingGroup (因此取决于它)。 这决定了CloudFormation创build资源的顺序(首先创build组)。

问题是,组在钩子创build完成之前开始启动实例(实例启动不是模板的一部分,因此它开始并行执行)。 在创build钩子时,不会再有事件发布,因为已经创build了实例。

有什么办法可以解决它,并在堆栈启动时捕获启动事件?

这不是一个理想的解决scheme,但是一个两遍的堆栈创build是一个有效的解决方法?

  1. 在创build初始堆栈时,将AutoScalingGroup资源中的DesiredCapacity属性设置为0 。 这允许LaunchConfigurationAutoScalingGroupLifecycleHook资源,而不实际启动任何实例。
  2. 在随后的堆栈更新DesiredCapacity设置为所需的计数(> 0 )。 这应该在创buildLifecycleHook之后启动所需的实例。

我不确定这是否会起作用,但是看起来您可能能够使用ASG资源中的NotificationConfiguration获得类似的结果。

NotificationConfiguration可以向SQS队列订阅的SNS主题发送通知。 很明显,生命周期将以这种方式进展,而不是等待complete-lifecycle-action ,但至less所有实例启动都将在队列中可用。

HTH

编辑

另一个select可能是使用WaitConditionCreationPolicy – 不确定是否在生命周期钩子处理之前应用这些选项。