如何解决 AWS CloudFormation 中的“未找到名为 XYZ 的导出”错误?

上次更新时间:2020 年 6 月 12 日

我在堆栈中使用 Fn::ImportValue 时,在 AWS CloudFormation 中收到了“未找到名为 XYZ 的导出”错误。如何解决此错误?

简短描述

如果您在使用导入或导出值的 AWS CloudFormation 中创建堆栈引用,则必须执行以下操作:

  • 在您正在导出值的堆栈中,请在 AWS CloudFormation 模板的 Outputs 部分中使用 Export: 标记。
  • 在您希望引用导出的值的堆栈中,请使用 Fn::ImportValue

在以下场景中您会收到此错误:

  • 您正在嵌套堆栈中使用 Fn::ImportValue
  • 导出的值不在您正在将该值导入到的相同 AWS 区域或相同账户中。
  • 导出的值不是在其被堆栈导入之前创建或发布的。
  • 您在导入堆栈中使用了错误的导出名称。

根据您所遇到的场景,选择以下解决方法之一。

解决方法

您正在嵌套堆栈中使用 Fn::ImportValue

使用嵌套堆栈时,AWS CloudFormation 默认创建并行子堆栈。如果一个子堆栈正在导入来自其他子堆栈的输出,则堆栈创建可能会失败。如果 AWS 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::RefFn::GetAtt 来引用当前模板中的值。

导出的值不在您正在将该值导入到的相同 AWS 区域或相同账户中

跨堆栈引用仅在单个 AWS 账户和区域内适用。处在相同 AWS 账户和区域中的其他堆栈只能导入已导出的值。

要解决此问题,在使用 Fn::ImportValue 创建堆栈之前请完成验证导出和导入堆栈的堆栈配置部分中的步骤。

导出的值不是在其被堆栈导入之前创建或发布的

对于非嵌套堆栈,您必须部署正在导出值的堆栈。创建正在被导入的堆栈之前,堆栈应为 Create_CompleteUpdate_Complete 状态。

要解决此问题,在使用 Fn::ImportValue 创建堆栈之前请完成验证导出和导入堆栈的堆栈配置部分中的步骤。

您在导入堆栈中使用了错误的导出名称

1.    确认导出名称已在您的 AWS 账户中列出。

2.    当您将导出名称从一个堆栈导入到另一个堆栈时,请确认您在两个堆栈中使用的是完全相同的导出名称。

3.    在使用 Fn::ImportValue 创建堆栈之前,请完成验证导出和导入堆栈的堆栈配置部分中的步骤。

验证导出和导入堆栈的堆栈配置

您可以使用 AWS CloudFormation 控制台或 AWS 命令行界面 (AWS CLI) 验证导出值存在于相同的区域和账户中。

使用 AWS CloudFormation 控制台:

1.    打开 AWS 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"
        }
}

重要提示:当您在堆栈中使用导入和导出值时,请考虑以下事项:

  • 当堆栈导入了输出值后,您就无法删除导出该输出值的堆栈或修改已导出的输出值。您必须先删除所有导入,然后才能删除导出堆栈或修改输出值。
  • 导出名称在该区域内必须是唯一的。

这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助?