如何解决错误“导出 EXPORT_NAME 正被 STACK_NAME 占用,无法更新”?

上次更新时间:2019 年 5 月 16 日

我尝试更新或删除我的 AWS CloudFormation 堆栈,但收到类似以下内容的错误消息:“导出 EXPORT_NAME 正被 STACK_NAME 占用,无法更新”。 如何解决此错误?

简短描述

您收到此错误是因为一个或多个堆栈正在从您要更新或删除的堆栈中导入已导出的输出值。如果其他堆栈从您的堆栈中导入值,您将无法更新或删除堆栈。

要解决该错误,请完成以下步骤:

  1. 找出从您的堆栈中引用已导出输出值的堆栈。
  2. 更新所有堆栈模板中的导入值,这些模板从您的堆栈中引用已导出的输出值。然后,更新或删除引用了已导入值的堆栈。

解决方法

找出从您的堆栈中引用已导出输出值的堆栈

要查看哪些堆栈在引用已导出的输出值,您可以使用 AWS 命令行界面 (AWS CLI)适用于 PowerShell 的 AWS 工具或 AWS CloudFormation 控制台。

AWS CLI:

1.    要列出所有已导出的输出值,请运行以下命令:

aws cloudformation list-exports

2.    要列出导入已导出输出值的所有堆栈,请运行以下命令:

aws cloudformation list-imports --export-name EXPORT_NAME

注意:EXPORT_NAME 替换为已导出输出值的名称。

适用于 PowerShell 的 AWS 工具:

1.    要列出所有已导出的输出值,请运行以下命令:

Get-CFNExport

2.    要列出导入已导出输出值的所有堆栈,请运行以下命令:

Get-CFNImportList -ExportName EXPORT_NAME

注意:EXPORT_NAME 替换为已导出输出值的名称。

AWS CloudFormation 控制台:

1.    打开 AWS CloudFormation 控制台

2.    从 CloudFormation 菜单中,选择导出

3.    对于导出名称,从您的堆栈中选择已导出的输出值的名称。

4.    对于导入,从您的堆栈中选择导入已导出输出值的堆栈。

更新所有堆栈模板中的导入值,这些模板从您的堆栈中引用已导出的输出值

1.    在您的 AWS CloudFormation 模板中,将引用您的堆栈的已导出输出值的每个堆栈的内部函数替换为已导入的值。

例如,在以下 JSON 和 YAML 模板中,将内部函数 Fn::ImportValue!ImportValue 替换为已导入的值 arn:aws:s3:::sample

使用内部函数的 JSON 模板:

{
    "Parameters": {
       "parameterName": {
          "Type": "String"
       }
    },
    "Resources": {
       "testParameter": {
          "Type": "AWS::SSM::Parameter",
          "Properties": {
             "Description": "Test SSM Parameter",
             "Name": { "Ref": "parameterName" },
             "Type": "String",
             "Value": { "Fn::ImportValue": "sample-s3-bucket:Bucket-arn" }
          }
       }
    }
 }

使用已导入值的 JSON 模板:

{
    "Parameters": {
       "parameterName": {
          "Type": "String"
       }
    },
    "Resources": {
       "testParameter": {
          "Type": "AWS::SSM::Parameter",
          "Properties": {
             "Description": "Test SSM Parameter",
             "Name": { "Ref": "parameterName" },
             "Type": "String",
             "Value": "arn:aws:s3:::sample"
          }
       }
    }
 }

使用内部函数的 YAML 模板:

Parameters:
  parameterName:
    Type: String
Resources:
  testParameter:
    Type: AWS::SSM::Parameter
    Properties:
      Description: Test SSM Parameter
      Name: !Ref parameterName
      Type: String
      Value: !ImportValue sample-s3-bucket:Bucket-arn

使用已导入值的 YAML 模板:

Parameters:
  parameterName:
    Type: String
Resources:
  testParameter:
    Type: AWS::SSM::Parameter
    Properties:
      Description: Test SSM Parameter
      Name: !Ref parameterName
      Type: String
      Value: arn:aws:s3:::sample

2.    更新删除您的堆栈。


这篇文章对您有帮助吗?

您觉得我们哪些地方需要改进?


需要更多帮助?