Comment résoudre l'erreur « Ce modèle ne contient aucune ressource à importer » dans AWS CloudFormation ?

Dernière mise à jour : 17/02/2021

Je reçois l'erreur suivante dans la console AWS CloudFormation: « Ce modèle ne contient aucune ressource à importer. » En savoir plus. »

Brève description

Vous recevez cette erreur lorsque vous utilisez la console AWS CloudFormation pour importer des ressources créées en dehors d'AWS CloudFormation dans une pile existante.

Cette erreur peut se produire lorsque vous utilisez la console AWS CloudFormation dans des scénarios avec l'un des éléments suivants :

  • Ressources conditionnelles. Vous disposez d'un modèle AWS CloudFormation qui exclut les ressources conditionnelles ou les ressources qui ne remplissent pas certaines conditions. Vous ajustez les ressources pour que les conditions soient réunies. Ensuite, vous mettez à jour votre modèle pour inclure les ressources maintenant que les conditions sont réunies. Cependant, la console AWS CloudFormation, qui utilise l'API GetTemplateSummary pour rassembler les ressources importées et leurs identifiants, ne reconnaît pas si les conditions sont réunies dans votre modèle mis à jour.
  • Modèles AWS Serverless Application Model (AWS SAM). Les modèles AWS SAM ne prennent pas en charge la possibilité d'importer des ressources qui utilisent la transformation AWS::Serverless.
  • Fn::Transform. La console AWS CloudFormation ne prend pas en charge l'utilisation de la fonction intrinsèque Fn::Transform pour les mises à jour de pile qui utilisent un modèle pour importer des ressources.

Pour résoudre cette erreur, vous pouvez utiliser l'interface de ligne de commande AWS (AWS CLI) au lieu de la console AWS CloudFormation. Utilisez l'interface de ligne de commande AWS uniquement si l'importation n'affecte pas les ressources qui utilisent directement la fonction Fn::Transform ou les ressources AWS::Serverless.

L'AWS CLI n'utilise pas GetTemplateSummary pour récupérer des identificateurs pour les ressources importées. Au lieu de cela, l'interface de ligne de commande (CLI ) AWS exige que vous fournissiez explicitement des ressources importées en utilisant l'API AWS CloudFormation create-change-set ou exécute-change-set.

Remarque : Si vous recevez des erreurs lors de l'exécution des commandes depuis l'interface de ligne de commande (CLI) AWS assurez-vous d'utiliser la version la plus récente de l'interface AWS CLI.

Résolution

Dans le scénario suivant, un cluster Amazon Elastic Container Service (Amazon ECS) est importé dans une pile AWS CloudFormation :

Resources:
  ...
  ECSCluster2:
    Type: AWS::ECS::Cluster
    DeletionPolicy: Retain
    Properties:
      ClusterName: Cluster2

Pour résoudre l'erreur dans le scénario précédent, procédez comme suit :

Remarque : Si votre pile n'est pas dans votre région AWS par défaut, ajoutez --region à vos commandes ou modifiez la région par défaut en définissant et en exportant la variable d'environnement AWS_DEFAULT_REGION.

1.    Créez un fichier d'importation de ressources appelé import.txt. Par exemple:

[
    {
        "ResourceType": "AWS::ECS::Cluster",
        "LogicalResourceId":
            "ECSCluster2"
        ,
        "ResourceIdentifier": {
            "ClusterName":"Cluster2"
        }
    }
]

2.    Pour créer un jeu de modifications sur votre pile, exécutez la commande suivante :

ID=$(aws cloudformation create-change-set --stack-name testStack --change-set-name testSet --resources-to-import file://import.txt --change-set-type IMPORT --template-body file://template.yaml --capabilities CAPABILITY_AUTO_EXPAND  --query 'Id' --output text)

Remarque : la commande précédente renvoie le nom Amazon Resource Name (ARN) du jeu de modifications et stocke l'ARN dans l'ID de la variable d'environnement. Remplacez testStack par le nom de votre pile et template.yaml par le nom de fichier de votre modèle AWS CloudFormation.

3.    (Facultatif) Pour attendre que le jeu de modifications soit créé avec succès, exécutez la commande suivante :

aws cloudformation wait change-set-create-complete --change-set-name=${ID}

4.    Pour appliquer le jeu de modifications et importer votre ressource dans la pile, exécutez la commande suivante :

aws cloudformation execute-change-set --change-set-name ${ID}

Remarque : Vous devez utiliser CAPABILITY_AUTO_EXPAND uniquement si votre modèle utilise des transformations.

5.    (Facultatif) Pour vérifier que toutes les propriétés de votre modèle correspondent à votre ressource, utilisez la détection de l'écart sur la ressource.