如何使用 AWS Systems Manager Parameter Store 中的参数在 AWS CloudFormation 堆栈之间共享值?

上次更新时间:2020 年 1 月 10 日

在尝试更新另一个 AWS CloudFormation 堆栈中使用的导出变量时,我收到以下错误消息:“Cannot update an export variable as it is in use by another stack”。 如何解决此错误?

简短描述

要解决此错误,请使用 AWS Systems Manager Parameter Store 中的 SSM 参数在 AWS CloudFormation 堆栈之间共享值。 SSM 参数可在一个堆栈 (stackA) 中存储可由另一个堆栈 (stackB) 使用的值。

使用 SSM 参数时,两个 AWS CloudFormation 堆栈之间不存在依赖关系,因为相关变量存储在 AWS Systems Manager Parameter Store 中。

注意:AWS CloudFormation 支持多种 SSM 参数类型

解决方法

1.    根据以下模板创建 AWS CloudFormation 堆栈(例如 stackA):

{
  "AWSTemplateFormatVersion": "2010-09-09",

  "Parameters": {

    "AvailabilityZone": {
      "Description": "Amazon EC2 instance Availability Zone",
      "Type": "String"
    },

    "AMIId": {
      "Description": "The Amazon Machine Image id",
      "Type": "String"
    },

    "InstanceType": {
      "Description": "The Type of instance",
      "Type": "String"
    }
  },


  "Resources": {


    "myinstance": {
      "Type": "AWS::EC2::Instance",
      "Properties": {
        "AvailabilityZone": {
          "Fn::GetAtt": ["BasicParameter", "Value"]
        },
        "ImageId": { "Ref": "AMIId" },
        "InstanceType": { "Ref": "InstanceType" }
      }
    },

    "BasicParameter": {
      "Type": "AWS::SSM::Parameter",
      "Properties": {
        "Name": "AvailabilityZone",
        "Type": "String",
        "Value": {
          "Ref": "AvailabilityZone"
        }

      }
    }
  }
}

以上模板创建了一个实例和一个 SSM 参数。SSM 参数的值设置为所创建实例的可用区。现在,stackA 会创建一个 SSM 参数存储,将 Name 设置为 AvailabilityZoneValue 设置为 us-east-2a

注意:您必须为您的 SSM 参数使用唯一名称。

2.    根据以下模板创建另一个 AWS CloudFormation 堆栈(例如 stackB)。

{
  "AWSTemplateFormatVersion": "2010-09-09",
  
  "Parameters": {
    
"AMIId": {
  "Description": "The Amazon Machine Image id",
  "Type": "String"
},

"InstanceType": {
  "Description": "The Type of instance",
  "Type": "String"
}
    
    "AvailabilityZone": {
      "Description": "Amazon EC2 instance Availablity Zone",
      "Type": "AWS::SSM::Parameter::Value<String>",
      "Default": "AvailabilityZone"
    }

  },
  "Mappings": {

  },
  "Conditions": {

  },
  "Resources": {
    "myinstance": {
      "Type": "AWS::EC2::Instance",
      "Properties": {
        "AvailabilityZone": {
          "Ref": "AvailabilityZone"
        },
        "ImageId": { "Ref": "AMIId" },
        "InstanceType": { "Ref": "InstanceType" }
      }
    }
  }
}

以上模板使用由第 1 步中的 stackA 创建的 SSM 参数。

注意:要使用此参数,您必须在 stackB 中声明一个参数。将 Type 设置为 AWS::SSM::Parameter::Value<String>。然后,在 us-east-2a 可用区中启动通过 stackB 创建的实例。

3.    要更新 stackA,请将 AvailabilityZone 参数从 us-east-2a 更改为 us-east-2b

4.    在与 stackB 相同的更新可用区中,通过 stackA 启动实例。

此时,系统将替换实例并在 us-east-2b 可用区中启动实例。


这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助?