スタックで Fn::ImportValue を使用すると、AWS CloudFormation で「No Export named XYZ found」(XYZ という名前のエクスポートが見つかりません) というエラーが表示されます。
簡単な説明
インポート値またはエクスポート値を使用するスタックリファレンスを CloudFormation で作成する場合は、次を実行する必要があります。
- 値をエクスポートするスタックで、CloudFormation テンプレートの [Outputs] (出力) セクションの [Export:] (エクスポート:) フラグを使用します。
- エクスポートされた値を参照するスタックで、Fn::ImportValue を使用します。
次のシナリオでは、「No Export named XYX found」(XYX という名前のエクスポートが見つかりません) というエラーが表示されることがあります。
- ネストされたスタックで Fn::ImportValue を使用している。
- エクスポートされた値が、値をインポートしているのと同じ AWS リージョンまたは同じ AWS アカウントにない。
- エクスポートされた値が、スタックがインポートする前に作成または発行されない。
- インポートスタックで正しくないエクスポート名を使用した。
発生しているシナリオに基づいて、次の解決策のいずれかを選択します。
解決方法
注: AWS Command Line Interface (AWS CLI) コマンドの実行中にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください。
ネストされたスタックで Fn::ImportValue を使用している
デフォルトでは、CloudFormation はネストされたスタックと並行して子スタックを作成します。子スタックが互いに並行して作成され、ある子スタックが別の子スタックから出力をインポートしている場合、スタックの作成は失敗する可能性があります。エクスポート値は、他の子スタックによってインポートされるまでに使用可能となっていないリスクがあります。
この問題を解決するには、DependsOn 属性を使用して、Fn::ImportValue を使用するスタックの明示的な依存関係を作成します。Fn:ImportValue を使用している子スタックは、値をエクスポートする子スタックの後にのみ作成されます。
次のネストスタックの例では、ChildStack01 は [Outputs] (出力) セクションの値をエクスポートし、ChildStack02 は Fn::ImportValue を使用して ChildStack01 から値をインポートします。次のサンプル YAML テンプレートに基づいて ChildStack02 に DependsOn を使用できます。
AWSTemplateFormatVersion: 2010-09-09
Resources:
ChildStack01:
Type: 'AWS::CloudFormation::Stack'
Properties:
TemplateURL: 'https://s3.amazonaws.com/cloudformation-templates-us-east-1/VPC.template'
TimeoutInMinutes: '60'
ChildStack02:
Type: 'AWS::CloudFormation::Stack'
DependsOn: ChildStack01
Properties:
TemplateURL: 'https://s3.amazonaws.com/cloudformation-templates-us-east-1/Subnet.template'
TimeoutInMinutes: '60'
ヒント: クロススタックリファレンスの場合は、Fn::ImportValue を使用して別のテンプレートから値をインポートします。ネストされたスタックの場合、Fn::Ref および Fn::GetAtt を使用して、現在のテンプレートの値を参照します。
エクスポートされた値が、値をインポートしているのと同じ AWS リージョンまたは同じ AWS アカウントにない
クロススタックリファレンスは 単一のアカウントとリージョン内でのみ適用されます。同じアカウントとリージョンにある他のスタックは、エクスポートされた値のみをインポートできます。
この問題を解決するには、Fn::ImportValue を使用してスタックを作成する前に、[Verify the stack configuration of the export and import stacks] (スタックのエクスポートとインポートに関するスタック設定の確認) セクションのステップを完了します。
エクスポートされた値が、スタックがインポートする前に作成または発行されない
ネストされていないスタックの場合、値をエクスポートするスタックをデプロイする必要があります。インポートするスタックを作成する前に スタックの状態が Create_Complete または Update_Complete になっている必要があります。
この問題を解決するには、Fn::ImportValue を使用してスタックを作成する前に、[Verify the stack configuration of the export and import stacks] (スタックのエクスポートとインポートに関するスタック設定の確認) セクションのステップを完了します。
インポートスタックで正しくないエクスポート名を使用した
- エクスポート名がアカウントに表示されていることを確認します。
- 1 つのスタックから別のスタックにエクスポート名をインポートする場合は、両方のスタックでまったく同じエクスポート名を使用していることを確認します。
- Fn::ImportValue を使用してスタックを作成する前に、[Verify the stack configuration of the export and import stacks] (スタックのエクスポートとインポートに関するスタック設定の確認) セクションのステップを完了します。
エクスポートおよびインポートスタックのスタック設定を確認する
AWS CloudFormation コンソールまたは AWS コマンドラインインターフェイス (AWS CLI) を使用して、エクスポート値が同じリージョンとアカウントに存在することを確認できます。
CloudFormation コンソールを使用して、次の操作を実行します。
- CloudFormation コンソールを開きます。
- ナビゲーションペインで、[Exports] (エクスポート) を選択します。
- エクスポート値がコンソールに表示されていることを確認します。
AWS CLI を使用して、以下を実行します。
1. 使用可能なエクスポートを表示するには、次のコマンドを実行します。
aws cloudformation list-exports --region us-east-1
注意: us-east-1 をお客様のリージョンに置き換えます。
2. 出力で、[Name] (名前) プロパティがインポートスタックとエクスポートスタックで同じであることを確認します。この出力は次のようになります。
aws cloudformation list-exports --region us-east-1 --output yaml
Exports:
- ExportingStackId: arn:aws:cloudformation:us-east-1:123456789012:stack/private-vpc/99764070-b56c-xmpl-bee8-062a88d1d800
Name: private-vpc-subnet-a
Value: subnet-01a234bcdefghij56
重要: スタックでインポートおよびエクスポート値を使用する場合は、次の点を考慮してください。スタックが出力値をインポートした後、その出力値をエクスポートしているスタックを削除したり、エクスポートされた出力値を変更したりすることはできません。エクスポートするスタックを削除するか、出力値を変更する前に すべてのインポートを削除する必要があります。エクスポート名はリージョン内で一意である必要があります。回避策として、AWS Systems Manager Parameter Store のパラメータを使用して CloudFormation スタック間で値を共有できます。