我有一个包含InternetGateway的网络堆栈,它通过VPCGatewayAttachment元素附加到VPC。
我有一个应用程序堆栈,我有一个EIP,它应该依赖于VPCGatewayAttachment,目前看起来像这样:
"MyEIP": {
"Type": "AWS::EC2::EIP",
"DependsOn": [
{ "Fn::ImportValue" : {"Fn::Sub": "${NetworkStackName}-GatewayAttachment" } }
],
}
但是我收到一个模板错误,指出每个DependsOn值都必须是一个字符串。那么我该如何导入这个值?
答案 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 Fn
或Ref
函数在那里插入一些值,而只是插入名称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" } }
}