从另一个模板导入VPCGatewayAttachment

时间:2016-12-05 23:23:57

标签: amazon-web-services amazon-cloudformation elastic-ip

我有一个包含InternetGateway的网络堆栈,它通过VPCGatewayAttachment元素附加到VPC。

我有一个应用程序堆栈,我有一个EIP,它应该依赖于VPCGatewayAttachment,目前看起来像这样:

"MyEIP": {
  "Type": "AWS::EC2::EIP",
  "DependsOn": [
    { "Fn::ImportValue" : {"Fn::Sub": "${NetworkStackName}-GatewayAttachment" } }
  ],
}

但是我收到一个模板错误,指出每个DependsOn值都必须是一个字符串。那么我该如何导入这个值?

3 个答案:

答案 0 :(得分:0)

您不需要在应用程序堆栈中的DependsOn资源上使用AWS::EC2::EIP属性,因为AWS::EC2::VPCGatewayAttachment资源是在单独的网络堆栈中创建的。这在EIP资源的Domain属性中注明:

  

请注意

     

如果您定义弹性IP地址并将其与在同一模板中定义的VPC 相关联,则必须使用DependsOn声明对VPC网关附件的依赖关系此资源的属性。

当在单独的模板中定义VPC时,您不需要显式声明任何依赖项。只要应用程序堆栈在网络堆栈之前被删除,EIP就会在VPC网关附件之前被删除。

更一般地说,在堆栈之间声明DependsOn是不必要的。由于如果另一个堆栈引用其输出之一,则无法删除堆栈,使用Fn::ImportValue创建交叉堆栈引用会创建一个依赖项,在引用堆栈之前必须删除包含该引用的堆栈。

答案 1 :(得分:-1)

正如文档所说(并且您已阅读),DependsOn属性接受String(或String列表)。

这意味着字面意思,因为您不打算使用CloudFormation FnRef函数在那里插入一些值,而只是插入名称CloudFormation资源,就像您在模板中使用它一样。

因此,您的模板应该是这样的:

"MyEIP": {
  "Type": "AWS::EC2::EIP",
  "DependsOn": [
    "MyGatewayAttachment"
  ],
}

,其中MyGatewayAttachment是模板中相应CloudFormation资源的名称

如果您再看一下官方文档中的examples,您会发现这就是在所有示例中完成的方式。

答案 2 :(得分:-2)

您的import语句旁边有括号。其中JSON表示该对象将是一个数组而不是一个字符串。删除这些括号,您将通过此错误。

"MyEIP": {
  "Type": "AWS::EC2::EIP",
  "DependsOn": { "Fn::ImportValue": { "Fn::Sub": "${NetworkStackName}-GatewayAttachment" } }
}
相关问题