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

2 分钟阅读
0

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

简短描述

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

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

在以下情况下,您可能会收到“未找到名为 XYX 的导出”错误:

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

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

解决方法

**注意:**如果您在运行 AWS 命令行界面(AWS CLI)命令时遇到错误,请确保您使用的是最新版本的 AWS CLI

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

默认情况下,CloudFormation 与嵌套堆栈并行创建子堆栈。如果子堆栈相互并行创建,并且一个堆栈正在从另一个堆栈导入输出,则堆栈创建可能会失败。导出值存在无法及时被其他子堆栈导入的风险。

要解决此问题,请使用 DependsOn 属性为使用 Fn::ImportValue 的堆栈创建显式依赖关系。然后,使用 Fn:ImportValue 的子堆栈只能在导出该值的子堆栈之后创建。

在下面的嵌套堆栈示例中,ChildStack01 导出 Outputs 部分中的值,ChildStack02 使用 Fn::ImportValue 导入来自 ChildStack01 的值。您可以根据以下示例 YAML 模板将 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 账户中

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

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

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

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

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

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

  1. 确认导出名称已在您的账户中列出。
  2. 当您将导出名称从一个堆栈导入到另一个堆栈时,请确认您在两个堆栈中使用的是完全相同的导出名称。
  3. 在使用 Fn::ImportValue 创建堆栈之前,请完成验证导出和导入堆栈的堆栈配置部分中的步骤。

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

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

使用 CloudFormation 控制台:

  1. 打开 CloudFormation 控制台
  2. 在导航窗格中,选择导出
  3. 确认导出值已在控制台中列出。

使用 AWS CLI:

1.    要列出可用的导出,请运行以下命令:

aws cloudformation list-exports --region us-east-1

**注意:**请将 us-east-1 替换为您的区域。

2.    在输出中,验证导入和导出堆栈的 Name 属性完全相同。输出与以下类似:

aws cloudformation list-exports --region us-east-1 --output yaml
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

**重要提示:**在堆栈中使用导入和导出值时,请考虑以下事项:在堆栈导入输出值后,您无法删除正在导出输出值的堆栈或修改导出的输出值。您必须先删除所有导入,然后才能删除导出堆栈或修改输出值。导出名称在该区域内必须是唯一的。作为一种解决方法,您可以使用 AWS Systems Manager Parameter Store 中的参数在 CloudFormation 堆栈之间共享值


相关视频

AWS 官方
AWS 官方已更新 1 年前