別の 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 は、[名前] を [AvailabilityZone]、[値] を [us-east-2a] に設定して SSM Parameter Store を作成します。
注: 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"
}
}
}
}
}
このテンプレートは、stackA がステップ 1 で作成した SSM パラメータを使用します。
注: このパラメータを使用するには、stackB でパラメータを宣言する必要があります。タイプを AWS::SSM::Parameter::Value<String> に設定します。stackB から作成されたインスタンスは us-east-2a アベイラビリティーゾーンで起動されます。
3. stackA を更新するには、AvailabilityZone パラメータを us-east-2a から us-east-2b に変更します。
4. stackB と同じ更新されたアベイラビリティーゾーンにある stackA からインスタンスを起動します。インスタンスは置き換えられ、us-east-2b アベイラビリティーゾーンで起動されます。