【问题标题】:Is it possible to use cfn-signal without using cfn-init in my cloudformation template?是否可以在我的 cloudformation 模板中使用 cfn-signal 而不使用 cfn-init?
【发布时间】:2019-06-29 12:28:49
【问题描述】:

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

谢谢。

【问题讨论】:

    标签: amazon-ec2 amazon-cloudformation


    【解决方案1】:

    不,cfn-init 和 cfn-signal 是两个完全独立的机制,可以单独使用一个。

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

    我在我的 Snowplow cloudformation 模板中广泛使用 cfn-signal。在这里查一下相关的 sn-ps...

    这是我如何单独调用 cfn-signal 的 sn-p 示例:

      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'
    

    上面的 sn-p 去掉了多余的部分。你可以在这里找到模板:

    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 脚本就更简洁、更易于阅读。

    【讨论】:

      猜你喜欢
      • 2019-01-23
      • 2019-07-08
      • 2016-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-21
      • 1970-01-01
      相关资源
      最近更新 更多