Skip to content

CloudFormation の「No Export named XYZ found」というエラーを解決するにはどうすればよいですか?

所要時間2分
0

スタックで Fn:: ImportValue を使用すると、AWS CloudFormation で「No Export named XYZ found」というエラーが表示されます。

解決策

前提条件:

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

インポート値またはエクスポート値を使用するスタックリファレンスの問題を解決するには、次の操作を行います。

ネストされたスタックを使用する場合は、DependsOn を使用します

デフォルトでは、CloudFormation はネストされたスタックと並行して子スタックを作成します。CloudFormation が子スタックを並行して作成し、ある子スタックが別の子スタックから出力をインポートしている場合、スタックの作成は失敗する可能性があります。エクスポート値は、子スタックが Fn:: ImportValue を使用してインポートするまでに使用可能となっていない場合があります。

この問題を解決するには、DependsOn 属性を使用します。この属性は、Fn:: ImportValue を使用するスタックと Export: 属性を使用して値をエクスポートするスタックとの間に明示的な依存関係を作成します。この方法で、CloudFormation は、値をエクスポートするスタックを作成した後にのみ Fn:: ImportValue を使用するスタックを作成します。

例: ネストされたスタックでは、ChildStack01Outputs セクションの値をエクスポートし、ChildStack02Fn:: ImportValue を使用して ChildStack01 から値をインポートします。次の YAML テンプレートでは、ChildStack02DependsOn 属性を使用しています。

AWSTemplateFormatVersion: 2010-09-09Resources:
 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 アカウントに表示されていることを確認します。
  • あるスタックから別のスタックにエクスポート名をインポートする場合は、両方のスタックで同じエクスポート名を使用していることを確認してください。
  • Fn:: ImportValue を使用してスタックを作成する前に、「スタックのエクスポートとインポートに関するスタック設定の確認」セクションを参照してください。

エクスポートされた値が、値をインポートする場所と同じ AWS リージョンまたは同じアカウントにあることを確認する

クロススタックレファレンスは、1 つのアカウントおよびリージョン内でのみ使用できます。ただし、同じアカウントおよびリージョンにある他のスタックは、エクスポートされた値のみをインポートできます。

この問題を解決するには、Fn:: ImportValue を使用してスタックを作成する前に、「スタックのエクスポートとインポートに関するスタック設定の確認」セクションを参照してください。

スタックがインポートする前に、エクスポートされた値が作成または発行されていることを確認する

ネストされていないスタックの場合は、最初に値をエクスポートするスタックをデプロイする必要があります。スタックはCreate_Complete または Update_Complet になっている必要があります。

Fn:: ImportValue を使用してスタックを作成する前に、「スタックのエクスポートとインポートに関するスタック設定の確認」セクションを参照してください。

スタックのエクスポートとインポートに関するスタック設定の確認

エクスポート値をインポートする準備ができていることを確認するには、CloudFormation コンソールまたは AWS コマンドラインインターフェイス (AWS CLI) を使用します。

**注:**インポートスタックとエクスポートスタックは同じリージョンおよびアカウントにある必要があります。

CloudFormation コンソールを使用するには、次の手順を実行します。

  1. CloudFormation コンソールを開きます。
  2. ナビゲーションペインで、Exportsを選択します。
  3. スタックのエクスポート値が表示されていることを確認します。

AWS CLIを使用して、次の手順を実行します。

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

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

    **注:**us-east-1 を自分のリージョンに置き換えます。

  2. 出力で、エクスポートの名前 の値が ** Fn::ImportValue** の値と同じであることを確認します。

    類似の出力例を以下に示します。

    aws cloudformation list-exports --region us-east-1 --output yamlExports:
    - 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 CLI のコマンドの実行時にエラーが発生する場合は、「AWS CLI エラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。

スタックが出力値をインポートした後、その出力値をエクスポートしているスタックを削除したり、エクスポートされた出力値を変更したりすることはできません。エクスポートするスタックを削除するか、出力値を変更する前に すべてのインポートを削除する必要があります。回避策については、「AWS Systems Manager Parameter Store のパラメータを使用して CloudFormation スタック間で値を共有する方法を教えてください」を参照してください。エクスポート名はリージョン内で一意である必要があります。

情報をインポートするスタックのインポートステートメントは、次の例のようになります。

Resources:
  WebServerInstance:
    Type: 'AWS::EC2::Instance'
    Properties:
      InstanceType: t2.micro
      ImageId: ami-a1b23456
      NetworkInterfaces:
          AssociatePublicIpAddress: 'true'
          DeviceIndex: '0'
          DeleteOnTermination: 'true'
          SubnetId: Fn::ImportValue: 'private-vpc-subnet-a'
コメントはありません

関連するコンテンツ