【问题标题】:Importing VPCGatewayAttachment from another template从另一个模板导入 VPCGatewayAttachment
【发布时间】:2017-04-20 11:49:18
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您是否将其导出到您尝试从中导入的堆栈中?

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


【解决方案1】:

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

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

【讨论】:

  • Depends On 接受一个字符串和一个字符串列表,所以这不是问题
【解决方案2】:

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

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

所以,你的模板应该是这样的:

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

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

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

【讨论】:

    【解决方案3】:

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

    注意

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

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

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

    【讨论】:

    • 它可能没有必要,但它不起作用的原因是 DependsOn 需要一个字符串,而不是某个函数;)
    • 是的,问题已经承认每个 DependsOn 值都必须是字符串。被问到的是“那么我怎样才能导入这个值?” (我的回答:你不需要,也从来没有必要,这就是原因)。
    猜你喜欢
    • 2023-03-28
    • 1970-01-01
    • 2021-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    • 2012-06-14
    相关资源
    最近更新 更多