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