如何解决 AWS CloudFormation 中的错误“Export EXPORT_NAME cannot be updated as it is in use by STACK_NAME(导出 EXPORT_NAME 正被 STACK_NAME 占用,无法更新)”?

2 分钟阅读
0

我尝试更新或删除我的 AWS CloudFormation 堆栈,但收到类似以下内容的错误消息:“Export EXPORT_NAME cannot be updated as it is in use by STACK_NAME(导出 EXPORT_NAME 正被 STACK_NAME 占用,无法更新)”。

简短描述

当一个或多个堆栈正在从您要更新或删除的堆栈中导入已导出的输出值时,您会遇到此错误。其他堆栈从您的堆栈中导入值时,您将无法更新或删除堆栈。

如要解决此错误,请执行如下步骤:

  1. 找到正在导入已导出的输出值的堆栈。
  2. 对于您标识为正在导入已导出值的堆栈,请更新堆栈模板以将 Import语句替换为实际输出值。
  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.    更新删除您的堆栈。

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


相关信息

列出导入已导出的输出值的堆栈

list-exports

list-imports

Get-CFNExport Cmdlet

Get-CFNImportList Cmdlet

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