AWS Systems Manager Parameter Store のパラメータを使用して、CloudFormation スタック間で値を共有する方法を教えてください。
最終更新日: 2021 年 5 月 11 日
別の AWS CloudFormation スタックで使用されているエクスポート変数を更新しようとすると、エラーメッセージが表示されます。エラーは、「別のスタックで使用されているため、エクスポート変数を更新できません」です。
簡単な説明
このエラーを解決するには、 AWS Systems Manager Parameter Store の SSM パラメータ を使用して、CloudFormation スタック間で値を共有します。SSM パラメータは、あるスタック (stackA) に、別のスタック (stackB) で使用できる値を保存します。
SSM パラメータを使用する場合、2 つの CloudFormation スタックの間に依存関係はありません。これは、変数が AWS Systems Manager Parameter Store に格納されているためです。
注: CloudFormation は、いくつかの SSM パラメータタイプをサポートしています。
解決方法
1. 次のテンプレートに基づいて 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. 次のテンプレートに基づいて、別の 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 アベイラビリティーゾーンで置き換えられ、起動されます。