我在堆栈中使用 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::Ref 和 Fn::GetAtt 来引用当前模板中的值。
导出的值不在您正在将该值导入到的相同 AWS 区域或相同 AWS 账户中
跨堆栈引用仅在单个账户和区域内适用。处在相同账户和区域中的其他堆栈只能导入已导出的值。
要解决此问题,在使用 Fn::ImportValue 创建堆栈之前请完成验证导出和导入堆栈的堆栈配置部分中的步骤。
导出的值在堆栈导入之前不会创建或发布
对于非嵌套堆栈,您必须部署正在导出值的堆栈。创建正在被导入的堆栈之前,堆栈必须为 Create_Complete 或 Update_Complete 状态。
要解决此问题,在使用 Fn::ImportValue 创建堆栈之前请完成验证导出和导入堆栈的堆栈配置部分中的步骤。
您在导入堆栈中使用了错误的导出名称
- 确认导出名称已在您的账户中列出。
- 当您将导出名称从一个堆栈导入到另一个堆栈时,请确认您在两个堆栈中使用的是完全相同的导出名称。
- 在使用 Fn::ImportValue 创建堆栈之前,请完成验证导出和导入堆栈的堆栈配置部分中的步骤。
验证导出和导入堆栈的堆栈配置
您可以使用CloudFormation 控制台或 AWS CLI 验证导出值存在于相同的区域和账户中。
使用 CloudFormation 控制台:
- 打开 CloudFormation 控制台。
- 在导航窗格中,选择导出。
- 确认导出值已在控制台中列出。
使用 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 堆栈之间共享值。