在我正在部署的 CloudFormation 模板中,我在 UserData 块中运行长时间运行的操作。
它看起来如下:
"UserData": {
"Fn::Base64" : {
"Fn::Join" : [
"",
[
"/usr/local/bin/mylongrunningscript.sh"
]
]
}
}
脚本的内容是:
echo "UserData starting!" > /var/log/mycustomlog.log
sleep 300
echo "UserData finished!" >> /var/log/mycustomlog.log
我看到的问题是我相信 CloudFormation 模板正在完成其部署beforeUserData 脚本完成运行。我相信情况确实如此,因为如果我足够快并通过 ssh 进入实例,我将看到如下内容:
$ cat /var/log/mycustomlog.log
UserData starting
这表明 UserData 没有完成运行
如何确保在堆栈处于“CreateComplete”状态之前 UserData 代码执行完成?
为了确保 CloudFormation 模板等待 UserData 脚本完成,您必须执行以下两件事:
-
Add a 创造政策 https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-creationpolicy.html到您要定位的资源(在我的例子中是虚拟机)。
-
在脚本中添加逻辑以表明其完成。此自定义逻辑使用cfn 信号 https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-init.html实用程序,您可能必须在实例中安装该实用程序。
模板现在的外观如下:
"UserData": {
"Fn::Base64" : {
"Fn::Join" : [
"",
[
"/usr/local/bin/mylongrunningscript.sh"
]
]
}
},
"CreationPolicy": {
"ResourceSignal" : {
"Count": "1",
"Timeout": "PT10M"
}
}
The cfn 信号实用程序用于指示脚本终止:
"/home/ubuntu/aws-cfn-bootstrap-*/bin/cfn-signal -e $? ",
" --stack ", { "Ref": "AWS::StackName" },
" --resource MyInstance" ,
" --region ", { "Ref" : "AWS::Region" }, "\n"
See here https://stackoverflow.com/a/62386380/3390419以 Windows 为例。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)