Cloudformation等待同一堆栈中的另一个资源创建

时间:2020-06-09 00:05:43

标签: amazon-web-services amazon-cloudformation

我正在创建一个AppSync cloudformation和一个仪表板,并且我注意到ApiId导出已在很长时间之后完成创建。

我在appsync文件中创建输出,如下所示:

    Outputs:
      GraphQlApiIdOutput:
        Description: Main GraphQl Api ID.
        Value:
          Fn::GetAtt:
            - GraphQlApi
            - ApiId
        Export:
          Name: GraphQlApiIdOutput

在另一个仪表板文件中:

CloudwatchDashboard:
    Type: AWS::CloudWatch::Dashboard
    Properties:
    DashboardBody:
        {
          'Fn::Sub': ['{
            ...
            ,{ 
                ApiId: 
                  !ImportValue GraphQlApiIdOutput}]

但是,我得到了错误:No export named GraphQlApiIdOutput found. Rollback requested by user. 解决此问题的唯一方法是先删除导入值,以使堆栈创建成功,然后添加导入值。我注意到有一个等待条件,但是没有任何资源是外部的。我还注意到,仅AWS::AutoScaling::AutoScalingGroup, AWS::EC2::Instance, and AWS::CloudFormation::WaitCondition支持创建策略。 有没有一种方法可以等待在Cloudformation中创建资源,以使模板在同一堆栈中创建输出模板之前不尝试使用输出值?

2 个答案:

答案 0 :(得分:2)

是的,请使用DependsOn Attribute

使用PluginExtensions.kt属性,您可以指定在创建另一个特定资源之后。当您向资源添加DependsOn属性时,仅在创建DependsOn属性中指定的资源之后才创建该资源。

该属性指向同一堆栈中的另一个资源。如果资源A为DependsOn资源B,则只有在资源B完成创建后才创建资源A。

答案 1 :(得分:1)

当您的代码中包含此代码时:

!ImportValue GraphQlApiIdOutput

这意味着必须预先创建来自Template 1 的堆栈

因此通常情况下,您需要执行以下操作:

  1. 部署Template 1
  2. 成功完成后,您就可以部署another template file

DependsOn用于同一堆栈中的资源,不适用于不同堆栈WaitCondition同样适用,因为在成功创建another template file堆栈之前,您将无法从Template 1引用Template 1中的条件。