【问题标题】:How to pass CloudFormation's WaitHandle to a different Cloud Formation stack?如何将 CloudFormation 等待句柄传递给不同的 Cloudformation 堆栈?
【发布时间】:2016-11-14 23:53:51
【问题描述】:

由于云形成堆栈中资源数量的限制,我们需要有多个堆栈,其中我们的主堆栈启动其他几个较小的子堆栈。我们在主堆栈中创建了等待条件,需要将其传递给某些子堆栈中的资源。目前,我们在 WaitHandle 上等待整个子堆栈,而不是子堆栈中的各个资源。然而,这不必要地增加了我们的启动时间。 为了解决这个问题,我尝试将 WaitHandle 作为参数传递给子堆栈,但我不确定参数的类型是什么。 我还听到我的同事说您可以尝试将 WaitHandle 的 URL 作为字符串传递,然后尝试在子堆栈中使用该 URL 创建一个新的 WaitHandle,但我没有看到任何文档。 我在 CloudFormation 中尝试做的事情是否可行?

【问题讨论】:

    标签: amazon-web-services amazon-cloudformation


    【解决方案1】:

    是的,这是可能的。根据AWS::CloudFormation::WaitConditionHandle 文档,将 WaitHandle URL 作为字符串传递给您的子堆栈,

    当您使用 Ref 函数引用 WaitConditionHandle 资源时,AWS CloudFormation 会返回一个预签名 URL。您将此 URL 传递给在您的 Amazon EC2 实例上运行的应用程序或脚本,以向该 URL 发送信号。

    实际上有两种不同的方法可以实现您的目标:

    1. {"Ref": "MyWaitHandle"} 作为参数传递给子堆栈,然后让子堆栈中的资源包含此参数(例如,在Fn::Sub 字符串中使用${ParentWaitHandle})作为预签名的URL 以发送“等待条件”使用 HTTP PUT 请求发送信号(例如,使用cURL,如Creating Wait Conditions in a Template 演练中使用的那样):

    curl -X PUT -H 'Content-Type:' --data-binary '{"Status": "SUCCESS", "Reason": "Configuration Complete","UniqueId": "$UNIQUE_ID", "Data": "Application has completed configuration."}' "${ParentWaitHandle}"

    1. 仅将WaitCondition 资源名称传递给子堆栈(通过Ref),并使用SignalResource CloudFormation 服务API 调用直接向WaitCondition 资源发出信号。这使您可以跳过处理单独的 WaitConditionHandle 资源,但需要向信令资源授予 cloudformation:SignalResource IAM 权限才能进行 API 调用。例如,使用 AWS CLI:

    aws cloudformation signal-resource \ --status SUCCESS \ --unique-id $(curl -s http://169.254.169.254/latest/meta-data/instance-id) \ --logical-resource-id ${ParentWaitCondition} \ --stack-name $PARENT_STACK \ --region ${AWS::Region} \ || true

    【讨论】:

    • 我需要做相反的事情,等待句柄在主堆栈中解析,但子堆栈中的资源取决于等待句柄的条件。我尝试将等待句柄作为参数传入,并从子堆栈中传入的句柄创建等待条件,但 AWS 给了我一个错误,说你不能等待来自不同堆栈的 WaitHandle Url。
    • 听起来您真正要解决的问题不是“如何将 CloudFormation 的 WaitHandle 传递给不同的 Cloud Formation 堆栈”,而是“如何让嵌套的堆栈资源依赖于资源在父堆栈中”,这确实是完全不同的。我相信我已经回答了上述问题,对于新问题,我建议您创建一个新的 SO 问题并更清楚地描述您的问题。
    • 很公平。我也会在 AWS 论坛上提问,看看是否能得到回复。虽然,我现在尝试在子堆栈中创建一个 WaitCondition ,并使用等待句柄 url 作为参数从另一个堆栈传入。这导致“无法等待指定的句柄 URL - 句柄必须来自同一个堆栈”。
    猜你喜欢
    • 1970-01-01
    • 2015-02-21
    • 2014-02-24
    • 2019-05-07
    • 2020-06-28
    • 1970-01-01
    • 2023-03-18
    • 2016-07-10
    • 1970-01-01
    相关资源
    最近更新 更多