Comment résoudre l'erreur « Échec de la validation du modèle (# : clé extérieure [Key] non autorisée) » dans CloudFormation ?

Date de la dernière mise à jour : 15/04/2021

Je reçois l'erreur « Model validation failed (#: extraneous key [Key] is not permitted » (« Échec de la validation du modèle [# : la clé externe (Clé) n'est pas autorisée] ») dans mes événements de pile. Cette erreur se produit lorsque je crée une ressource à l'aide d'un fournisseur de ressources personnalisé avec l'interface de ligne de commande (CLI) AWS CloudFormation.

Brève description

Cette erreur s'affiche lorsque vous essayez de créer une ressource avec des propriétés à l'aide de votre fournisseur de ressources. Toutefois, vous n'avez défini aucune propriété dans le schéma du fournisseur de ressources ou vous utilisez des propriétés réservées.

Si vous rencontrez des problèmes avec d'autres erreurs liées à l'utilisation d'un fournisseur de ressources, consultez les articles suivants pour des étapes de dépannage supplémentaires :

Remarque : si vous recevez des erreurs lors de l'exécution des commandes AWS CLI, utilisez la version d'AWS CLI la plus récente.

Résolution

1.    Vérifiez que les propriétés définies dans votre modèle CloudFormation sont également définies dans votre fichier organization-service-resource.json.

Remarque : le fichier de schéma du fournisseur de ressources est un fichier JSON nommé organization-service-resource.json et se trouve dans le répertoire racine de votre projet.

2.    Si vous avez défini les propriétés correctement, vérifiez que votre projet a été créé avec succès en exécutant dans l'ordre les commandes cfn generate, mvn package et cfn submit. Par exemple :

$ cfn generate
Generated files for Organization::Service::Resource
$ mvn package
[INFO] Scanning for projects...
[INFO] 
[INFO] --< software.organization.service.resource:organization-service-resource-handler >--
[INFO] Building organization-service-resource-handler 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  21.690 s
[INFO] Finished at: 2020-07-14T16:02:47-05:00
[INFO] ------------------------------------------------------------------------
$ cfn submit 
Successfully submitted type. Waiting for registration with token '12345a-abcde-6789-abc1-a1234b567891' to complete.
{'ProgressStatus': 'COMPLETE', 'Description': 'Deployment is currently in DEPLOY_STAGE of status COMPLETED' , 'TypeArn': 'arn:aws:cloudformation:us-east-1:1234567891:type/resource/Organization-Service-Resource', 'TypeVersionArn': 'arn:aws:cloudformation:us-east-1:1234567891:type/resource/Organization-Service-Resource/00000035', 'ResponseMetadata': {'RequestId': '123a1234-b123-4567-abcd-123a123b1c1d', 'HTTPStatusCode': 200, 'HTTPHeaders': {'x-amzn-requestid': '123a1234-b123-4567-abcd-123a123b1c1d', 'content-type': 'text/xml', 'content-length': '952', 'date': 'Tue, 14 Jul 2020 21:16:17 GMT'}, 'RetryAttempts': 0}}

3.    Pour définir la version actuelle de votre projet à utiliser par défaut, exécutez la commande suivante :

aws cloudformation set-type-default-version --type RESOURCE --type-name Organization::Service::Resource --version-id 00000005

Remarque : remplacez les valeurs --type-name et --version-id par le nom de votre type de ressource et la dernière version de build renvoyée par la commande cfn submit dans la clé TypeVersionArn.

4.    Si les étapes 1 à 3 ne résolvent pas le problème, vérifiez si vous utilisez une propriété réservée en modifiant le nom de la propriété à la fois dans le schéma du fournisseur de ressources et dans votre modèle CloudFormation. Ensuite, régénérez et enregistrez votre type de ressource, puis essayez de créer la ressource à l'aide de CloudFormation avec le nouveau nom de propriété.

Tenez compte des conseils suivants :

Si vos tests d'unité ne sont pas terminés et que vous voulez les passer, exécutez la commande mvn -Dmaven.test.skip=true package au lieu de mvn package.

Pour définir la version de type actuelle comme valeur par défaut après un enregistrement réussi de la version de type, remplacez l'option --set-default par cfn submit. Par exemple :

$ cfn submit --set-default

Remarque : pour plus d'informations, consultez la section submit.

Vous pouvez résoudre les problèmes des tests en accédant au répertoire /target/surefire-reports à partir du répertoire racine de votre projet.


Cet article vous a-t-il été utile ?


Besoin d'aide pour une question technique ou de facturation ?