AWS Systems Manager パラメータストアのパラメータを使用して、AWS CloudFormation スタック間で値を共有するには、どうすればよいですか?

最終更新日: 2020 年 1 月 10 日

別の AWS CloudFormation スタックで使用されているエクスポート変数を更新しようとすると、「Cannot update an export variable is in use by another stack」というエラーメッセージが表示されます。 このエラーの解決するには、どうすればよいですか?

簡単な説明

このエラーを解決するには、 AWS Systems Manager パラメータストアSSM パラメータ を使用して、AWS CloudFormation スタック間で値を共有します。 SSM パラメータは、別のスタック (stackB) で使用できる値を 1 つのスタック (stackA)に保存します。

SSM パラメータを使用する場合、変数は AWS Systems Manager パラメータストアに保存されるため、2 つの AWS CloudFormation スタック間に依存関係はありません。

注: 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 は、 [Name]AvailabilityZoneValueus-east-2a に設定された SSM パラメータストアを作成します。

注: 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> に設定します。stackB から作成されたインスタンスは、us-east-2a アベイラビリティーゾーンで起動されます。

3.    stackA を更新するには、 AvailabilityZone パラメータを us-east-2a から us-east-2bに変更します。

4.    stackB と同じ更新されたアベイラビリティーゾーンの stackA からインスタンスを起動します。

これで、インスタンスは us-east-2b アベイラビリティーゾーンで置き換えられ、起動されます。


この記事はお役に立ちましたか?

改善できることはありますか?


さらにサポートが必要な場合