Résolution des AWS CDK problèmes courants - AWS Cloud Development Kit (AWS CDK) v2

Ceci est le guide du AWS CDK développeur de la version 2. L'ancien CDK v1 est entré en maintenance le 1er juin 2022 et a pris fin le 1er juin 2023.

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Résolution des AWS CDK problèmes courants

Cette rubrique explique comment résoudre les problèmes suivants liés au AWS CDK.

Après avoir mis à jour le AWS CDK, le AWS CDK Toolkit (CLI) signale une incompatibilité avec la bibliothèque AWS Construct

La version du AWS CDK Toolkit (qui fournit la cdk commande) doit être au moins égale à la version du module principal de AWS Construct Library,aws-cdk-lib. Le kit d'outils est destiné à être rétrocompatible. La dernière version 2.x de la boîte à outils peut être utilisée avec n'importe quelle version 1.x ou 2.x de la bibliothèque. C'est pourquoi nous vous recommandons d'installer ce composant globalement et de le maintenir à jour.

npm update -g aws-cdk

Si vous devez travailler avec plusieurs versions du AWS CDK kit d'outils, installez une version spécifique du kit localement dans le dossier de votre projet.

Si vous utilisez TypeScript ou JavaScript, le répertoire de votre projet contient déjà une copie locale versionnée du kit d'outils CDK.

Si vous utilisez une autre langue, utilisez-le npm pour installer le AWS CDK Toolkit, en omettant le -g drapeau et en spécifiant la version souhaitée. Par exemple :

npm install aws-cdk@2.0

Pour exécuter un AWS CDK kit d'outils installé localement, utilisez la commande npx aws-cdk au lieu de uniquementcdk. Par exemple :

npx aws-cdk deploy MyStack

npx aws-cdkexécute la version locale du AWS CDK Toolkit s'il en existe une. Il revient à la version globale lorsqu'un projet n'a pas d'installation locale. Vous trouverez peut-être pratique de configurer un alias de shell pour vous assurer qu'il cdk est toujours invoqué de cette façon.

macOS/Linux
alias cdk="npx aws-cdk"
Windows
doskey cdk=npx aws-cdk $*

(retour à la liste)

Lors du déploiement de ma AWS CDK pile, je reçois un NoSuchBucket message d'erreur

Votre AWS environnement n'a pas été amorcé et ne dispose donc pas d'un compartiment Amazon S3 pour stocker les ressources pendant le déploiement. Vous pouvez créer le bucket intermédiaire et les autres ressources requises à l'aide de la commande suivante :

cdk bootstrap aws://ACCOUNT-NUMBER/REGION

Pour éviter de générer AWS des frais inattendus, aucun environnement AWS CDK ne démarre automatiquement. Vous devez amorcer explicitement chaque environnement dans lequel vous allez effectuer le déploiement.

Par défaut, les ressources bootstrap sont créées dans la ou les régions utilisées par les piles de l'application actuelle AWS CDK . Ils sont également créés dans la région spécifiée dans votre AWS profil local (définie paraws configure), en utilisant le compte de ce profil. Vous pouvez spécifier un compte et une région différents sur la ligne de commande comme suit. (Vous devez spécifier le compte et la région si vous ne vous trouvez pas dans le répertoire d'une application.)

cdk bootstrap aws://ACCOUNT-NUMBER/REGION

Pour plus d’informations, consultez Action d’amorçage.

(retour à la liste)

Lors du déploiement de ma AWS CDK pile, je reçois un forbidden: null message

Vous déployez une pile qui nécessite des ressources d'amorçage, mais vous utilisez un rôle ou un compte IAM qui n'est pas autorisé à y écrire. (Le bucket intermédiaire est utilisé lors du déploiement de piles contenant des actifs ou synthétisant un AWS CloudFormation modèle supérieur à 50 000.) Utilisez un compte ou un rôle autorisé à effectuer l'action sur s3:* le bucket mentionné dans le message d'erreur.

(retour à la liste)

Lors de la synthèse d'une AWS CDK pile, je reçois le message --app is required either in command-line, in cdk.json or in ~/.cdk.json

Ce message signifie généralement que vous n'êtes pas dans le répertoire principal de votre AWS CDK projet lorsque vous le publiezcdk synth. Le fichier cdk.json de ce répertoire, créé par la cdk init commande, contient la ligne de commande nécessaire pour exécuter (et ainsi synthétiser) votre AWS CDK application. Pour une TypeScript application, par exemple, la valeur par défaut cdk.json ressemble à ceci :

{ "app": "npx ts-node bin/my-cdk-app.ts" }

Nous vous recommandons d'émettre des cdk commandes uniquement dans le répertoire principal de votre projet, afin que la AWS CDK boîte à outils puisse cdk.json y accéder et exécuter correctement votre application.

Si cela n'est pas pratique pour une raison ou une autre, le AWS CDK Toolkit recherche la ligne de commande de l'application à deux autres emplacements :

  • cdk.jsonDans votre répertoire personnel

  • Sur la cdk synth commande elle-même en utilisant l'-aoption

Par exemple, vous pouvez synthétiser une pile à partir d'une TypeScript application comme suit.

cdk synth --app "npx ts-node my-cdk-app.ts" MyStack

(retour à la liste)

Lors de la synthèse d'une AWS CDK pile, je reçois une erreur car le AWS CloudFormation modèle contient trop de ressources

AWS CDK Génère et déploie des AWS CloudFormation modèles. AWS CloudFormation impose une limite stricte au nombre de ressources qu'une pile peut contenir. Avec le AWS CDK, vous pouvez atteindre cette limite plus rapidement que prévu.

Note

La limite de AWS CloudFormation ressources est de 500 au moment d'écrire ces lignes. Voir AWS CloudFormation les quotas pour la limite de ressources actuelle.

Les constructions de niveau supérieur basées sur l'intention de la bibliothèque AWS Construct fournissent automatiquement toutes les ressources auxiliaires nécessaires à la journalisation, à la gestion des clés, à l'autorisation et à d'autres fins. Par exemple, l'octroi d'un accès à une ressource à une autre génère tous les objets IAM nécessaires à la communication des services concernés.

D'après notre expérience, l'utilisation dans le monde réel de constructions basées sur l'intention génère 1 à 5 AWS CloudFormation ressources par construction, bien que cela puisse varier. Pour les applications sans serveur, 5 à 8 AWS ressources par point de terminaison d'API sont typiques.

Les modèles, qui représentent un niveau d'abstraction supérieur, vous permettent de définir encore plus de AWS ressources avec encore moins de code. Le AWS CDK code inCréation d'un service AWS Fargate à l'aide du AWS CDK, par exemple, génère plus de 50 AWS CloudFormation ressources tout en ne définissant que trois constructions !

Le dépassement de la limite de AWS CloudFormation ressources constitue une erreur lors de AWS CloudFormation la synthèse. Il AWS CDK émet un avertissement si votre pile dépasse 80 % de la limite. Vous pouvez utiliser une limite différente en définissant la maxResources propriété sur votre pile, ou désactiver la validation en la définissant maxResources sur 0.

Astuce

Vous pouvez obtenir un décompte exact des ressources présentes dans votre sortie synthétisée à l'aide du script utilitaire suivant. (Comme chaque AWS CDK développeur a besoin de Node.js, le script est écrit dedans JavaScript.)

// rescount.js - count the resources defined in a stack // invoke with: node rescount.js <path-to-stack-json> // e.g. node rescount.js cdk.out/MyStack.template.json import * as fs from 'fs'; const path = process.argv[2]; if (path) fs.readFile(path, 'utf8', function(err, contents) { console.log(err ? `${err}` : `${Object.keys(JSON.parse(contents).Resources).length} resources defined in ${path}`); }); else console.log("Please specify the path to the stack's output .json file");

Lorsque le nombre de ressources de votre pile approche de la limite, envisagez de réorganiser l'architecture pour réduire le nombre de ressources que contient votre pile : par exemple, en combinant certaines fonctions Lambda ou en divisant votre pile en plusieurs piles. Le CDK prend en charge les références entre les piles, ce qui vous permet de séparer les fonctionnalités de votre application en différentes piles de la manière qui vous convient le mieux.

Note

AWS CloudFormation les experts suggèrent souvent l'utilisation de piles imbriquées comme solution à la limite des ressources. Ils AWS CDK soutiennent cette approche par le biais de la NestedStackconstruction.

(retour à la liste)

J'ai spécifié trois zones de disponibilité (ou plus) pour mon groupe Auto Scaling ou mon VPC, mais celui-ci n'a été déployé que dans deux

Pour obtenir le nombre de zones de disponibilité que vous demandez, spécifiez le compte et la région dans les env propriétés de la pile. Si vous ne spécifiez pas les deux, par défaut AWS CDK, la pile est synthétisée comme indépendante de l'environnement. Vous pouvez ensuite déployer la pile dans une région spécifique à l'aide de AWS CloudFormation. Certaines régions n'ayant que deux zones de disponibilité, un modèle indépendant de l'environnement n'en utilise pas plus de deux.

Note

Dans le passé, les régions se lançaient parfois avec une seule zone de disponibilité. Les AWS CDK stacks indépendants de l'environnement ne peuvent pas être déployés dans de telles régions. Au moment d'écrire ces lignes, toutes les AWS régions disposent toutefois d'au moins deux AZ.

Vous pouvez modifier ce comportement en remplaçant la propriété availablilityZones(Python :availability_zones) de votre pile pour spécifier explicitement les zones que vous souhaitez utiliser.

Pour plus d'informations sur la spécification du compte et de la région d'une pile au moment de la synthèse, tout en conservant la flexibilité nécessaire au déploiement dans n'importe quelle région, consultezEnvironnements.

(retour à la liste)

Mon compartiment S3, ma table DynamoDB ou toute autre ressource n'est pas supprimé lorsque je publie cdk destroy

Par défaut, les ressources qui peuvent contenir des données utilisateur ont une propriété removalPolicy (Python :removal_policy) deRETAIN, et la ressource n'est pas supprimée lorsque la pile est détruite. Au lieu de cela, la ressource devient orpheline de la pile. Vous devez ensuite supprimer la ressource manuellement une fois la pile détruite. Tant que vous ne le faites pas, le redéploiement de la pile échoue. Cela est dû au fait que le nom de la nouvelle ressource créée lors du déploiement est en conflit avec le nom de la ressource orpheline.

Si vous définissez la politique de suppression d'une ressource surDESTROY, cette ressource sera supprimée lorsque la pile sera détruite.

TypeScript
import * as cdk from 'aws-cdk-lib'; import { Construct } from 'constructs'; import * as s3 from 'aws-cdk-lib/aws-s3'; export class CdkTestStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); const bucket = new s3.Bucket(this, 'Bucket', { removalPolicy: cdk.RemovalPolicy.DESTROY, }); } }
JavaScript
const cdk = require('aws-cdk-lib'); const s3 = require('aws-cdk-lib/aws-s3'); class CdkTestStack extends cdk.Stack { constructor(scope, id, props) { super(scope, id, props); const bucket = new s3.Bucket(this, 'Bucket', { removalPolicy: cdk.RemovalPolicy.DESTROY }); } } module.exports = { CdkTestStack }
Python
import aws_cdk as cdk from constructs import Construct import aws_cdk.aws_s3 as s3 class CdkTestStack(cdk.stack): def __init__(self, scope: Construct, id: str, **kwargs): super().__init__(scope, id, **kwargs) bucket = s3.Bucket(self, "Bucket", removal_policy=cdk.RemovalPolicy.DESTROY)
Java
software.amazon.awscdk.*; import software.amazon.awscdk.services.s3.*; import software.constructs; public class CdkTestStack extends Stack { public CdkTestStack(final Construct scope, final String id) { this(scope, id, null); } public CdkTestStack(final Construct scope, final String id, final StackProps props) { super(scope, id, props); Bucket.Builder.create(this, "Bucket") .removalPolicy(RemovalPolicy.DESTROY).build(); } }
C#
using Amazon.CDK; using Amazon.CDK.AWS.S3; public CdkTestStack(Construct scope, string id, IStackProps props) : base(scope, id, props) { new Bucket(this, "Bucket", new BucketProps { RemovalPolicy = RemovalPolicy.DESTROY }); }
Note

AWS CloudFormation Impossible de supprimer un compartiment Amazon S3 non vide. Si vous définissez la politique de suppression d'un compartiment Amazon S3 de manière à DESTROY ce qu'il contienne des données, toute tentative de destruction de la pile échouera car le compartiment ne peut pas être supprimé. Vous pouvez demander à AWS CDK supprimer les objets du compartiment avant de tenter de le détruire en réglant l'autoDeleteObjectsaccessoire du compartiment surtrue.

(retour à la liste)