AWS CloudFormation でテンプレートを作成する際に、別の AWS CloudFormation スタック内のリソースを参照したいと考えています。
解決手順
別の CloudFormation スタック内のリソースを参照するには、まずクロススタック参照を作成する必要があります。以下の解決手順は、クロススタック参照を作成する方法の一例を示しています。この NetworkStack スタックの例では、${AWS::StackName}-SecurityGroupID と ${AWS::StackName}-SubnetID ネットワーク関連リソースを作成してエクスポートしています。スタックを作成すると、CloudFormation が ${AWS::StackName} を NetworkStack に置き換えます。最終的なエクスポート名は NetworkStack-SecurityGroupID と NetworkStack-SubnetID になります。
出力値をエクスポートするスタックを作成する
次の手順を実行します。
- CloudFormation スタックを作成し、SampleNetworkCrossStack テンプレートを使用します。
注: テンプレートの Outputs セクション で Export フィールドを宣言する必要があります。
- スタックに NetworkStack という名前を付けます。
注: NetworkStack はサブネットとセキュリティグループの値をエクスポートします。
インポートしたサブネットとセキュリティグループを使用して Amazon EC2 インスタンスを作成する
SubetIdAmazon Elastic Compute Cloud (Amazon EC2) インスタンスのプロパティ ( や SecurityGroupId など) は、エクスポートを行うスタックの値を使用します。値をインポートするには、Fn::ImportValue 組み込み関数を使用します。
注: インポートを行うスタックと、エクスポートを行うスタックは、同じ AWS リージョンおよび AWS アカウントで管理する必要があります。また、エクスポートされる値の名前は、お使いのリージョンとアカウントで一意である必要があります。
EC2 インスタンスを作成するには、次の手順を実行します。
- CloudFormation コンソールを開きます。
- [スタックの作成] を選択し、[テンプレートのデザイン] を選択します。
- コードエディタの [パラメータ] タブを選択し、[テンプレート] を選択します。
- エクスポートを行うスタックの値を使用してインスタンスを作成するには、コードエディタに次のテンプレートを入力します。
重要: NetworkStack リソーススタックを NetworkStackParameter の値として設定します。値 NetworkStack は、対応する Fn::ImportValue 関数の当該のスタック名に取って代わります。
{ "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"
}
}
}
]
}
}
}
}
注: t2.micro をお使いのインスタンスタイプに、ami-a1b23456 を Amazon マシンイメージ (AMI) ID に置き換えてください。
- [スタックの作成] (上矢印の付いたクラウドアイコン) を選択し、[次へ] を選択します。
- [スタック名] にスタックの名前を入力します。
- [パラメータ] には、クロス参照するネットワークスタック名 (例: NetworkStack) を入力します。
- [次へ] を選択し、もう一度 [次へ] を選択します。
- [作成] を選択します。
- スタックのステータスが CREATE_COMPLETE に変わったら、Amazon EC2 コンソールを開きます。
- ナビゲーションペインで [インスタンス] を選択し、次いで、作成したインスタンスを選択します。
- [説明] タブを選択し、セキュリティグループとサブネットが設定されていることを確認します。
重要: 別のスタックがソーススタック、またはソーススタックのエクスポート値をインポートしているときに、それらの値を削除することはできません。ソーススタックのエクスポート値を更新するには、まず、ソーススタックのエクスポート値をインポートしているスタックの値を手動で置き換えます。その後、ソーススタックのエクスポート値を更新します。
エクスポートされた出力値をインポートしているスタックを一覧表示するには、list-imports コマンドを実行します。リージョンのエクスポートを一覧表示するには、 CloudFormation コンソールを使用するか、list-exports コマンドを実行します。エクスポート名は、リージョンのアカウントで一意である必要があります。
**注:**AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI エラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
関連情報
AWS Systems Manager Parameter Store のパラメータを使用して CloudFormation スタック間で値を共有するにはどうすればよいですか?
AWS CloudFormation テンプレート
AWS::EC2::Instance
別の CloudFormation スタックのリソース出力を参照する