テンプレートを作成する際に、別の AWS CloudFormation スタック内のリソースを参照したいと考えています。
簡単な説明
以下の解決方法はクロススタック参照を作成する方法の一例を示しています。その他の手順については、「Walkthrough: Refer to resource outputs in another AWS CloudFormation stack」(チュートリアル: 別の 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. コードエディタの [Parameters] (パラメータ) タブで、[Template] (テンプレート) を選択します。
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 のテンプレートでは、NetworkStack リソーススタックを NetworkStackParameter の値として使用します。NetworkStack の値は、対応する Fn::ImportValue 関数の正しいスタック名を置き換えます。
注: インポートとエクスポートのテンプレートの例については、「Fn::ImportValue」を参照してください。
5. スタックの作成アイコンを選択し、[Next] (次へ) を選択します。
6. [Stack name] (スタック名) にスタックの名前を入力します。
7. [Parameters] (パラメータ) には、相互参照するネットワークスタック名 (NetworkStack) を入力します。
8. [Next] (次へ) を選択し、もう一度 [Next] (次へ) を選択してから、[Create] (作成) を選択します。
9. スタックの作成が完了したら、 Amazon EC2 コンソールを開きます。
10. ナビゲーションペインで [Instances] (インスタンス) を選択し、手順 4 でテンプレートを使用して作成したインスタンスを選択します。
11. [Description] (説明) ビューを選択し、セキュリティグループとサブネットが設定されていることを確認します。
重要: 別のスタックがこれらの値をインポートしているときに、ソーススタックまたはソーススタックのエクスポート値を削除することはできません。ソーススタックのエクスポート値を更新するには、まず、ソーススタックのエクスポート値をインポートしているスタックの実際の値を手動で置き換えます。その後、ソーススタックのエクスポート値を更新します。
エクスポートされた出力値をインポートしているスタックを一覧表示するには、list-imports コマンドを実行します。AWS リージョンのエクスポートを一覧表示するには、 AWS CloudFormation コンソールを使用するか、list-exports コマンドを実行します。エクスポート名は、AWS リージョンごとのアカウントで一意である必要があります。
関連情報
AWS Systems Manager Parameter Store のパラメータを使用して CloudFormation スタック間で値を共有するにはどうすればよいですか?
AWS CloudFormation テンプレート
AWS::EC2::インスタンス