1

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

我有一个应用程序堆栈,其中有一个 EIP,它应该取决于当前看起来像这样的 VPCGatewayAttachment:

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

但是我得到一个模板错误,它说每个 DependsOn 值都必须是一个字符串。那么如何导入这个值呢?

4

3 回答 3

0

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

笔记

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

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

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

于 2017-01-06T20:45:41.733 回答
-1

正如文档所说(并且您已经阅读),该DependsOn属性接受一个字符串(或字符串列表)。

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

因此,您的模板应如下所示:

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

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

如果您再看一下官方文档中的示例,您会发现所有示例中都是这样做的。

于 2016-12-21T11:45:18.403 回答
-2

您的导入语句周围有括号。在JSON中,这意味着对象将是一个数组而不是字符串。删除这些括号,您将克服此错误。

"MyEIP": {
  "Type": "AWS::EC2::EIP",
  "DependsOn": { "Fn::ImportValue": { "Fn::Sub": "${NetworkStackName}-GatewayAttachment" } }
}
于 2016-12-06T11:29:42.550 回答