How do I use parameters in AWS Systems Manager Parameter Store to share values between AWS CloudFormation stacks?

Last updated: 2020-01-10

When I try to update an export variable that’s used in another AWS CloudFormation stack, I receive the following error message: "Cannot update an export variable as it is in use by another stack." How can I resolve this error?

Short Description

To resolve this error, use SSM parameters in AWS Systems Manager Parameter Store to share values between AWS CloudFormation stacks. An SSM parameter stores a value in one stack (stackA) that can be used by another stack (stackB).

When you use an SSM parameter, there isn't a dependency between the two AWS CloudFormation stacks, because the variable is stored in the AWS Systems Manager Parameter Store.

Note: AWS CloudFormation supports several SSM parameter types.

Resolution

1.    Create an AWS CloudFormation stack (for example, stackA) based on the following template:

{
  "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"
        }

      }
    }
  }
}

The preceding template creates an instance and an SSM parameter. The value of the SSM parameter is set to the Availability Zone of the instance that's created. Now, stackA creates an SSM parameter store with Name set to AvailabilityZone and Value set to us-east-2a.

Note: You must use a unique name for your SSM parameter.

2.    Create another AWS CloudFormation stack (for example, stackB) based on the following template.

{
  "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" }
      }
    }
  }
}

The preceding template uses the SSM parameter that was created by stackA from step 1.

Note: To use this parameter, you must declare a parameter in stackB. Set Type to AWS::SSM::Parameter::Value<String>. The instance created from stackB is then launched in the us-east-2a Availability Zone.

3.    To update stackA, change the AvailabilityZone parameter from us-east-2a to us-east-2b.

4.    Launch the instance from stackA in the same updated Availability Zone as stackB.

Now, the instance is replaced and launched in the us-east-2b Availability Zone.


Did this article help you?

Anything we could improve?


Need more help?