Amazon web services 从其他模板导入VPCGatewayAttachment
我有一个包含InternetGateway的网络堆栈,它通过VPCGatewayAttachment元素连接到VPC 我有一个应用程序堆栈,其中我有一个EIP,它应该取决于VPCGatewayAttachment,目前看起来如下:Amazon web services 从其他模板导入VPCGatewayAttachment,amazon-web-services,amazon-cloudformation,elastic-ip,Amazon Web Services,Amazon Cloudformation,Elastic Ip,我有一个包含InternetGateway的网络堆栈,它通过VPCGatewayAttachment元素连接到VPC 我有一个应用程序堆栈,其中我有一个EIP,它应该取决于VPCGatewayAttachment,目前看起来如下: "MyEIP": { "Type": "AWS::EC2::EIP", "DependsOn": [ { "Fn::ImportValue" : {"Fn::Sub": "${NetworkStackName}-GatewayAttachment" }
"MyEIP": {
"Type": "AWS::EC2::EIP",
"DependsOn": [
{ "Fn::ImportValue" : {"Fn::Sub": "${NetworkStackName}-GatewayAttachment" } }
],
}
然而,我得到一个模板错误,它说每个DependsOn值必须是一个字符串。那么如何导入该值呢?您的导入语句周围有括号。这意味着该对象将是数组而不是字符串。删除这些括号,您将克服此错误
"MyEIP": {
"Type": "AWS::EC2::EIP",
"DependsOn": { "Fn::ImportValue": { "Fn::Sub": "${NetworkStackName}-GatewayAttachment" } }
}
正如文档所说,您已经阅读过的,DependsOn属性接受字符串或字符串列表 这是字面上的意思,也就是说,您不需要使用CloudFormation Fn或Ref函数在那里插入一些值,而只需插入CloudFormation资源的名称,就像您在模板中所做的那样 因此,您的模板应该如下所示:
"MyEIP": {
"Type": "AWS::EC2::EIP",
"DependsOn": [
"MyGatewayAttachment"
],
}
,其中MyGatewayAttachment是模板中相应的CloudFormation资源的名称
如果您再看一看官方文档中的,您会发现在所有示例中都是这样做的。您不需要在应用程序堆栈中的资源上使用属性,因为资源是在单独的网络堆栈中创建的。这在EIP资源的属性中有所说明:
注
如果定义弹性IP地址并将其与同一模板中定义的VPC关联,则必须使用此资源上的DependsOn属性声明对VPC网关附件的依赖关系
当VPC在单独的模板中定义时,不需要显式声明任何依赖项。只要在网络堆栈之前删除应用程序堆栈,EIP将在VPC网关连接之前删除
更一般地说,在堆栈之间声明DependsOn是不必要的。由于如果另一个堆栈引用其输出之一,则无法删除堆栈,因此使用Fn::ImportValue创建跨堆栈引用会创建一个依赖项,即包含引用的堆栈必须在引用堆栈之前删除。取决于接受字符串和字符串列表,因此,这不是您在尝试从中导入的堆栈中导出它的问题吗?这可能不是必需的,但这不起作用的原因是DependsOn需要一个字符串,而不是一些函数;是的,问题已经确认每个DependsOn值都必须是字符串。问题是如何导入此值?我的回答是:你不需要,也没有必要,原因如下。