デプロイされた CloudFormation スタックからエクスポートされた出力を取得する - AWS CloudFormation

デプロイされた CloudFormation スタックからエクスポートされた出力を取得する

同じ AWS アカウントおよびリージョン内に複数のスタックがあるときは、スタック間での情報の共有が役に立つ場合があります。これは、あるスタックが別のスタックによって作成されたリソースを使用する必要があるときに便利です。

例えば、ウェブサーバーのためにサブネットやセキュリティグループなどのネットワークリソースを作成するスタックがあるとします。情報が共有されていると、実際のウェブサーバーを作成する他のスタックが、最初のスタックによって作成されたネットワークリソースを使用できます。リソースの ID をスタックのテンプレートにハードコード化する、または、ID を入力パラメータとして渡す必要はありません。

スタック間で情報を共有するには、1 つのスタックからの出力値をエクスポートし、それらを別のスタックにインポートします。処理の流れ

  1. 最初のスタックのテンプレート (ネットワークスタックなど) で、Outputs セクションの Export フィールドを使用して、エクスポートする特定の値を定義します。詳細については、「CloudFormation テンプレートの Outputs セクション構文リファレンス」を参照してください。

  2. そのスタックを作成または更新すると、CloudFormation が出力値をエクスポートして、同じ AWS アカウントおよびリージョン内にある他のスタックがそれらを利用できるようにします。

  3. 他のスタックのテンプレートで Fn::ImportValue 関数を使用して、最初のスタックからエクスポートされた値をインポートします。

  4. 2 番目のスタック (ウェブサーバースタックなど) を作成または更新すると、CloudFormation が最初のスタックからエクスポートされた値を自動的に取得して、それらを使用します。

チュートリアル、およびサンプルテンプレートについては、別の CloudFormation スタックのリソース出力を参照する を参照してください。

スタック出力値のエクスポートとネストされたスタックの使用との比較

ネストされたスタックとは、別のスタック内で AWS::CloudFormation::Stack リソースを使用して作成するスタックです。ネストされたスタックにより、1 つのスタックからすべてのリソースをデプロイし、管理します。ネストされたスタックグループからの出力をグループ内の別のスタックへの入力として使用できます。これは値のエクスポートとは異なります。

情報共有をネストされたスタックグループ内に隔離する場合は、ネストされたスタックを使用することを推奨します。ネストされたスタックのグループ内に限らず、他のスタックと情報を共有するには、値をエクスポートします。たとえば、サブネットのあると 1 つのスタックを作成し、ID をエクスポートできます。他のスタックは、そのサブネットの ID をインポートすることで、そのサブネットを使用できます。各スタックは独自のサブネットを作成する必要はありません。スタックがサブネット ID をインポートする限り、それを変更または削除することはできません。

ネストされたスタックの詳細については、「ネストされたスタックを使用して他のスタック内にスタックを埋め込む」を参照してください。

考慮事項

クロススタック参照には以下の制限があります。

  • AWS アカウント ごとに、Export 名がリージョン内で一意である必要があります。

  • リージョン間でクロススタック参照は作成できません。組み込み関数 Fn::ImportValue を使用すると、同じリージョン内にエクスポートされた値のみをインポートできます。

  • 出力の場合、ExportName プロパティの値は、リソースに依存する Ref または GetAtt の関数を使用できません。

    同様に、ImportValue 関数にリソースに依存する Ref または GetAtt 関数を含めることはできません。

  • 別のスタックが出力値をインポート後、出力値をエクスポートしているスタックを削除したり、エクスポートされた出力値を変更することはできません。エクスポートしているスタックを削除したり出力値を変更する前に、インポートをすべて削除する必要があります。

エクスポートされた出力値のリスト

スタックからエクスポートされた出力値を表示する必要がある場合は、次のいずれかの方法を使用します。

エクスポートされた出力値 (コンソール) をリスト表示するには
  1. https://console.aws.amazon.com/cloudformation で AWS CloudFormation コンソール を開きます。

  2. 画面上部にあるナビゲーションバーで、AWS リージョン を選択します。

  3. 左側のナビゲーションペインで、[エクスポート] を選択します。

エクスポートされた出力値 (AWS CLI) をリスト表示するには

次の list-exports コマンドを使用します。us-east-1 を、ご利用の AWS リージョン に置き換えてください。

aws cloudformation list-exports --region us-east-1

以下は出力例です。

{ "Exports": [ { "ExportingStackId": "arn:aws:cloudformation:us-west-2:123456789012:stack/private-vpc/99764070-b56c-xmpl-bee8-062a88d1d800", "Name": "private-vpc-subnet-a", "Value": "subnet-07b410xmplddcfa03" }, { "ExportingStackId": "arn:aws:cloudformation:us-west-2:123456789012:stack/private-vpc/99764070-b56c-xmpl-bee8-062a88d1d800", "Name": "private-vpc-subnet-b", "Value": "subnet-075ed3xmplebd2fb1" }, { "ExportingStackId": "arn:aws:cloudformation:us-west-2:123456789012:stack/private-vpc/99764070-b56c-xmpl-bee8-062a88d1d800", "Name": "private-vpc-vpcid", "Value": "vpc-011d7xmpl100e9841" } ] }

CloudFormation は、現在のリージョンのエクスポートされた出力の名前と値、およびエクスポート元のスタックを表示します。エクスポートされた出力値を別のスタックのテンプレートで使用するために、エクスポート名と Fn::ImportValue 関数を使用してその値を参照できます。

エクスポートされた出力値をインポートするスタックのリスト

エクスポートされた出力値を削除または変更するには、まずどのスタックがそれらをインポートしようとしているのかを確認する必要があります。

エクスポートされた出力値をインポートするスタックを表示するには、次のいずれかの方法を使用します。

エクスポートされた出力値をインポートするスタックをリストするには (コンソール)
  1. https://console.aws.amazon.com/cloudformation で AWS CloudFormation コンソール を開きます。

  2. 左側のナビゲーションペインで、[エクスポート] を選択します。

  3. 特定のエクスポート値をインポートするスタックを確認するには、そのエクスポート値の [Export Name] (エクスポート名) を選択します。CloudFormation により、エクスポートの詳細ページが表示され、値をインポートしているすべてのスタックがリスト表示されます。

エクスポートされた出力値をインポートするスタックをリストするには (AWS CLI)

list-importsコマンドを実行します。us-east-1 を AWS リージョン に、private-vpc-vpcid をエクスポートされた出力値の名前に置き換えます。

aws cloudformation list-imports --region us-east-1 \ --export-name private-vpc-vpcid

CloudFormation から、値をインポートするスタックのリストが返されます。

{ "Imports": [ "my-app-stack" ] }

エクスポートされた特定の値をインポートするスタックがわかったら、それらのスタックを変更して、出力値を参照する Fn::ImportValue 関数を削除する必要があります。エクスポートされた出力値を削除または編集する前に、エクスポートされた出力値を参照するインポートをすべて削除する必要があります。