如何解决 AWS CloudFormation 中的“未找到名为 XYZ 的导出”错误?
上次更新时间:2020 年 6 月 12 日
我在堆栈中使用 Fn::ImportValue 时,在 AWS CloudFormation 中收到了“未找到名为 XYZ 的导出”错误。
简短描述
如果您在使用导入或导出值的 CloudFormation 中创建堆栈引用,则必须执行以下操作:
- 在您正在导出值的堆栈中,在 CloudFormation 模板的 Outputs 部分中使用 Export: 标记。
- 在您希望引用导出的值的堆栈中,使用 Fn::ImportValue。
在以下场景中您会收到此错误:
- 您正在嵌套堆栈中使用 Fn::ImportValue。
- 导出的值不在您正在将该值导入到的相同 AWS 区域或相同账户中。
- 导出的值不是在其被堆栈导入之前创建或发布的。
- 您在导入堆栈中使用了错误的导出名称。
根据您所遇到的场景,选择以下解决方法之一。
解决方法
您正在嵌套堆栈中使用 Fn::ImportValue
使用嵌套堆栈时,CloudFormation 会默认创建并行子堆栈。如果一个子堆栈正在导入来自其他子堆栈的输出,则堆栈创建可能会失败。如果 CloudFormation 创建子并行堆栈,则导出的值存在可能无法及时获得以供其他子堆栈导入的风险。
要解决此错误,请使用 DependsOn 属性为在堆栈上使用 Fn::ImportValue 的堆栈创建与导出的输出之间的明确依赖项。
例如,请参阅下面的嵌套堆栈。ChildStack01 导出 Outputs 部分中的值,ChildStack02 使用 Fn::ImportValue 导入来自 ChildStack01 的值。您可以根据以下示例将 DependsOn 用于 ChildStack02:
{ "AWSTemplateFormatVersion": "2010-09-09",
"Resources": {
"ChildStack01": {
"Type": "AWS::CloudFormation::Stack",
"Properties": {
"TemplateURL": "https://s3.amazonaws.com/cloudformation-templates-us-east-1/VPC.template",
"TimeoutInMinutes": "60"
}
},
"ChildStack02": {
"Type": "AWS::CloudFormation::Stack",
"DependsOn": "ChildStack01",
"Properties": {
"TemplateURL": "https://s3.amazonaws.com/cloudformation-templates-us-east-1/Subnet.template",
"TimeoutInMinutes": "60"
}
}
}
}
提示:对于跨堆栈引用,请使用 Fn::ImportValue 导入来自其他模板的值。对于嵌套堆栈,请使用 Fn::Ref 和 Fn::GetAtt 来引用当前模板中的值。
导出的值不在您正在将该值导入到的相同 AWS 区域或相同账户中
跨堆栈引用仅在单个 AWS 账户和区域内适用。处在相同 AWS 账户和区域中的其他堆栈只能导入已导出的值。
要解决此问题,在使用 Fn::ImportValue 创建堆栈之前请完成验证导出和导入堆栈的堆栈配置部分中的步骤。
导出的值不是在其被堆栈导入之前创建或发布的
对于非嵌套堆栈,您必须部署正在导出值的堆栈。创建正在被导入的堆栈之前,堆栈应为 Create_Complete 或 Update_Complete 状态。
要解决此问题,在使用 Fn::ImportValue 创建堆栈之前请完成验证导出和导入堆栈的堆栈配置部分中的步骤。
您在导入堆栈中使用了错误的导出名称
1. 确认导出名称已在您的 AWS 账户中列出。
2. 当您将导出名称从一个堆栈导入到另一个堆栈时,请确认您在两个堆栈中使用的是完全相同的导出名称。
3. 在使用 Fn::ImportValue 创建堆栈之前,请完成验证导出和导入堆栈的堆栈配置部分中的步骤。
验证导出和导入堆栈的堆栈配置
注意:如果您在运行 AWS Command Line Interface (AWS CLI) 命令时收到错误,请确保您运行的是最新版本的 AWS CLI。
您可以使用CloudFormation 控制台或 AWS CLI 验证导出值存在于相同的区域和账户中。
使用 CloudFormation 控制台:
1. 打开 CloudFormation 控制台。
2. 在导航窗格中,选择导出。
3. 确认导出值已在控制台中列出。
使用 AWS CLI:
1. 要列出可用的导出,请运行以下命令:
aws cloudformation list-exports --region us-east-1
注意:请将 us-east-1 替换为您的区域。
2. 在输出中,验证导入和导出堆栈的 Name 属性完全相同。输出与以下内容类似:
{
"Exports": [
{
"ExportingStackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/private-vpc/99764070-b56c-xmpl-bee8-062a88d1d800",
"Name": "private-vpc-subnet-a",
"Value": "subnet-01a234bcdefghij56"
}
}
重要提示:在堆栈中使用导入和导出值时,请考虑以下几点:一旦堆栈导入了输出值,您就无法删除导出该输出值的堆栈或修改已导出的输出值。您必须先删除所有导入,然后才能删除导出堆栈或修改输出值。导出名称在该区域内必须是唯一的。