【问题标题】:Cloudformation template completes deployment before UserData is finishedCloudformation 模板在 UserData 完成之前完成部署
【发布时间】:2020-06-08 09:17:09
【问题描述】:

在我正在部署的 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 模板正在完成它的部署 UserData 脚本完成运行之前。我相信是这样,因为如果我足够快并通过 ssh 进入实例,我会看到如下内容:

$ cat /var/log/mycustomlog.log
UserData starting

这表明 UserData 没有完成运行


如何确保在堆栈处于“CreateComplete”状态之前完成 UserData 代码执行?

【问题讨论】:

标签: amazon-web-services amazon-ec2 amazon-cloudformation


【解决方案1】:

为确保 CloudFormation 模板等待 UserData 脚本完成,您必须做两件事:

  1. CreationPolicy 添加到您要定位的资源(在我的例子中是虚拟机)。

  2. 在脚本中添加逻辑以指示其完成。此自定义逻辑使用 cfn-signal 实用程序,您可能必须将其安装在您的实例中。


这是模板现在的样子:

"UserData": {
    "Fn::Base64" : {
        "Fn::Join" : [
            "",
            [
            "/usr/local/bin/mylongrunningscript.sh"
            ]
        ]
    }
},
"CreationPolicy": {
    "ResourceSignal" : {
        "Count": "1",
        "Timeout": "PT10M"
    }
}

cfn-signal 实用程序用于发出脚本终止的信号:

"/home/ubuntu/aws-cfn-bootstrap-*/bin/cfn-signal -e $? ",
" --stack ", { "Ref": "AWS::StackName" },
" --resource MyInstance" ,
" --region ", { "Ref" : "AWS::Region" }, "\n"

有关 Windows 示例,请参阅 here

【讨论】:

    猜你喜欢
    • 2019-11-26
    • 2021-05-27
    • 2019-06-27
    • 2015-03-15
    • 1970-01-01
    • 2019-01-22
    • 1970-01-01
    • 2020-02-25
    • 2016-07-16
    相关资源
    最近更新 更多