スタックで 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 を使用するスタックを作成します。
例: ネストされたスタックでは、ChildStack01 は Outputs セクションの値をエクスポートし、ChildStack02 は Fn:: ImportValue を使用して ChildStack01 から値をインポートします。次の YAML テンプレートでは、ChildStack02 は DependsOn 属性を使用しています。
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 コンソールを使用するには、次の手順を実行します。
- CloudFormation コンソールを開きます。
- ナビゲーションペインで、Exportsを選択します。
- スタックのエクスポート値が表示されていることを確認します。
AWS CLIを使用して、次の手順を実行します。
-
使用可能なエクスポートを表示するには、次の list-exports コマンドを実行します。
aws cloudformation list-exports --region us-east-1
**注:**us-east-1 を自分のリージョンに置き換えます。
-
出力で、エクスポートの名前 の値が ** 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'