テンプレート作成時に、別の AWS CloudFormation スタック内にあるリソースを参照する方法を教えてください。
簡単な説明
次の解決方法で、クロススタックリファレンスを作成する方法の例を示します。その他の手順については、「チュートリアル: 別の AWS CloudFormation スタックのリソース出力を参照する」をご覧ください。
注: 別の AWS CloudFormation スタック内のリソースを参照するには、最初にクロススタックリファレンスを作成する必要があります。クロススタックリファレンスを作成するには、エクスポートフィールドを使用してリソース出力の値にエクスポート用のフラグを立てます。次に、Fn::ImportValue 組み込み関数を使用して、同じ AWS リージョンおよびアカウント内の任意のスタックに値をインポートします。AWS CloudFormation は、テンプレートで指定された名前でエクスポートされた値を識別します。これらの名前はお客様の AWS リージョンやアカウントに固有のものでなければなりません。
解決方法
次の手順は、NetworkStack という名前の AWS CloudFormation スタックを作成する方法を示しています。このスタックは、ネットワーク関連のリソースを作成し、${AWS::StackName}-SecurityGroupID と ${AWS::StackName}-SubnetID という名前のエクスポートを行います。スタック作成後、${AWS::StackName} は NetworkStack に置き換えられます。最終エクスポート名は NetworkStack-SecurityGroupID と NetworkStack-SubnetID です。
出力値をエクスポートするためのスタックを作成します
1. この テンプレートを使用して AWS CloudFormation スタックを作成します。
2. スタックに NetworkStack という名前を付けます。
注: NetworkStack は、サブネットとセキュリティグループの値をエクスポートします。
インポートされたサブネットとセキュリティグループを使用して Amazon Elastic Compute Cloud (Amazon EC2) インスタンスを作成する
1. AWS CloudFormation コンソールを開きます。
2. [Create Stack] (スタックの作成) を選択してから、[Design template] (デザインテンプレート) をクリックします。
3. コードエディタの [パラメータ] タブで、[テンプレート] を選択します。
4. 次のテンプレートをコピーしてコードエディタに貼り付け、InstanceType と ImageId の適切な値でテンプレートを更新します。
{
"Parameters": {
"NetworkStackParameter": {
"Type": "String"
}
},
"Resources": {
"WebServerInstance": {
"Type": "AWS::EC2::Instance",
"Properties": {
"InstanceType": "t2.micro",
"ImageId": "ami-a1b23456",
"NetworkInterfaces": [
{
"GroupSet": [
{
"Fn::ImportValue": {
"Fn::Sub": "${NetworkStackParameter}-SecurityGroupID"
}
}
],
"AssociatePublicIpAddress": "true",
"DeviceIndex": "0",
"DeleteOnTermination": "true",
"SubnetId": {
"Fn::ImportValue": {
"Fn::Sub": "${NetworkStackParameter}-SubnetID"
}
}
}
]
}
}
}
}
重要: 手順 4 のテンプレートで、NetworkStackParameter の値として NetworkStack リソーススタックを使用してください。NetworkStack の値は、対応する Fn::ImportValue 関数の正しいスタック名を置き換えます。
注: インポートおよびエクスポートのテンプレートの例については、Fn::ImportValue を参照してください。
5. [スタックの作成] アイコンを選択してから、[次へ] を選択します。
6. [スタック名] には、スタックの名前を入力します。
7. [Parameters] (パラメータ) には、相互参照するネットワークスタック名 (NetworkStack) を入力します。
8. [次へ] を選択し、もう一度 [次へ] を選択してから、[作成] をクリックします。
9. スタックの作成が完了したら、[Amazon EC2 コンソール] を開きます。
10. ナビゲーションペインで、[インスタンス] を選択し、手順 4 でテンプレートを使用して作成したインスタンスを選択します。
11. [説明] ビューを選択し、セキュリティグループとサブネットが設定されていることを確認します。
重要: 別のスタックがソーススタックまたはソーススタックのエクスポート値をインポートしている間は、これらの値を削除できません。ソーススタックのエクスポート値を更新するには、まず、ソーススタックのエクスポート値をインポートしているスタック内の実際の値を手動で置き換えます。その後で、ソーススタックのエクスポート値を更新できます。
エクスポートされた出力値をインポートしているすべてのスタックをリストするには、list-imports コマンドを実行します。AWS リージョン内のすべてのエクスポートを一覧表示するには、AWS CloudFormation コンソールを使用するか、list-exports コマンドを実行します。エクスポート名は、AWS リージョンごとのアカウントに対して一意である必要があります。
関連情報
AWS Systems Manager Parameter Store のパラメータを使用して、CloudFormation スタック間で値を共有する方法を教えてください。
AWS CloudFormation テンプレート
AWS::EC2::Instance