Comment résoudre l’erreur « No Export named XYZ found » dans CloudFormation ?

Lecture de 5 minute(s)
0

Lorsque j’utilise Fn::ImportValue dans ma pile AWS CloudFormation, le message d’erreur « No Export named XYZ found » s’affiche.

Résolution

Prérequis :

  • Utilisez l’indicateur Exporter : dans la section Sorties de votre modèle CloudFormation pour la pile dans laquelle vous exportez une valeur.
  • Utilisez Fn::ImportValue dans la pile où vous faites référence à la valeur exportée.

Pour résoudre les problèmes liés aux références de pile lorsque vous utilisez des valeurs d’importation et d’exportation, effectuez les actions suivantes.

Si vous utilisez des piles imbriquées, utilisez DependsOn

Par défaut, CloudFormation crée toutes les piles imbriquées en parallèle. Lorsque CloudFormation crée des piles enfants en parallèle et qu’une pile enfant importe une sortie depuis une autre, la création de la pile peut échouer. La valeur d’exportation ne sera peut-être pas disponible à temps pour que la pile enfant puisse utiliser Fn::ImportValue pour l’importer.

Pour résoudre ce problème, utilisez l’attribut DependsOn. Cet attribut crée une dépendance explicite entre la pile qui utilise Fn::ImportValue et la pile qui utilise l’attribut Export: pour exporter une valeur. De cette façon, CloudFormation crée la pile qui utilise Fn::ImportValue uniquement après avoir créé la pile qui exporte la valeur.

Exemple : Dans une pile imbriquée, ChildStack01 exporte une valeur dans la section Outputs, et ChildStack02 utilise Fn::ImportValue pour importer la valeur depuis ChildStack01. Dans le modèle YAML suivant, ChildStack02 utilise l’attribut 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'

Remarque : pour les références croisées, utilisez Fn::ImportValue pour importer une valeur depuis un autre modèle. Pour les références au sein d’une même pile, utilisez Fn::Ref et Fn::GetAtt pour renvoyer la valeur du paramètre ou de la ressource spécifié.

Vérifiez le nom de l’exportation dans la pile d’importation

Pour vérifier l’exactitude de votre valeur d’exportation, prenez les mesures suivantes :

  • Vérifiez que le nom de l’exportation figure dans votre compte AWS.
  • Lorsque vous importez un nom d’exportation d’une pile vers une autre pile, vérifiez que vous utilisez le même nom d’exportation dans les deux piles.
  • Avant de créer la pile avec Fn::ImportValue, consultez la section Vérifier la configuration de la pile des piles d’exportation et d’importation.

Assurez-vous que la valeur exportée se trouve dans la même région AWS ou dans le même compte que celui où vous importez la valeur

Vous ne pouvez utiliser des références croisées que dans un seul compte et une seule région. Cependant, les autres piles qui se trouvent dans le même compte et la même région ne peuvent importer que les valeurs exportées.

Pour résoudre ce problème, avant de créer la pile avec Fn::ImportValue, consultez la section Vérifier la configuration de la pile des piles d’exportation et d’importation.

Assurez-vous que la valeur exportée est créée ou publiée avant que la pile ne l’importe

Pour les piles non imbriquées, vous devez d’abord déployer la pile qui exporte une valeur. La pile doit être dans l’état Create_Complete ou ** Update_Complete**.

Avant de créer la pile avec Fn::ImportValue, consultez la section Vérifier la configuration de la pile des piles d’exportation et d’importation.

Vérifiez la configuration de la pile des piles d’exportation et d’importation

Pour vérifier que la valeur d’exportation est prête à être importée, utilisez la console CloudFormation ou l’interface de ligne de commande AWS (AWS CLI).

Remarque : les piles d’importation et d’exportation doivent se trouver dans la même région et sur le même compte.

Pour utiliser la console CloudFormation, procédez comme suit :

  1. Ouvrez la console CloudFormation.
  2. Dans le volet de navigation, choisissez Exportations.
  3. Vérifiez que la valeur d’exportation de la pile est répertoriée.

Pour utiliser l’AWS CLI, procédez comme suit :

  1. Pour répertorier les exportations disponibles, exécutez la commande list-exports suivante :

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

    Remarque : remplacez us-east-1 par votre région.

  2. Dans la sortie, vérifiez que la valeur de Name dans l’exportation est la même que la valeur Fn::ImportValue.

    La sortie ressemble à cet exemple :

    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

**Remarque :**Si des erreurs surviennent lorsque vous exécutez des commandes AWS CLI, consultez l’article Résoudre les erreurs AWS CLI. Vérifiez également que vous utilisez bien la version la plus récente de l’AWS CLI.

Une fois qu’une pile importe une valeur de sortie, vous ne pouvez pas supprimer la pile qui exporte la valeur de sortie ni modifier la valeur de sortie exportée. Vous devez supprimer toutes les importations avant de pouvoir supprimer la pile d’exportation ou modifier la valeur de sortie. Pour plus d’informations sur la façon d’utiliser une solution de contournement, consultez Comment utiliser les paramètres dans AWS Systems Manager Parameter Store pour partager des valeurs entre les piles CloudFormation ? Notez que le nom de l’exportation doit être unique au sein de la région.

L’instruction d’importation dans la pile qui importe les informations ressemble à cet exemple :

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'
AWS OFFICIEL
AWS OFFICIELA mis à jour il y a un mois