Risoluzione dei AWS CDK problemi più comuni - AWS Cloud Development Kit (AWS CDK) v2

Questa è la guida per sviluppatori AWS CDK v2. La versione precedente della CDK versione 1 è entrata in manutenzione il 1° giugno 2022 e ha terminato il supporto il 1° giugno 2023.

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Risoluzione dei AWS CDK problemi più comuni

In questo argomento viene descritto come risolvere i seguenti problemi con. AWS CDK

Dopo l'aggiornamento di AWS CDK, AWS CDK Toolkit (CLI) segnala una mancata corrispondenza con la Construct Library AWS

La versione del AWS CDK Toolkit (che fornisce il cdk comando) deve essere almeno uguale alla versione del modulo principale di AWS Construct Library,. aws-cdk-lib Il Toolkit è pensato per essere retrocompatibile. L'ultima versione 2.x del toolkit può essere utilizzata con qualsiasi versione 1.x o 2.x della libreria. Per questo motivo, ti consigliamo di installare questo componente a livello globale e di mantenerlo aggiornato.

npm update -g aws-cdk

Se devi lavorare con più versioni del AWS CDK Toolkit, installa una versione specifica del toolkit localmente nella cartella del progetto.

Se state usando TypeScript or JavaScript, la directory del progetto contiene già una copia locale con versione del Toolkit. CDK

Se stai usando un'altra lingua, usa npm per installare il AWS CDK Toolkit, omettendo il -g flag e specificando la versione desiderata. Per esempio:

npm install aws-cdk@2.0

Per eseguire un AWS CDK Toolkit installato localmente, utilizzate il comando npx aws-cdk anziché only. cdk Per esempio:

npx aws-cdk deploy MyStack

npx aws-cdkesegue la versione locale del AWS CDK Toolkit, se ne esiste una. Torna alla versione globale quando un progetto non ha un'installazione locale. Potrebbe essere utile impostare un alias di shell per assicurarsi che cdk venga sempre invocato in questo modo.

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

(torna alla lista)

Quando distribuisco il mio AWS CDK stack, ricevo un errore NoSuchBucket

Il tuo AWS ambiente non è stato avviato e quindi non dispone di un bucket Amazon S3 per contenere risorse durante la distribuzione. Puoi creare il bucket di staging e altre risorse necessarie con il seguente comando:

cdk bootstrap aws://ACCOUNT-NUMBER/REGION

Per evitare di generare AWS addebiti imprevisti, AWS CDK non avvia automaticamente nessun ambiente. È necessario avviare in modo esplicito ogni ambiente in cui verrà distribuito.

Per impostazione predefinita, le risorse di bootstrap vengono create nella regione o nelle regioni utilizzate dagli stack dell'applicazione corrente. AWS CDK In alternativa, vengono create nella regione specificata nel AWS profilo locale (impostata daaws configure), utilizzando l'account di quel profilo. È possibile specificare un account e una regione diversi nella riga di comando come segue. (È necessario specificare l'account e la regione se non ci si trova nella directory di un'app.)

cdk bootstrap aws://ACCOUNT-NUMBER/REGION

Per ulteriori informazioni, consulta AWS CDK bootstrap.

(torna all'elenco)

Quando distribuisco il mio AWS CDK stack, ricevo un messaggio forbidden: null

Stai distribuendo uno stack che richiede risorse di bootstrap, ma stai utilizzando un IAM ruolo o un account che non dispone dell'autorizzazione per scriverlo. (Lo staging bucket viene utilizzato quando si distribuiscono stack che contengono risorse o che sintetizzano un modello più grande di 50.000.) AWS CloudFormation Utilizzate un account o un ruolo autorizzato a eseguire l'azione sul bucket indicato nel messaggio di s3:* errore.

(torna all'elenco)

Quando sintetizzo uno AWS CDK stack, ricevo il messaggio --app is required either in command-line, in cdk.json or in ~/.cdk.json

Questo messaggio di solito significa che non ti trovi nella directory principale del tuo AWS CDK progetto quando emetti. cdk synth Il file cdk.json in questa directory, creato dal cdk init comando, contiene la riga di comando necessaria per eseguire (e quindi sintetizzare) l'app AWS CDK . Per un' TypeScript app, ad esempio, l'impostazione predefinita è cdk.json simile a questa:

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

Ti consigliamo di impartire cdk i comandi solo nella directory principale del progetto, in modo che il AWS CDK toolkit possa cdk.json trovarli ed eseguire correttamente l'app.

Se per qualche motivo ciò non è pratico, il AWS CDK Toolkit cerca la riga di comando dell'app in altre due posizioni:

  • cdk.jsonNella tua home directory

  • Sul cdk synth comando stesso usando l'-aopzione

Ad esempio, è possibile sintetizzare uno stack da un' TypeScript app come segue.

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

(torna all'elenco)

Quando sintetizzo uno AWS CDK stack, ricevo un errore perché il AWS CloudFormation modello contiene troppe risorse

AWS CDK Genera e distribuisce modelli. AWS CloudFormation AWS CloudFormation ha un limite rigido al numero di risorse che uno stack può contenere. Con AWS CDK, puoi raggiungere questo limite più rapidamente di quanto ti aspetti.

Nota

Il limite di AWS CloudFormation risorse è 500 al momento della stesura di questo documento. Vedi le AWS CloudFormation quote per l'attuale limite di risorse.

I costrutti di livello superiore e basati sugli intenti della AWS Construct Library forniscono automaticamente tutte le risorse ausiliarie necessarie per la registrazione, la gestione delle chiavi, l'autorizzazione e altri scopi. Ad esempio, la concessione dell'accesso a una risorsa a un'altra genera tutti IAM gli oggetti necessari per la comunicazione tra i servizi pertinenti.

In base alla nostra esperienza, l'uso nel mondo reale di costrutti basati sugli intenti comporta da 1 a 5 AWS CloudFormation risorse per costrutto, sebbene ciò possa variare. Per le applicazioni serverless, sono tipicamente 5-8 risorse per endpoint. AWS API

I pattern, che rappresentano un livello di astrazione più elevato, consentono di definire ancora più AWS risorse con ancora meno codice. Il AWS CDK codice inEsempio: creare un AWS Fargate servizio utilizzando AWS CDK, ad esempio, genera più di 50 AWS CloudFormation risorse definendo solo tre costrutti!

Il superamento del limite di AWS CloudFormation risorse è un errore durante la AWS CloudFormation sintesi. AWS CDK Emette un avviso se lo stack supera l'80% del limite. Puoi utilizzare un limite diverso impostando la maxResources proprietà sullo stack o disabilitare la convalida impostandola su 0. maxResources

Suggerimento

È possibile ottenere un conteggio esatto delle risorse nell'output sintetizzato utilizzando il seguente script di utilità. (Poiché ogni AWS CDK sviluppatore ha bisogno di Node.js, lo script è scritto in JavaScript esso.)

// 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");

Man mano che il numero di risorse dello stack si avvicina al limite, prendi in considerazione la possibilità di riprogettare per ridurre il numero di risorse contenute nello stack: ad esempio, combinando alcune funzioni Lambda o suddividendo lo stack in più stack. CDKSupporta i riferimenti tra gli stack, così puoi separare le funzionalità dell'app in diversi stack nel modo che ritieni più opportuno.

Nota

AWS CloudFormation gli esperti spesso suggeriscono l'uso di pile annidate come soluzione al limite delle risorse. AWS CDK Supporta questo approccio tramite il NestedStackcostrutto.

(torna all'elenco)

Ho specificato tre (o più) zone di disponibilità per il mio gruppo Auto Scaling oppureVPC, ma sono state implementate solo in due

Per ottenere il numero di zone di disponibilità richieste, specifica l'account e la regione nella proprietà dello stack. env Se non li specificate entrambi, per impostazione predefinita lo AWS CDK stack sintetizza lo stack come indipendente dall'ambiente. È quindi possibile distribuire lo stack in una regione specifica utilizzando. AWS CloudFormation Poiché alcune regioni hanno solo due zone di disponibilità, un modello indipendente dall'ambiente non ne utilizza più di due.

Nota

In passato, le regioni venivano lanciate occasionalmente con una sola zona di disponibilità. Gli AWS CDK stack indipendenti dall'ambiente non possono essere distribuiti in tali regioni. Al momento della stesura di questo documento, tuttavia, tutte le AWS regioni ne hanno almeno due. AZs

Puoi modificare questo comportamento sovrascrivendo la proprietà availability_zones (availablilityZonesPython:) dello stack per specificare esplicitamente le zone che desideri utilizzare.

Per ulteriori informazioni su come specificare l'account e la regione di uno stack al momento della sintesi, pur mantenendo la flessibilità necessaria per la distribuzione in qualsiasi regione, consulta. Ambienti per AWS CDK

(torna all'elenco)

Il mio bucket S3, la tabella DynamoDB o un'altra risorsa non vengono eliminati quando emetto cdk destroy

Per impostazione predefinita, le risorse che possono contenere dati utente hanno una proprietà removalPolicy (Python:removal_policy) di RETAIN e la risorsa non viene eliminata quando lo stack viene distrutto. Invece, la risorsa è rimasta orfana dallo stack. È quindi necessario eliminare la risorsa manualmente dopo la distruzione dello stack. Finché non lo fai, la ridistribuzione dello stack non riesce. Questo perché il nome della nuova risorsa creata durante la distribuzione è in conflitto con il nome della risorsa orfana.

Se imposti la politica di rimozione di una risorsa suDESTROY, quella risorsa verrà eliminata quando lo stack viene distrutto.

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 }); }
Nota

AWS CloudFormation non può eliminare un bucket Amazon S3 non vuoto. Se imposti la politica di rimozione di un bucket Amazon S3 su e questo contiene datiDESTROY, il tentativo di distruggere lo stack avrà esito negativo perché il bucket non può essere eliminato. Puoi fare in modo che gli oggetti nel bucket vengano AWS CDK eliminati prima di tentare di distruggerlo impostando la proprietà del bucket su. autoDeleteObjects true

(torna all'elenco)