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

上次更新日期:2021 年 2 月 16 日

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

简短描述

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

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

  1. 找到正在导入已导出的输出值的堆栈。
  2. 对于导入已导出值的堆栈,请更新堆栈模板以将导入 语句替换为实际输出值。
  3. 使用修改后的模板更新正在导入值的堆栈。

解决方法

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

找到正在导入已导出的输出值的堆栈

要查看哪些堆栈在引用已导出的输出值,您可以使用 AWS CLI、AWS Tools for PowerShell 或 AWS CloudFormation 控制台。

AWS CLI:

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

aws cloudformation list-exports

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

aws cloudformation list-imports --export-name EXPORT_NAME

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

AWS Tools for PowerShell:

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.    更新删除您的堆栈。

既然导入已解除关联,您可以更新或删除导出值的堆栈。