AWS CloudFormation の「XYZ という名前のエクスポートが見つかりません」エラーの解決方法を教えてください。

最終更新日: 2020 年 6 月 12 日

スタックで Fn::ImportValue を使用すると、AWS CloudFormation で「XYZ という名前のエクスポートが見つかりません」エラーが表示されます。このエラーの解決方法を教えてください。

簡単な説明

インポート値またはエクスポート値を使用するスタックリファレンスを AWS CloudFormation で作成する場合は、以下を実行する必要があります。

  • 値をエクスポートするスタックで、AWS CloudFormation テンプレートの [出力] セクションの [エクスポート:] フラグを使用します。
  • エクスポートされた値を参照するスタックで、Fn::ImportValue を使用します。

このエラーは、次のシナリオで受け取ることがあります。

  • ネストされたスタックで Fn::ImportValue を使用しています。
  • エクスポートされた値が、値をインポートしているのと同じ AWS リージョンまたは同じアカウントに存在しません。
  • エクスポートされた値は、スタックによってインポートされる前に作成または発行されることはありません。
  • インポートスタックで正しくないエクスポート名を使用しました。

発生しているシナリオに基づいて、次の解決策のいずれかを選択します。

解決方法

ネストされたスタックで Fn::ImportValue を使用しています

ネストされたスタックでは、AWS CloudFormation はデフォルトで子スタックを並列に作成します。1 つの子スタックが他の子スタックから出力をインポートする場合、スタックの作成は失敗することがあります。AWS CloudFormation が子スタックを並行して作成する場合、エクスポート値は他の子スタックによってインポートされるまでに間に合わなくなるリスクがあります。

エラーを解決するには、DependsOn 属性を使用して、エクスポートされた出力を持つスタックで Fn::ImportValue を使用しているスタックの明示的な依存関係を作成します。

たとえば、次のネストされたスタックを参照してください。ChildStack01 は [出力] セクションの値をエクスポートし、ChildStack02Fn::ImportValue を使用して ChildStack01 から値をインポートします。次の例に基づいて ChildStack02DependsOn を使用できます。

{
   "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 アカウントとリージョン内でのみ適用されます。同じ AWS アカウントおよびリージョンにある他のスタックは、エクスポートされた値のみをインポートできます。

この問題を解決するには、Fn::ImportValue を使用してスタックを作成する前に、[スタックのエクスポートとインポートに関するスタック設定の確認] セクションのステップを完了します。

エクスポートされた値は、スタックによってインポートされる前に作成または発行されない

ネストされていないスタックの場合、値をエクスポートするスタックをデプロイする必要があります。インポートするスタックを作成する前に、スタックの状態が Create_Complete または Update_Complete になっている必要があります。

この問題を解決するには、Fn::ImportValue を使用してスタックを作成する前に、[スタックのエクスポートとインポートに関するスタック設定の確認] セクションのステップを完了します。

インポートスタックで正しくないエクスポート名を使用しました

1.    エクスポート名が AWS アカウントに表示されていることを確認します。

2.    1 つのスタックから別のスタックにエクスポート名をインポートする場合は、両方のスタックでまったく同じエクスポート名を使用していることを確認します。

3.    Fn::ImportValue を使用してスタックを作成する前に、[スタックのエクスポートとインポートに関するスタック設定の確認] セクションのステップを完了します。

エクスポートおよびインポートスタックのスタック設定を確認する

AWS CloudFormation コンソールまたは AWS コマンドラインインターフェイス (AWS CLI) を使用して、エクスポート値が同じリージョンとアカウントに存在することを確認できます。

AWS CloudFormation コンソールを使用します。

1.    AWS CloudFormation コンソールを開きます。

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

3.    エクスポート値がコンソールに表示されていることを確認します。

AWS CLI を使用して、以下を実行します。

1.    使用可能なエクスポートを表示するには、次のコマンドを実行します。

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

注意: us-east-1 をお客様のリージョンに置き換えます。

2.    出力で、[名前] プロパティがインポートスタックとエクスポートスタックでまったく同じであることを確認します。この出力は次のようになります。

{
    "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"
        }
}

重要: スタックでインポート値とエクスポート値を使用する場合は、以下の点を考慮します。

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

この記事はお役に立ちましたか?

改善できることはありますか?


さらにサポートが必要な場合