Vai al contenuto principale

Crea il tuo primo stack AWS CDK: un tutorial per principianti

Impara a creare e distribuire il tuo primo stack AWS CDK con Python. Questa guida per principianti copre setup, construct, deployment, test e CI/CD.
Aggiornato 29 set 2026  · 15 min leggi

Scopri con l'IA

ChatGPTClaudePerplexity

Gestire l'infrastruttura cloud con template JSON o YAML grezzi può essere noioso e soggetto a errori. L'AWS Cloud Development Kit (CDK) cambia le carte in tavola permettendoti di definire le risorse cloud usando linguaggi di programmazione moderni come Python, TypeScript, Java e C#.

Con CDK, l'infrastruttura diventa codice riutilizzabile, testabile e sotto controllo di versione. Ti consente di ragionare come uno sviluppatore anche quando esegui il provisioning di sistemi cloud complessi.

In questo tutorial imparerai a configurare un progetto AWS CDK usando Python. Ti guideremo nella scrittura del tuo primo stack, nell'aggiunta di una risorsa AWS essenziale e nella distribuzione sul tuo account AWS. Alla fine avrai una chiara comprensione di come funziona CDK e di come usarlo per gestire l'infrastruttura in modo developer-friendly, con il codice.

Per comprendere meglio le pratiche alla base di strumenti come AWS CDK, esplora i principi fondamentali nel nostro corso DevOps Concepts.

Prerequisiti

Prima di metterci a scrivere codice con AWS CDK, assicurati che il tuo ambiente sia configurato correttamente. Ecco cosa ti serve:

Account AWS per fare esperimenti

Ti serve l'accesso a un account AWS per distribuire l'applicazione che costruiremo. Se il tuo sistema è già configurato con le credenziali di un utente con privilegi di amministratore, puoi passare oltre.

Se non hai ancora un account AWS, creane uno qui.

Per un percorso di apprendimento strutturato sui fondamenti di AWS, l'AWS Cloud Practitioner track è un ottimo punto di partenza.

Utente amministratore

Ti servirà un utente con accesso programmatico e permessi completi per seguire la guida.

  1. Accedi al tuo account AWS.
  2. Apri la Console IAM.
  3. Crea un nuovo utente — puoi chiamarlo ad esempio "datacamp-cdk"
  4. Seleziona Programmatic access.
  5. Clicca Next: Permissions.
  6. Scegli Attach existing policies directly e seleziona AdministratorAccess.
  7. Prosegui con Next: Tags, Next: Review e poi Create User.

Nella schermata finale, annota il tuo Access key ID e la Secret access key. Ti serviranno nel prossimo passaggio.

Configura le tue credenziali AWS

Apri un terminale ed esegui:

aws configure

Ti verrà chiesto di inserire le credenziali dalla console IAM:

AWS Access Key ID [None]: <your access key ID>
AWS Secret Access Key [None]: <your secret access key>
Default region name [None]: us-east-1
Default output format [None]: 

Scegli un IDE per lo sviluppo

AWS CDK permette agli sviluppatori di lavorare in un ambiente di programmazione completo invece che su template YAML o JSON. Questo ambiente ricco di funzionalità ti consente di usare il tuo IDE preferito beneficiando di completamento del codice, linting in tempo reale e strumenti di refactoring per una gestione efficiente dell'infrastructure as code.

Per la migliore esperienza di sviluppo con il CDK in Python, ti suggerisco un IDE che supporti:

  • Evidenziazione della sintassi
  • Completamento del codice
  • Navigazione intelligente e suggerimenti
  • Supporto per ambienti virtuali

Installa Python e pip

Per usare AWS CDK con Python, devi avere Python versione 3.8 o superiore installato sul tuo sistema. Se non ce l'hai ancora, puoi scaricare l'ultima versione dal sito ufficiale di Python.

Se usi Windows, assicurati che Python sia aggiunto alla variabile d'ambiente PATH del sistema. Per verificare, apri un terminale o prompt dei comandi ed esegui:

python --version

Se vedi un errore tipo "command not found" o simile, probabilmente Python non è nel tuo PATH. La soluzione più semplice è spuntare la casella "Add Python 3.x to PATH" durante l'installazione.

Ti servirà anche pip, il gestore pacchetti di Python, per installare in seguito le dipendenze di AWS CDK. La maggior parte delle distribuzioni moderne di Python include già pip preinstallato.

pip --version

Se non è installato, segui la guida ufficiale di installazione di pip.

Primi passi con AWS CDK

Prima di scrivere codice, è essenziale capire cos'è AWS CDK, perché esiste e come si inserisce nel mondo più ampio dell'infrastructure as code (IaC). Questa sezione introduce i concetti chiave alla base di CDK e mostra come si confronta con altri popolari strumenti IaC.

Cos'è AWS CDK e perché si usa?

AWS Cloud Development Kit (CDK) è un framework open-source che consente di creare infrastruttura cloud tramite linguaggi di programmazione familiari, tra cui Python, TypeScript, Java e C#. 

CDK permette di generare template CloudFormation in modo programmatico tramite vero codice, invece di richiedere la scrittura manuale di template JSON o YAML.

Questo significa che puoi:

  • Riutilizzare la logica con cicli e funzioni.
  • Organizzare l'infrastruttura usando moduli e classi.
  • Il tuo IDE fornisce strumenti per completamento del codice, controllo degli errori e capacità di refactoring.

Alla base, CDK ruota attorno a tre concetti principali:

  • App – Il punto di ingresso del tuo progetto CDK. Può contenere uno o più stack.
  • Stack – Un'unità di distribuzione che corrisponde a uno stack CloudFormation. Ogni stack definisce un insieme di risorse da creare.
  • Construct – Il blocco costitutivo di CDK. I construct rappresentano componenti cloud come bucket S3, funzioni Lambda, VPC e pattern complessi che combinano più risorse.

Diagramma che illustra la struttura di AWS CDK: un'App contiene uno Stack (ad es., MyStack), che include tre construct — S3 Bucket, Lambda Function e VPC — collegati in una gerarchia dall'alto verso il basso.

Gerarchia visiva di un'app AWS CDK

CDK vs Terraform vs CloudFormation

La tabella seguente descrive le differenze tra gli strumenti disponibili in AWS per gestire l'infrastruttura.

Caratteristica

AWS CDK

Terraform

AWS CloudFormation

Supporto linguaggi

Python, TypeScript, Java, C#

HCL (dichiarativo)

YAML / JSON

Livello di astrazione

Alto (OOP + librerie)

Medio

Basso

Modularità

Forte (construct, classi)

Forte (moduli)

Debole (stack annidati)

Gestione dello stato

Gestito da CloudFormation

Gestito da Terraform (tfstate)

Gestito da CloudFormation

Multi-cloud

Solo AWS

Sì

Solo AWS

Linguaggi supportati e prerequisiti

AWS CDK supporta più linguaggi di programmazione, permettendo agli sviluppatori di scegliere quello con cui si sentono più a loro agio:

  • TypeScript
  • Python
  • Java
  • C#/.NET
  • Go

In questo tutorial ci concentreremo su Python, ma i concetti di base valgono per tutti i linguaggi supportati.

Installazione e setup

Ora che il tuo ambiente è pronto, è il momento di usare Python per creare l'impalcatura della tua prima app AWS CDK. Il comando init di CDK imposta l'intera struttura del progetto, inclusi file, directory e un ambiente virtuale, per aiutarti a iniziare velocemente.

Crea una directory di progetto

Apri il terminale ed esegui il seguente comando per creare una nuova directory e spostarti al suo interno:

mkdir cdk_datacamp && cd cdk_datacamp

Inizializza l'app CDK

cdk init sample-app --language python

Questo crea un progetto iniziale preconfigurato con un esempio di base che include:

  • Uno stack di esempio (cdk_datacamp_stack)
  • Una coda SQS sottoscritta a un topic SNS
  • Un file cdk.json che configura come viene eseguita la tua app CDK
  • Un ambiente virtuale (in .venv) per le dipendenze Python

Al termine del comando, vedrai un output simile a questo:

Output del terminale AWS CDK per l'inizializzazione di un progetto Python, con i passaggi per creare e attivare manualmente un ambiente virtuale, installare i requisiti ed eseguire cdk synth.

Impalcatura del progetto CDK in Python 

Configurazione dell'ambiente virtuale

Se il processo cdk init non crea automaticamente un ambiente virtuale, puoi farlo manualmente:

python3 -m venv .venv
source .venv/bin/activate

Una volta attivato, installa le dipendenze richieste:

pip install -r requirements.txt

Comprendere i concetti di CDK

Prima di approfondire il codice, vediamo come i componenti principali di AWS CDK — app, stack e construct — lavorano insieme nella pratica. Ora che sai cosa rappresenta ciascuno, è essenziale vedere come interagiscono per formare un'infrastruttura scalabile e modulare. 

Analizzeremo anche i diversi livelli di construct (L1, L2, L3) ed esamineremo le librerie CDK che lo rendono possibile.

App, stack e construct

Ora che conosci App, Stack e Construct dalle sezioni precedenti, capiamo come lavorano insieme in un'applicazione CDK.

Pensala come costruire una casa:

  • L'App è l'intero progetto di costruzione.
  • Ogni Stack è come un edificio o una struttura separata all'interno di quel progetto.
  • Ogni Construct è un componente, come muri, porte o impianti, che va in uno stack.

In codice, la relazione appare così:

# app.py

from aws_cdk import App
from my_project.my_stack import MyStack

# Initialize the CDK application
app = App()

# Instantiate the stack and add it to the app
MyStack(app, "MyFirstStack")

# Synthesize the CloudFormation template
app.synth()
# my_stack.py

from aws_cdk import Stack
from aws_cdk import aws_s3 as s3
from constructs import Construct

class MyStack(Stack):
    def __init__(self, scope: Construct, id: str, **kwargs) -> None:
        super().__init__(scope, id, **kwargs)

        # Define an Amazon S3 bucket with default settings
        s3.Bucket(self, "MyBucket")

Qui, l'App istanzia uno Stack, che include Construct come un bucket S3.

Capire i livelli dei construct: L1, L2 e L3

In AWS CDK, i construct sono disponibili in tre livelli di astrazione, dandoti flessibilità in base al livello di controllo o semplicità di cui hai bisogno.

Livello 1 (L1) – Construct CloudFormation

Sono i mattoni grezzi generati direttamente dalla specifica AWS CloudFormation. Ogni risorsa AWS in CloudFormation ha un equivalente construct L1 in CDK; i loro nomi iniziano sempre con "Cfn".

I construct L1 espongono ogni possibile opzione di configurazione ma non offrono astrazioni o default. Sono ideali quando ti serve controllo totale o quando usi funzionalità AWS più nuove non ancora incapsulate dai construct di livello superiore.

  • Esempio: s3.CfnBucket

Livello 2 (L2) – Construct nativi di AWS CDK

I construct L2 forniscono un'astrazione più elevata e developer-friendly rispetto ai L1. Sono componenti con opinioni e default sensati, con metodi integrati che semplificano i compiti quotidiani. Sono pensati per l'uso di tutti i giorni e riducono il boilerplate pur offrendo un buon livello di personalizzazione.

  • Esempio: s3.Bucket – Puoi creare un bucket con versioning con una sola riga di codice.

Livello 3 (L3) – Pattern di construct

I construct L3 sono astrazioni che raggruppano più risorse AWS in pattern architetturali comuni. Possono essere forniti da AWS o creati come componenti riutilizzabili dalla community o da te. Usa i construct L3 per incapsulare la complessità e riutilizzare pattern di infrastruttura tra progetti o team.

  • Esempio: aws_s3_deployment.BucketDeployment – Combina un bucket S3 e una strategia di deployment per automatizzare il caricamento degli asset.

La maggior parte degli sviluppatori parte dai construct L2 e introduce i L1 solo quando necessario. I L3 diventano utili quando il tuo progetto cresce e vuoi astrarre pattern ripetuti in componenti riutilizzabili.

Librerie e moduli CDK

Quando costruisci con AWS CDK non interagisci direttamente con CloudFormation grezzo. Usi invece le librerie modulari di CDK, che forniscono construct per servizi AWS come S3, Lambda, IAM e altri. Tutti i moduli dei servizi AWS sono inclusi nel pacchetto principale chiamato aws-cdk-lib e sono ulteriormente organizzati per servizio.

Librerie comunemente usate in Python

Di seguito alcune delle librerie (o moduli) più usate di aws-cdk-lib nei progetti Python:

  • aws_cdk.aws_s3 – Per creare bucket S3
  • aws_cdk.aws_lambda – Per definire funzioni Lambda
  • aws_cdk.aws_iam – Per gestire ruoli e permessi
  • aws_cdk.aws_dynamodb – Per lavorare con tabelle DynamoDB
  • aws_cdk.aws_ec2 – Per componenti di rete come VPC e security group
  • aws_cdk.aws_sns / aws_cdk.aws_sns_subscriptions – Per topic SNS e i loro sottoscrittori

Questi moduli vengono importati solo quando servono, mantenendo il progetto leggero e modulare.

Come importare e usare un modulo CDK

Per usare un servizio AWS specifico, importi il relativo modulo e richiami le sue classi construct. Ad esempio, per creare un bucket S3:

from aws_cdk import aws_s3 as s3

# Inside your stack
bucket = s3.Bucket(self, "MyBucket")

Questo esempio usa il construct L2 s3.Bucket, che include default integrati come opzioni di cifratura e versioning.

Se ti serve un altro servizio, importa il suo modulo allo stesso modo:

from aws_cdk import aws_lambda as lambda_
from aws_cdk import aws_iam as iam

Nota: Nel tuo requirements.txt, in genere ti servono solo:

aws-cdk-lib==2.179.0
constructs>=10.0.0,<11.0.0

Questi due pacchetti ti danno accesso a tutti i construct di AWS CDK e alle funzionalità del framework core.

Creare il tuo primo stack CDK

Dopo aver appreso il funzionamento interno di AWS CDK, puoi mettere in pratica queste conoscenze. La sezione seguente ti guida nella creazione di uno stack CDK operativo usando Python. Prima di distribuirli sul tuo account AWS, creerai una struttura di progetto tramite codice e implementerai risorse AWS reali, come bucket S3 e funzioni Lambda.

Creare l'impalcatura di un nuovo progetto

Quando esegui il comando cdk init con il flag --language python, viene configurata una struttura di progetto completa che appare più o meno così:

Vista ad albero di una directory di progetto AWS CDK con file chiave come app.py, cdk.json, requirements.txt e cartelle per il codice sorgente cdk_datacamp e tests/unit/test_cdk_datacamp_stack.py.

Struttura delle cartelle di un progetto AWS CDK in Python

Il file app.py è dove è definita l'App, e il file cdk_datacamp_stack.py è dove scrivi il codice per il tuo Stack e i Construct.

Suggerimento: Puoi rinominare il file o la classe dello stack in base allo scopo della tua app, ad esempio storage_stack.py o monitoring_stack.py.

Aggiungere risorse AWS

Ora aggiungiamo alcune risorse AWS al tuo stack CDK. Scriverai questo codice all'interno del metodo __init__() della tua classe Stack nel file cdk_datacamp_stack.py.

Bucket S3

from aws_cdk import aws_s3 as s3

# Create an S3 bucket with versioning and managed encryption
bucket = s3.Bucket(
    self,
    "MyBucket",
    versioned=True,
    encryption=s3.BucketEncryption.S3_MANAGED
)

Funzione Lambda

from aws_cdk import aws_lambda as lambda_

# Define a Lambda function using Python 3.9 runtime
lambda_function = lambda_.Function(
    self,
    "MyFunction",
    runtime=lambda_.Runtime.PYTHON_3_9,
    handler="index.handler",
    code=lambda_.Code.from_asset("lambda")  # Load code from local folder named 'lambda'
)

Distribuire lo stack

Dopo aver aggiunto le risorse, è ora di distribuirle su AWS.

Nel terminale, attiva il tuo ambiente virtuale ed esegui:

cdk deploy

Questo:

  1. Sintetizza il tuo stack in un template CloudFormation
  2. Carica quel template su AWS
  3. Esegue il provisioning delle risorse nel tuo account

Se è la prima volta che distribuisci lo stack, ti verrà chiesto di approvare le modifiche.

Dopo la distribuzione, puoi:

  1. Aprire la Console AWS
  2. Navigare al servizio relativo (ad es., S3, Lambda)
  3. Vedere le risorse che CDK ha appena creato

Lavorare con i construct di CDK

Le app AWS CDK si basano sui construct come elementi strutturali essenziali. Quando padroneggi i construct, che tu usi quelli integrati dei servizi o crei pattern riutilizzabili, il tuo codice di infrastruttura diventa più modulare, manutenibile e leggibile.

Questa sezione ti insegna a usare i construct L2 (alto livello) e a sviluppare construct personalizzati che riducono i pattern ripetitivi.

Usare i construct L2

I construct L2 sono astrazioni native di CDK più semplici da usare rispetto a CloudFormation grezzo (L1). Hanno default sensati e type safety, spesso richiedono meno righe di codice per configurare una risorsa AWS.

Perché usare i construct L2?

  • Meno boilerplate — meno campi obbligatori rispetto a L1
  • Codice Python più leggibile e idiomatico
  • Include metodi di utilità come .add_to_role_policy() o .add_event_notification()
  • Gestisce automaticamente le dipendenze tra risorse

Esempio: Creare un bucket S3 usando L2

from aws_cdk import aws_s3 as s3
# Create a versioned and encrypted S3 bucket
bucket = s3.Bucket(
    self,
    "MyBucket",
    versioned=True,
    encryption=s3.BucketEncryption.S3_MANAGED
)

L'equivalente construct L1, s3.CfnBucket, richiederebbe di impostare manualmente tutte le proprietà e definire la configurazione come dict grezzi — molto meno intuitivo.

Altri comuni construct L2 includono:

  • lambda_.Function() per AWS Lambda
  • dynamodb.Table() per DynamoDB
  • sqs.Queue() per SQS
  • sns.Topic() per SNS

Creare construct personalizzati

La tua infrastruttura crescerà con pattern ricorrenti, come la creazione di funzioni Lambda con permessi specifici e bucket S3. I construct personalizzati sono la soluzione ideale in questo scenario.

I construct personalizzati ti permettono di combinare risorse correlate in un'unica unità logica, riutilizzabile tra stack o progetti.

Quando creare un construct personalizzato:

  • Quando hai 3+ risorse sempre fornite insieme
  • Quando vuoi incapsulare logica riutilizzabile
  • Quando vuoi ridurre la duplicazione di codice tra stack

Esempio: un pattern riutilizzabile S3 + Lambda

from constructs import Construct
from aws_cdk import aws_s3 as s3, aws_lambda as lambda_
class StorageWithLambda(Construct):
    def __init__(self, scope: Construct, id: str) -> None:
        super().__init__(scope, id)
        # S3 bucket
        self.bucket = s3.Bucket(self, "MyBucket")

        # Lambda function
        self.function = lambda_.Function(
            self,
            "MyFunction",
            runtime=lambda_.Runtime.PYTHON_3_9,
            handler="index.handler",
            code=lambda_.Code.from_asset("lambda")
        )
        # Grant Lambda access to the S3 bucket
        self.bucket.grant_read_write(self.function)

Ora puoi usare questo construct in qualsiasi stack così:

from my_project.storage_with_lambda import StorageWithLambda
storage = StorageWithLambda(self, "ReusableComponent")

Prima di eseguire quanto sopra, crea una cartella chiamata lambda nella root del progetto e crea un file index.py con il seguente contenuto:

def handler(event, context):
    return {
        "statusCode": 200,
        "body": "Hello from Lambda!"
    }

Suggerimenti per la riutilizzabilità

  • Prefissa i file con construct_ o inseriscili in una cartella constructs/
  • Esporre output come self.bucket o self.function per flessibilità
  • Mantieni ogni construct focalizzato su una sola responsabilità

Test e sintesi delle app CDK

Dopo aver scritto il codice della tua infrastruttura, è essenziale verificare cosa distribuirà CDK e, idealmente, testare che i tuoi stack si comportino come previsto. AWS CDK fornisce strumenti per sintetizzare template CloudFormation e scrivere test automatizzati per intercettare misconfigurazioni prima del deployment.

Sintetizzare i template

Il comando cdk synth genera il template CloudFormation dal tuo codice CDK.

cdk synth

Quando esegui questo comando, CDK:

  • Carica la tua app (tramite app.py)
  • Risolve tutti i construct e gli stack
  • Produce template CloudFormation grezzi in YAML/JSON

Template AWS CloudFormation sintetizzato con risorse tra cui una coda SQS, una policy della coda che consente a SNS di inviare messaggi e una risorsa di sottoscrizione SNS che fa riferimento alla coda.

Template CloudFormation sintetizzato 

Per impostazione predefinita, l'output va al terminale, ma puoi anche reindirizzarlo a un file se necessario:

cdk synth > template.yaml

Questo è utile quando:

  • Vuoi ispezionare il template reale prima del deployment
  • Stai facendo il debug della struttura di uno stack
  • Condividi il template con team che non usano CDK

Testare l'infrastruttura

Anche se testare l'infrastructure as code può sembrare insolito, è molto utile, soprattutto quando i tuoi stack diventano grandi o includono logica condizionale, cicli o construct riutilizzabili.

AWS CDK offre il modulo assertions per testare gli stack sintetizzati.

Scrivere un test semplice con pytest

Ecco un test di esempio che verifica se uno specifico componente (come un bucket S3) è incluso nello stack:

# test/test_cdk_datacamp_stack.py
import aws_cdk as cdk
from aws_cdk.assertions import Template
from cdk_datacamp.cdk_datacamp_stack import CdkDatacampStack
def test_s3_bucket_created():
    app = cdk.App()
    stack = CdkDatacampStack(app, "TestStack")
    template = Template.from_stack(stack)
    # Assert that an S3 bucket exists
    template.resource_count_is("AWS::S3::Bucket", 1)

Per eseguire i test, assicurati che pytest sia installato:

pip install -U pytest

Poi esegui:

pytest

Se tutto passa, vedrai un segno di spunta verde. In caso contrario, l'output del test ti dirà cosa manca.

output di pytest su un ambiente Linux con Python 3.11.11 e pytest 8.3.5, che mostra il successo di tre casi di test con indicatori verdi e tempo di esecuzione di 2,89 secondi.      

Output di Pytest che mostra l'esecuzione riuscita di tutti i casi di test per lo stack AWS CDK

Puoi anche includere validazioni nel tuo stack CDK. I test di validazione sono controlli a runtime all'interno del tuo codice di construct o stack che convalidano gli input prima del deployment. Aiutano a intercettare misconfigurazioni o a imporre vincoli nelle prime fasi del ciclo di sviluppo.

Poniamo di voler passare il bucket_name come variabile di contesto, ma vogliamo validare che:

  • Il nome del bucket non sia vuoto
  • Rispetti le regole di naming S3 (ad es., solo minuscole)

Crea un file chiamato test/test_storage_with_lambda.py e aggiungi quanto segue:

import pytest
from aws_cdk import App, Stack
from cdk_datacamp.storage_with_lambda import StorageWithLambda

def test_missing_bucket_name():
    app = App()
    stack = Stack(app, "TestStack")

    with pytest.raises(ValueError, match="bucket_name is required"):
        StorageWithLambda(stack, "FailingConstruct", bucket_name=None)

def test_bucket_name_uppercase():
    app = App()
    stack = Stack(app, "TestStack")

    with pytest.raises(ValueError, match="must be lowercase"):
        StorageWithLambda(stack, "FailingConstruct", bucket_name="InvalidName")

 Per testare la validazione, esegui il comando seguente:

test/test_storage_with_lambda.py

output di pytest su un ambiente Linux con Python 3.11.11 e pytest 8.3.5, che mostra il successo di tre casi di test con indicatori verdi.        

Output di Pytest che mostra l'esecuzione riuscita di tutti i casi di test per lo stack AWS CDK

Quando usare i test:

  • Stai creando construct o pattern riutilizzabili.
  • L'implementazione dei test serve a stabilire requisiti tecnici standard tra i membri del team.
  • Vuoi intercettare regressioni o cambiamenti indesiderati durante il CI/CD.

Vuoi consolidare le tue conoscenze CDK in vista di un colloquio? Queste domande da colloquio su AWS DevOps possono aiutarti a prepararti.

Best practice e consigli per lavorare con AWS CDK

Dopo aver imparato a creare e distribuire stack CDK, dovresti seguire le best practice per mantenere il tuo codice di infrastruttura pulito, sicuro e scalabile. In questa sezione parleremo di come strutturare progetti grandi, gestire correttamente la sicurezza e integrare CDK nelle pipeline CI/CD.

Organizzare progetti di grandi dimensioni

Man mano che la tua app CDK cresce, diventa essenziale organizzare il codice in unità gestibili.

Usa più stack

Suddividi l'infrastruttura per ambito. Ad esempio:

  • NetworkingStack: VPC, subnet, security group
  • ComputeStack: EC2, Lambda
  • StorageStack: S3, DynamoDB

Questo ti permette di distribuire, testare o eliminare parti della tua infrastruttura in modo indipendente. Ecco come può essere incluso in app.py:

network_stack = NetworkingStack(app, "NetworkingStack")
compute_stack = ComputeStack(app, "ComputeStack")

Puoi anche passare risorse tra stack usando output o riferimenti.

Crea construct annidati riutilizzabili

Incapsula risorse correlate (come una Lambda e i suoi permessi) in un construct personalizzato, come hai fatto con StorageWithLambda. Questo migliora la leggibilità e la riutilizzabilità tra stack o app.

Usa configurazioni specifiche per ambiente

Supporta più ambienti (dev, staging, prod) usando:

  • cdk.json con valori di contesto
  • Override da CLI: cdk deploy -c env=prod
  • Logica condizionale nei tuoi stack
env = app.node.try_get_context("env")
if env == "prod":
    bucket_name = "mycompany-prod-logs"

Sicurezza e permessi

Qualsiasi progetto di infrastruttura deve dare priorità alla sicurezza durante i processi di distribuzione automatizzata con AWS CDK. La sezione seguente dimostra una gestione sicura delle risorse IAM attraverso i principi del privilegio minimo.

Definisci ruoli IAM invece di usare i default

I construct CDK, tra cui Lambda o i task ECS, creano automaticamente ruoli IAM. Anche se comodo, può limitare il controllo su permessi e naming.

Meglio definire i ruoli esplicitamente:

from aws_cdk import aws_iam as iam

execution_role = iam.Role(
    self,
    "LambdaExecutionRole",
    assumed_by=iam.ServicePrincipal("lambda.amazonaws.com"),
    description="Custom role for Lambda with least privilege",
    managed_policies=[
        iam.ManagedPolicy.from_aws_managed_policy_name("service-role/AWSLambdaBasicExecutionRole")
    ]
)

Questo ruolo consente solo il logging e nient'altro di default.

Applica il principio del privilegio minimo

Evita di usare "*" in actions o resources a meno che non sia strettamente necessario.

Esempio:

lambda_fn.add_to_role_policy(
    iam.PolicyStatement(
        actions=["*"],
        resources=["*"]
    )
)

Puoi anche usare grant specifici per risorsa quando disponibili:

bucket.grant_read(lambda_fn)

Questo genera automaticamente la policy necessaria con accesso limitato al bucket S3.

Usa policy gestite quando possibile

Le policy gestite da AWS semplificano la manutenzione e riducono la probabilità di errori.

iam.ManagedPolicy.from_aws_managed_policy_name("AmazonSQSReadOnlyAccess")

Puoi allegarle a ruoli personalizzati per servizi come ECS, Batch o Step Functions.

Integrazione CI/CD

AWS CDK offre una potenza notevole grazie alla sua capacità di integrarsi con pipeline CI/CD moderne. CDK supporta la consegna automatizzata dell'infrastruttura tramite distribuzione di codice sotto controllo versione, funzionando con GitHub, GitLab e servizi nativi AWS, tra cui CodePipeline. Il sistema riduce gli errori umani, accorcia i cicli di feedback e abilita il deployment su più ambienti.

GitHub Actions: automatizzare i deployment CDK

Puoi usare GitHub Actions per sintetizzare, confrontare, testare e distribuire gli stack CDK a ogni push o pull request.

Guarda questo .github/workflows/deploy.yml:

name: Deploy CDK App

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3

      - uses: actions/setup-python@v4
        with:
          python-version: 3.11

      - name: Install dependencies
        run: |
          pip install -r requirements.txt
          npm install -g aws-cdk

      - name: Run unit tests
        run: pytest

      - name: CDK Synth
        run: cdk synth -c environment=prod

      - name: Deploy to AWS
        run: cdk deploy --require-approval never
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}

Usa cdk diff nelle PR per visualizzare in anteprima le modifiche all'infrastruttura prima del merge.

CDK pipelines: CI/CD nativo CDK con CodePipeline

Per deployment completamente gestiti all'interno di AWS, CDK fornisce un modulo chiamato aws_cdk.pipelines, che ti consente di definire l'intera pipeline CI/CD come codice, proprio come l'infrastruttura.

Ecco un esempio semplificato:

from aws_cdk import pipelines, SecretValue, Stack
from constructs import Construct
from my_app_stage import MyAppStage  # replace with your actual stage import

class PipelineStack(Stack):
    def __init__(
        self,
        scope: Construct,
        construct_id: str,
        **kwargs
    ) -> None:
        super().__init__(scope, construct_id, **kwargs)

        # Define the source of the pipeline from a GitHub repository
        source = pipelines.CodePipelineSource.git_hub(
            repo_string="your-org/your-repo",  # GitHub org/repo
            branch="main",
            authentication=SecretValue.secrets_manager("GITHUB_TOKEN")
        )

        # Define the CodePipeline and its synthesis step
        pipeline = pipelines.CodePipeline(
            self,
            "MyAppPipeline",
            synth=pipelines.ShellStep(
                "Synth",
                input=source,
                commands=[
                    "pip install -r requirements.txt",
                    "npm install -g aws-cdk",
                    "cdk synth"
                ]
            )
        )

        # Add an application stage (e.g., production deployment)
        pipeline.add_stage(
            MyAppStage(self, "ProdStage")
        )

Nel codice sopra:

  • SecretValue.secrets_manager("GITHUB_TOKEN") recupera in modo sicuro il tuo token GitHub da Secrets Manager.
  • MyAppStage dovrebbe essere una classe che estende Stage e incapsula i tuoi stack CDK reali.

Se stai distribuendo sistemi di machine learning, l'integrazione di CDK con pratiche di continuous deployment è trattata nel nostro corso CI/CD for Machine Learning.

Conclusione

Questo tutorial ti ha mostrato come costruire e distribuire infrastruttura cloud in Python tramite le operazioni di AWS Cloud Development Kit (CDK). Hai imparato a:

  • Creare il tuo primo stack CDK.
  • Definire e validare bucket S3 e funzioni Lambda come risorse.
  • Organizzare un progetto tramite construct personalizzati e pattern multi-stack.
  • Applicare best practice di sicurezza secondo il principio del privilegio minimo.
  • Automatizzare i deployment combinando GitHub Actions con CDK Pipelines.
  • Scrivere test per validare la logica della tua infrastruttura.

Ora che hai distribuito la tua prima app CDK, ecco alcuni modi per fare un salto di qualità:

  • Usa ambienti parametrizzati per dev/staging/prod
  • Aggiungi CloudWatch Alarms, API Gateway o Step Functions
  • Esplora construct CDK come aws_s3_deployment, aws_ecs_patterns e cdk.pipelines
  • Converte i tuoi construct in una libreria Python interna per la riutilizzabilità

Per continuare a imparare e costruire, da' un'occhiata al corso Introduction to AWS Boto in Python!

FAQ

Che cos'è AWS CDK e in cosa è diverso da CloudFormation o Terraform?

AWS CDK ti permette di definire l'infrastruttura cloud usando linguaggi di programmazione come Python, mentre CloudFormation e Terraform si basano su JSON/YAML o HCL. CDK offre un livello di astrazione superiore e riusabilità tramite i construct.

Devo conoscere CloudFormation per usare AWS CDK?

No, CDK astrae gran parte della complessità di CloudFormation. Tuttavia, conoscere CloudFormation aiuta quando usi construct di livello inferiore o durante il troubleshooting dei deployment.

Posso distribuire più ambienti (ad es., dev, prod) con AWS CDK?

Sì! CDK supporta configurazioni specifiche per ambiente usando valori di contesto e flag da CLI come cdk deploy -c env=prod.

Come testo il mio codice di infrastruttura CDK?

Puoi usare pytest insieme alle assertions di CDK e al modulo template per scrivere unit test che verificano le risorse e le configurazioni del tuo stack prima del deployment.

Cosa succede dietro le quinte quando eseguo cdk deploy?

cdk deploy sintetizza il tuo codice Python in un template CloudFormation, lo carica su AWS e effettua il provisioning delle risorse definite nel tuo account.


Rahul Sharma's photo
Author
Rahul Sharma
LinkedIn
Twitter

Rahul Sharma è un AWS Ambassador, DevOps Architect e blogger tecnico specializzato in cloud computing, pratiche DevOps e tecnologie open source. Con esperienza in AWS, Kubernetes e Terraform, semplifica concetti complessi per chi studia e per i professionisti attraverso articoli e tutorial coinvolgenti. Rahul è appassionato di risolvere le sfide DevOps e di condividere idee per dare forza alla community tech.

Argomenti
AWS
Cloud

Scopri di più su AWS con questi corsi!

{count, plural, one {Corso} other {Corsi}}

Concetti di AWS

{hours} ore
53K
Scopri il mondo di Amazon Web Services (AWS) e capisci perché è al top nel cloud computing.
Vedi i dettagliRight Arrow
Inizia Il Corso
Mostra altroRight Arrow
Correlato

{count, plural, one {blog} other {blogs}}

Che cos'è Snowflake? Guida per principianti alla piattaforma dati cloud

Esplora le basi di Snowflake, la piattaforma dati cloud. Scopri la sua architettura, le sue funzionalità e come integrarla nelle tue pipeline di dati.
Tim Lu's photo

Tim Lu

12 min

{count, plural, one {blog} other {blogs}}

I 15 migliori server MCP remoti che ogni AI builder dovrebbe conoscere nel 2026

Scopri i 15 migliori server MCP remoti che stanno trasformando lo sviluppo AI nel 2026. Scopri come migliorano automazione, ragionamento, sicurezza e velocità dei workflow.
Abid Ali Awan's photo

Abid Ali Awan

15 min

{count, plural, one {blog} other {blogs}}

Tokenizzazione nel NLP: come funziona, sfide e casi d'uso

Guida al preprocessing NLP nel machine learning. Copriamo spaCy, i transformer di Hugging Face e come funziona la tokenizzazione in casi d'uso reali.
Abid Ali Awan's photo

Abid Ali Awan

10 min

Mostra AltroMostra Altro