是否可以在我的cloudformation模板中不使用cfn-init来使用cfn信号?

时间:2019-02-05 16:14:32

标签: amazon-ec2 amazon-cloudformation

我现在有一个cloudformation堆栈,该堆栈设置了一个简单的ec2实例,并将所有python软件包和文件安装在用户数据部分。我什至从没在堆栈的任何地方提到cfn-init,也没有元数据。是否仍然可以使用cfn-signal来提醒我的堆栈ec2实例的设置尚未完成?还是必须同时使用cfn-signal和cfn-init?

谢谢。

1 个答案:

答案 0 :(得分:0)

不是,cfn-init和cfn-signal是两种完全独立的机制,可以彼此不使用。

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-signal.html

我在Snowplow cloudformation模板中广泛使用cfn信号。在此处获取相关摘要...

这是我自己如何调用cfn信号的代码段示例:

  EventCollectionGroup:
    Type: 'AWS::AutoScaling::AutoScalingGroup'
    Properties:
      LaunchConfigurationName: !Ref EventCollectionLc
    CreationPolicy:
      ResourceSignal:
        Count: 2
        Timeout: PT10M
    UpdatePolicy:
      AutoScalingRollingUpdate:
        MinInstancesInService: 1
        WaitOnResourceSignals: 'true'
        PauseTime: PT10M

  EventCollectionLc:
    Type: 'AWS::AutoScaling::LaunchConfiguration'
    Properties:
      UserData: !Base64 
        'Fn::Sub': |
          #!/bin/bash
          docker run -t --rm ${ContainerAwsUtil} cfn-signal -e $? --stack ${AWS::StackName} --resource EventCollectionGroup --region ${AWS::Region}
    UpdatePolicy:
      AutoScalingReplacingUpdate:
        WillReplace: 'true'

以上代码段中的多余内容已被修剪掉。您可以在此处找到模板:

https://github.com/Bit-Clouded/Glenlivet/blob/master/analytics/snowplow.template#L368

如您所见,我实际上在容器本身中运行cfn-init,甚至没有在服务器上安装util。

docker容器的定义在这里:

FROM alpine:3.6

RUN apk add --no-cache ca-certificates python py-pip groff less jq curl &&\
    pip install awscli &&\
    pip install https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-latest.tar.gz

再次,附加内容被修剪。完整文件在这里:

https://github.com/Bit-Clouded/Angostura/blob/master/utility/aws-util/Dockerfile


实际上,我个人已经完全离开了cfn-init,并且移动了所有需要通过docker插入的二进制文件。只是UserData部分中的bash脚本更加简洁,易于阅读。