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] が AvailabilityZone 、 Value が us-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 アベイラビリティーゾーンで置き換えられ、起動されます。