Questa è la guida per sviluppatori AWS CDK v2. Il vecchio CDK v1 è entrato 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à.
In questo argomento viene descritto come risolvere i seguenti problemi con. AWS CDK
Dopo l'aggiornamento AWS CDK, il 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 AWS di 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 utilizzando TypeScript or JavaScript, la directory del progetto contiene già una copia locale con versione del CDK Toolkit.
Se state usando un'altra lingua, usate 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-cdk
esegue 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.
alias cdk="npx aws-cdk"
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.
Quando distribuisco il mio AWS CDK stack, ricevo un messaggio forbidden: null
Stai implementando uno stack che richiede risorse di bootstrap, ma stai utilizzando un ruolo o un account IAM 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.
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.json
Nella tua home directory -
Sul
cdk synth
comando stesso usando l'-a
opzione
Ad esempio, è possibile sintetizzare uno stack da un' TypeScript app nel modo seguente.
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 gli oggetti IAM 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, anche se questo dato può variare. Per le applicazioni serverless, sono tipicamente 5-8 risorse per endpoint API. AWS
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. Il CDK supporta i riferimenti tra gli stack, quindi 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 stack annidati come soluzione al limite delle risorse. AWS CDK Supporta questo approccio tramite il NestedStackcostrutto.
Ho specificato tre (o più) zone di disponibilità per il mio gruppo Auto Scaling o VPC, 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
(availablilityZones
Python:) 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
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.
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,
});
}
}
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