Ga naar hoofdinhoud

Bouw je eerste AWS CDK-stack: een beginnersvriendelijke tutorial

Leer hoe je je eerste AWS CDK-stack bouwt en uitrolt met Python. Deze beginnersvriendelijke gids behandelt setup, constructs, deployment, testen en CI/CD.
· 15 min lezen

Verken met AI

Cloudinfrastructuur beheren met ruwe JSON- of YAML-templates kan tijdrovend en foutgevoelig zijn. De AWS Cloud Development Kit (CDK) verandert dat door je cloudresources te laten definiëren met moderne programmeertalen zoals Python, TypeScript, Java en C#.

Met CDK wordt infrastructuur code die herbruikbaar, testbaar en versiebeheerbaar is. Het stelt je in staat te denken als een developer, zelfs bij het inrichten van complexe cloudsystemen.

In deze tutorial leer je hoe je een AWS CDK-project opzet met Python. We lopen door het proces van het schrijven van je eerste stack, het toevoegen van een essentiële AWS-resource en het uitrollen naar je AWS-account. Aan het eind snap je duidelijk hoe CDK werkt en hoe je het gebruikt om infrastructuur op een developer-vriendelijke manier, met code, te beheren.

Wil je de achterliggende principes van tools zoals AWS CDK beter begrijpen? Verken dan de basis in onze cursus DevOps Concepts.

Vereisten

Voordat we in code duiken met AWS CDK, zorg dat je omgeving goed is ingesteld. Dit heb je nodig:

AWS-account om te experimenteren

Je hebt toegang tot een AWS-account nodig om de applicatie te deployen die we gaan bouwen. Als je systeem al is geconfigureerd met inloggegevens voor een gebruiker met administratorrechten, kun je dit overslaan.

Als je nog geen AWS-account hebt, maak er hier een aan.

Voor een gestructureerd leerpad met AWS-basisprincipes is de AWS Cloud Practitioner-track een uitstekend startpunt.

Administratorgebruiker

Je hebt een gebruiker nodig met programmatische toegang en volledige permissies om mee te doen.

  1. Log in op je AWS-account.
  2. Open de IAM-console.
  3. Maak een nieuwe gebruiker — je kunt hem bijvoorbeeld “datacamp-cdk” noemen
  4. Selecteer Programmatic access.
  5. Klik op Next: Permissions.
  6. Kies Attach existing policies directly en vink AdministratorAccess aan.
  7. Klik door Next: Tags, Next: Review en vervolgens Create User.

Noteer op het laatste scherm je Access key ID en Secret access key. Die heb je in de volgende stap nodig.

Je AWS-inloggegevens configureren

Open een terminal en voer uit:

aws configure

Je wordt gevraagd de inloggegevens uit de IAM-console in te voeren:

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]: 

Kies een IDE voor development

Met de AWS CDK kunnen developers werken in een volledige programmeeromgeving in plaats van met YAML- of JSON-templates. Deze volwaardige omgeving laat je je favoriete IDE gebruiken, met voordelen zoals codecompletion, realtime linting en refactoringtools voor efficiënt beheer van infrastructuurcode.

Voor de beste ontwikkelervaring met de Python-CDK raad ik een IDE aan die het volgende ondersteunt:

  • Syntaxiskleuring
  • Codecompletion
  • Intelligente navigatie en suggesties
  • Ondersteuning voor virtual environments

Installeer Python en pip

Om AWS CDK met Python te gebruiken, heb je Python versie 3.8 of hoger nodig op je systeem. Als je dat nog niet hebt, download dan de nieuwste versie via de officiële Python-website.

Als je Windows gebruikt, zorg dan dat Python is toegevoegd aan de PATH-omgevingsvariabele van je systeem. Om te controleren open je een terminal of command prompt en voer je uit:

python --version

Als je een foutmelding als “command not found” ziet, staat Python waarschijnlijk niet in je PATH. De eenvoudigste oplossing is het vakje “Add Python 3.x to PATH” aan te vinken tijdens de installatie.

Je hebt ook pip nodig, de Python package installer, om later AWS CDK-afhankelijkheden te installeren. De meeste moderne Python-distributies worden geleverd met pip.

pip --version

Als het niet is geïnstalleerd, volg dan de officiële pip-installatiegids.

Aan de slag met AWS CDK

Voordat we code schrijven, is het belangrijk te begrijpen wat AWS CDK is, waarom het bestaat en hoe het past binnen de bredere wereld van infrastructure as code (IaC). In deze sectie maak je kennis met de kernconcepten achter CDK en zie je hoe het zich verhoudt tot andere populaire IaC-tools.

Wat is AWS CDK en waarom wordt het gebruikt?

AWS Cloud Development Kit (CDK) is een open-source framework waarmee je cloudinfrastructuur kunt creëren via bekende programmeertalen, waaronder Python, TypeScript, Java en C#. 

Met de CDK genereer je CloudFormation-templates programmatisch met echte code in plaats van handmatig JSON- of YAML-templates te schrijven.

Dit betekent dat je kunt:

  • Logica hergebruiken met lussen en functies.
  • Je infrastructuur organiseren met modules en klassen.
  • Profiteren van tools in je IDE voor codecompletion, foutcontrole en refactoring.

In de kern draait de CDK om drie hoofdconcepten:

  • App – Het startpunt van je CDK-project. Kan één of meerdere stacks bevatten.
  • Stack – Een deploymenteenheid die overeenkomt met een CloudFormation-stack. Elke stack definieert een set resources die worden aangemaakt.
  • Construct – De bouwsteen van CDK. Constructs vertegenwoordigen cloudcomponenten zoals S3-buckets, Lambda-functies, VPC's, en complexe patronen die meerdere resources combineren.

Diagram waarin de AWS CDK-structuur wordt geïllustreerd: een App bevat een Stack (bijv. MyStack) met drie constructs—S3 Bucket, Lambda Function en VPC—verbonden in een top-down hiërarchie.

Visuele hiërarchie van een AWS CDK-app

CDK vs Terraform vs CloudFormation

De onderstaande tabel beschrijft de verschillen tussen de tools die in AWS beschikbaar zijn om infrastructuur te beheren.

Functie

AWS CDK

Terraform

AWS CloudFormation

Taalondersteuning

Python, TypeScript, Java, C#

HCL (declaratief)

YAML / JSON

Abstractieniveau

Hoog (OOP + libraries)

Middel

Laag

Modulariteit

Sterk (constructs, klassen)

Sterk (modules)

Zwak (geneste stacks)

Statebeheer

Afgehandeld door CloudFormation

Afgehandeld door Terraform (tfstate)

Afgehandeld door CloudFormation

Multi-cloud

Alleen AWS

Ja

Alleen AWS

Ondersteunde talen en vereisten

De AWS CDK ondersteunt meerdere programmeertalen, zodat developers kunnen kiezen waar ze het meest vertrouwd mee zijn:

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

In deze tutorial focussen we op Python, maar de kernconcepten gelden voor alle ondersteunde talen.

Installatie en setup

Nu je omgeving klaar is, is het tijd om met Python je eerste AWS CDK-app te scaffolden. Het CDK-commando init zet de volledige projectstructuur op, inclusief bestanden, mappen en een virtual environment, zodat je snel aan de slag kunt.

Maak een projectmap

Open je terminal en voer het volgende commando uit om een nieuwe map te maken en erin te navigeren:

mkdir cdk_datacamp && cd cdk_datacamp

Initialiseer de CDK-app

cdk init sample-app --language python

Dit maakt een starterproject met een basisvoorbeeld dat onder meer bevat:

  • Een voorbeeldstack (cdk_datacamp_stack)
  • Een SQS-queue geabonneerd op een SNS-topic
  • Een cdk.json-bestand dat configureert hoe je CDK-app draait
  • Een virtual environment (in .venv) voor Python-afhankelijkheden

Wanneer het commando klaar is, zie je output vergelijkbaar met dit:

AWS CDK-terminaloutput voor het initialiseren van een Pythonproject, inclusief stappen om handmatig een virtual environment te maken en te activeren, requirements te installeren en cdk synth te draaien.

CDK Python-project scaffold 

Virtual environment instellen

Als het cdk init-proces niet automatisch een virtual environment maakt, kun je dat handmatig doen:

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

Zodra deze is geactiveerd, installeer je de vereiste dependencies:

pip install -r requirements.txt

CDK-concepten begrijpen

Voordat we dieper in de code duiken, bekijken we hoe de kerncomponenten van AWS CDK—apps, stacks en constructs—in de praktijk samenwerken. Nu je weet wat elk onderdeel is, is het belangrijk te zien hoe ze interacteren om een schaalbare, modulaire infrastructuur te vormen. 

We lichten ook de verschillende constructniveaus (L1, L2, L3) toe en bekijken de CDK-libraries die dit mogelijk maken.

Apps, stacks en constructs

Nu je uit de vorige secties weet wat App, Stack en Construct zijn, bekijken we hoe ze samenwerken in een CDK-applicatie.

Denk aan het bouwen van een huis:

  • De App is het totale bouwproject.
  • Elke Stack is als een apart gebouw of onderdeel binnen dat project.
  • Elk Construct is een component, zoals muren, deuren of leidingen, die in een stack gaan.

In code ziet de relatie er zo uit:

# 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")

Hier instantieert de App een Stack, die Constructs bevat zoals een S3-bucket.

Constructniveaus begrijpen: L1, L2 en L3

In AWS CDK bestaan constructs op drie abstractieniveaus, zodat je flexibiliteit hebt afhankelijk van de gewenste controle of eenvoud.

Niveau 1 (L1) – CloudFormation-constructs

Dit zijn de ruwe bouwstenen die rechtstreeks worden gegenereerd uit de AWS CloudFormation-specificatie. Elke AWS-resource in CloudFormation heeft een equivalent L1-construct in CDK; hun namen beginnen altijd met “Cfn”.

L1-constructs bieden elke mogelijke configuratieoptie maar geen abstracties of defaults. Ze zijn ideaal als je volledige controle nodig hebt of nieuwere AWS-functies wilt gebruiken die nog niet in hogere niveaus zijn verpakt.

  • Voorbeeld: s3.CfnBucket

Niveau 2 (L2) – AWS CDK-native constructs

L2-constructs bieden een hoger, developer-vriendelijk abstractieniveau bovenop L1-constructs. Het zijn opiniërende componenten met zinnige defaults en ingebouwde methoden die alledaagse taken vereenvoudigen. Ze zijn ontworpen voor dagelijks gebruik en verminderen boilerplate, terwijl ze toch veel maatwerk toelaten.

  • Voorbeeld: s3.Bucket – Je maakt een versioned bucket met slechts één regel code.

Niveau 3 (L3) – Patroonconstructs

L3-constructs zijn abstracties die meerdere AWS-resources bundelen tot gangbare architectuurpatronen. Ze kunnen door AWS worden aangeboden of als herbruikbare componenten door de community of door jou worden gebouwd. Gebruik L3-constructs om complexiteit te kapselen en infrastructuurpatronen te hergebruiken over projecten of teams heen.

  • Voorbeeld: aws_s3_deployment.BucketDeployment – Combineert een S3-bucket en een deploymentstrategie om uploads van assets te automatiseren.

De meeste developers beginnen met L2-constructs en gebruiken L1 alleen wanneer nodig. L3 wordt handig naarmate je project groeit en je terugkerende patronen wilt abstraheren in herbruikbare componenten.

CDK-libraries en modules

Je werkt niet rechtstreeks met ruwe CloudFormation wanneer je met AWS CDK bouwt. In plaats daarvan gebruik je de modulaire libraries van CDK, die constructs bieden voor AWS-services zoals S3, Lambda, IAM en meer. Alle AWS-servicemodules zijn gebundeld onder het kernpakket aws-cdk-lib en zijn verder per service georganiseerd.

Veelgebruikte libraries in Python

Hieronder staan enkele van de meest gebruikte libraries (of modules) uit aws-cdk-lib in Python-projecten:

  • aws_cdk.aws_s3 – Voor het maken van S3-buckets
  • aws_cdk.aws_lambda – Voor het definiëren van Lambda-functies
  • aws_cdk.aws_iam – Voor het beheren van rollen en permissies
  • aws_cdk.aws_dynamodb – Voor het werken met DynamoDB-tabellen
  • aws_cdk.aws_ec2 – Voor netwerkcomponenten zoals VPC's en security groups
  • aws_cdk.aws_sns / aws_cdk.aws_sns_subscriptions – Voor SNS-topics en hun subscribers

Deze modules importeer je alleen wanneer nodig, zodat je project lichtgewicht en modulair blijft.

Hoe importeer en gebruik je een CDK-module

Om een specifieke AWS-service te gebruiken, importeer je de module en roep je de constructklassen aan. Bijvoorbeeld, om een S3-bucket te maken:

from aws_cdk import aws_s3 as s3

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

Dit voorbeeld gebruikt het L2-construct s3.Bucket, dat ingebouwde defaults bevat zoals opties voor encryptie en versiebeheer.

Als je een andere service nodig hebt, importeer je de module op dezelfde manier:

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

Let op: in je requirements.txt heb je meestal alleen nodig:

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

Met deze twee packages heb je toegang tot alle AWS CDK-constructs en de kernfunctionaliteit van het framework.

Je eerste CDK-stack maken

Na de interne werking van AWS CDK te hebben geleerd, kun je deze kennis toepassen. In de volgende sectie bouw je een werkende CDK-stack met Python. Je maakt via code een projectstructuur en implementeert echte AWS-resources, zoals S3-buckets en Lambda-functies, voordat je ze naar je AWS-account deployt.

Een nieuw project scaffolden

Wanneer je het commando cdk init met de vlag --language python draait, zet het een volledige projectstructuur op die er ongeveer zo uitziet:

Boomweergave van een AWS CDK-projectmap met sleutelbestanden zoals app.py, cdk.json, requirements.txt en mappen voor cdk_datacamp-broncode en tests/unit/test_cdk_datacamp_stack.py.

Mapstructuur van een AWS CDK Python-project

Het bestand app.py is waar de App is gedefinieerd, en in cdk_datacamp_stack.py schrijf je de code voor je Stack en Constructs.

Tip: Je kunt het stackbestand of de klasse hernoemen zodat het past bij het doel van je app, zoals storage_stack.py of monitoring_stack.py.

AWS-resources toevoegen

Laten we nu enkele AWS-resources aan je CDK-stack toevoegen. Je schrijft dit binnen de __init__()-methode van je Stack-klasse in het bestand cdk_datacamp_stack.py.

S3-bucket

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
)

Lambda-functie

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'
)

De stack deployen

Zodra je resources zijn toegevoegd, is het tijd om ze naar AWS te deployen.

Activeer in je terminal je virtual environment en voer uit:

cdk deploy

Dit zal het volgende doen:

  1. Je stack synthesen tot een CloudFormation-template
  2. Die template uploaden naar AWS
  3. De resources in je account provisioneren

Als je de stack voor het eerst deployt, word je gevraagd de wijzigingen goed te keuren.

Na de deployment kun je:

  1. De AWS-console openen
  2. Naar de betreffende service navigeren (bijv. S3, Lambda)
  3. De resources bekijken die CDK zojuist heeft aangemaakt

Werken met CDK-constructs

AWS CDK-apps steunen op constructs als essentiële bouwelementen. Je infrastructuurcode wordt modularer, onderhoudbaarder en leesbaarder wanneer je constructs beheerst, of je nu ingebouwde serviceconstructs gebruikt of je eigen herbruikbare patronen maakt.

In deze sectie leer je L2 (high-level) constructs gebruiken en hoe je custom constructs ontwikkelt die repetitieve patronen verminderen.

L2-constructs gebruiken

L2-constructs zijn CDK-native abstracties die eenvoudiger te gebruiken zijn dan ruwe CloudFormation (L1). Ze hebben zinnige defaults en typeveiligheid en vereisen vaak minder regels code om een AWS-resource op te zetten.

Waarom L2-constructs gebruiken?

  • Minder boilerplate — minder verplichte velden vergeleken met L1
  • Leesbaardere en idiomatische Python-code
  • Bevat hulpmethoden zoals .add_to_role_policy() of .add_event_notification()
  • Beheert automatisch afhankelijkheden tussen resources

Voorbeeld: een S3-bucket maken met 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
)

Het equivalente L1-construct, s3.CfnBucket, zou alle eigenschappen handmatig moeten instellen en configuratie als ruwe dicts moeten definiëren—veel minder intuïtief.

Andere veelvoorkomende L2-constructs zijn onder meer:

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

Custom constructs maken

Je infrastructuur groeit met terugkerende patronen, zoals het maken van Lambda-functies met bepaalde permissies en S3-buckets. Custom constructs zijn de ideale oplossing voor dit specifieke scenario.

Custom constructs laten je gerelateerde resources combineren tot één logische eenheid die je kunt hergebruiken over stacks of projecten heen.

Wanneer maak je een custom construct:

  • Wanneer je 3+ resources hebt die altijd samen worden geprovisioneerd
  • Wanneer je herbruikbare logica wilt inkapselen
  • Wanneer je code-duplicatie over stacks wilt verminderen

Voorbeeld: een herbruikbaar S3 + Lambda-patroon

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)

Je kunt dit construct nu in elke stack als volgt gebruiken:

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

Maak, voordat je het bovenstaande draait, in de projectroot een map lambda en maak een bestand index.py met de volgende inhoud:

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

Tips voor hergebruik

  • Voorzie bestanden van het prefix construct_ of plaats ze in een map constructs/
  • Stel outputs bloot zoals self.bucket of self.function voor flexibiliteit
  • Houd elk construct gefocust op één verantwoordelijkheid

CDK-apps testen en synthetiseren

Na het schrijven van je infrastructuurcode is het essentieel te controleren wat de CDK gaat deployen en idealiter te testen dat je stacks zich naar verwachting gedragen. De AWS CDK biedt tools om CloudFormation-templates te synthetiseren en geautomatiseerde tests te schrijven om misconfiguraties vóór deployment op te vangen.

Templates synthetiseren

Het commando cdk synth genereert de CloudFormation-template uit je CDK-code.

cdk synth

Wanneer je dit draait, doet CDK het volgende:

  • Laadt je app (via app.py)
  • Resolvet alle constructs en stacks
  • Geeft ruwe YAML/JSON CloudFormation-templates als output

gesynthetiseerde AWS CloudFormation-template met resources, waaronder een SQS-queue, queue-policy die SNS toestaat berichten te sturen, en een SNS-subscription-resource die naar de queue verwijst.

Gesynthetiseerde CloudFormation-template 

Standaard gaat de output naar je terminal, maar je kunt desgewenst ook naar een bestand schrijven:

cdk synth > template.yaml

Dit is handig wanneer:

  • Je de daadwerkelijke template wilt inspecteren vóór deployment
  • Je de structuur van een stack debugt
  • Je de template wilt delen met teams die geen CDK gebruiken

Infrastructuur testen

Hoewel infrastructuur als code testen ongebruikelijk kan klinken, is het erg nuttig, vooral wanneer je stacks groot worden of conditionele logica, lussen of herbruikbare constructs bevatten.

De AWS CDK biedt de assertions-module om gesynthetiseerde stacks te testen.

Een eenvoudige test schrijven met pytest

Hier is een voorbeeldtest die controleert of een specifieke resource (zoals een S3-bucket) in de stack is opgenomen:

# 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)

Om de tests uit te voeren, zorg dat pytest is geïnstalleerd:

pip install -U pytest

Draai vervolgens:

pytest

Als alles slaagt, zie je een groen vinkje. Zo niet, dan vertelt de testoutput je wat er ontbreekt.

pytest-output op een Linux-omgeving met Python 3.11.11 en pytest 8.3.5, die laat zien dat alle drie de testcases zijn geslaagd met groene indicatoren en een uitvoeringstijd van 2,89 seconden.      

Pytest-output die het succesvol uitvoeren van alle testcases voor de AWS CDK-stack toont

Je kunt ook validatie opnemen in je CDK-stack. Validatietests zijn runtimecontroles binnen je construct- of stackcode die invoer valideren voordat deployment plaatsvindt. Ze helpen misconfiguraties vroeg in de ontwikkelcyclus op te vangen of beperkingen af te dwingen.

Stel dat we de bucket_name als contextvariabele willen doorgeven, maar we willen valideren dat:

  • De bucketnaam niet leeg is
  • Hij voldoet aan S3-naamregels (bijv. alleen lowercase)

Maak een bestand genaamd test/test_storage_with_lambda.py en voeg het volgende toe:

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

 Om de validatie te testen, voer je onderstaand commando uit:

test/test_storage_with_lambda.py

pytest-output op een Linux-omgeving met Python 3.11.11 en pytest 8.3.5, die laat zien dat alle drie de testcases zijn geslaagd met groene indicatoren.        

Pytest-output die het succesvol uitvoeren van alle testcases voor de AWS CDK-stack toont

Wanneer testen gebruiken:

  • Je herbruikbare constructs of patronen maakt.
  • Het implementeren van tests dient om standaard technische vereisten onder teamleden vast te leggen.
  • Je regressies of onbedoelde wijzigingen tijdens CI/CD wilt opvangen.

Wil je je CDK-kennis versterken in een interviewsetting? Deze top AWS DevOps-interviewvragen helpen je voorbereiden.

Best practices en tips voor werken met de AWS CDK

Nadat je het maken en deployen van CDK-stacks onder de knie hebt, is het goed om best practices te volgen om je infrastructuurcode schoon, veilig en schaalbaar te houden. In deze sectie bespreken we hoe je grote projecten structureert, security goed aanpakt en CDK integreert in CI/CD-pijplijnen.

Grote projecten organiseren

Naarmate je CDK-app groeit, wordt het essentieel om code op te delen in beheersbare eenheden.

Gebruik meerdere stacks

Splits je infrastructuur op per aandachtsgebied. Bijvoorbeeld:

  • NetworkingStack: VPC's, subnets, security groups
  • ComputeStack: EC2, Lambda
  • StorageStack: S3, DynamoDB

Dit laat je delen van je infrastructuur onafhankelijk deployen, testen of vernietigen. Zo kun je het opnemen in app.py:

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

Je kunt ook resources tussen stacks doorgeven met outputs of referenties.

Maak herbruikbare geneste constructs

Kapsel gerelateerde resources (zoals een Lambda en de permissies) in een custom construct, zoals je deed met StorageWithLambda. Dit verbetert de leesbaarheid en herbruikbaarheid over stacks of apps heen.

Gebruik omgevingsspecifieke configuratie

Ondersteun meerdere omgevingen (dev, staging, prod) met:

  • cdk.json met contextwaarden
  • CLI-overrides: cdk deploy -c env=prod
  • Conditionele logica in je stacks
env = app.node.try_get_context("env")
if env == "prod":
    bucket_name = "mycompany-prod-logs"

Beveiliging en permissies

In elk infrastructuurproject moet security prioriteit krijgen tijdens geautomatiseerde deployments met AWS CDK. In de volgende sectie zie je hoe je IAM-resources veilig beheert met het principe van minimale privileges.

Definieer IAM-rollen in plaats van defaults te gebruiken

CDK-constructs, waaronder Lambda of ECS-taken, maken automatisch IAM-rollen aan. Hoewel dit handig is, kan het je controle over permissies en naamgeving beperken.

Definieer in plaats daarvan rollen expliciet:

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")
    ]
)

Deze rol staat standaard alleen logging toe en verder niets.

Pas het principe van minimale privileges toe

Vermijd het gebruik van "*" in actions of resources, tenzij het echt niet anders kan.

Voorbeeld:

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

Gebruik ook waar mogelijk resource-specifieke grants:

bucket.grant_read(lambda_fn)

Dit genereert automatisch het benodigde beleid met beperkt toegangsbereik tot de S3-bucket.

Gebruik beheerde policies waar mogelijk

Door AWS beheerde policies vereenvoudigen het onderhoud en verkleinen de kans op fouten.

iam.ManagedPolicy.from_aws_managed_policy_name("AmazonSQSReadOnlyAccess")

Je kunt deze koppelen aan custom rollen voor services zoals ECS, Batch of Step Functions.

CI/CD-integratie

De AWS CDK wordt extra krachtig door integratie met moderne CI/CD-pijplijnen. CDK ondersteunt geautomatiseerde infrastructuurlevering via versiebeheerde codedeployments, die werken met GitHub, GitLab en AWS-native services zoals CodePipeline. Dit vermindert menselijke fouten, verkort feedbackcycli en maakt deployment over meerdere omgevingen mogelijk.

GitHub Actions: CDK-deployments automatiseren

Je kunt GitHub Actions gebruiken om CDK-stacks te synthetiseren, diffen, testen en deployen bij elke push of pull request.

Bekijk deze .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 }}

Gebruik cdk diff in PR's om infraveranderingen te bekijken vóór het mergen.

CDK-pipelines: Native CDK CI/CD met CodePipeline

Voor volledig beheerde deployments binnen AWS biedt CDK een module genaamd aws_cdk.pipelines, waarmee je je volledige CI/CD-pipeline als code kunt definiëren, net als infrastructuur.

Hier is een vereenvoudigd voorbeeld:

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

In de bovenstaande code:

  • SecretValue.secrets_manager("GITHUB_TOKEN") haalt je GitHub-token veilig op uit Secrets Manager.
  • MyAppStage moet een klasse zijn die Stage uitbreidt en je daadwerkelijke CDK-stacks omhult.

Als je ML-systemen deployt, wordt het integreren van CDK met continuous deployment-praktijken behandeld in onze cursus CI/CD for Machine Learning.

Conclusie

Deze tutorial liet je zien hoe je cloudinfrastructuur in Python opzet en deployt met AWS Cloud Development Kit (CDK). Je hebt geleerd om:

  • Je eerste CDK-stack te maken.
  • S3-buckets en Lambda-functies als resources te definiëren en te valideren.
  • Een project te organiseren met custom constructs en multi-stackpatronen.
  • Security-best practices toe te passen met het principe van minimale privileges.
  • Deployments te automatiseren door GitHub Actions te combineren met CDK Pipelines.
  • Tests te schrijven om je infrastructuurlogica te valideren.

Nu je je eerste CDK-app hebt gedeployd, zijn dit een paar manieren om verder te groeien:

  • Gebruik geparametriseerde omgevingen voor dev/staging/prod
  • Voeg CloudWatch-alarms, API Gateway of Step Functions toe
  • Verken CDK-constructs zoals aws_s3_deployment, aws_ecs_patterns en cdk.pipelines
  • Zet je constructs om in een interne Python-library voor hergebruik

Blijf leren en bouwen: bekijk de cursus Introduction to AWS Boto in Python!

FAQs

Wat is AWS CDK en hoe verschilt het van CloudFormation of Terraform?

Met AWS CDK definieer je cloudinfrastructuur met programmeertalen zoals Python, terwijl CloudFormation en Terraform vertrouwen op JSON/YAML of HCL. CDK biedt hogere abstractie en herbruikbaarheid via constructs.

Moet ik CloudFormation kennen om AWS CDK te gebruiken?

Nee, CDK abstraheert het meeste van de complexiteit van CloudFormation. Inzicht in CloudFormation helpt echter bij het gebruik van lower-level constructs of het troubleshooten van deployments.

Kan ik meerdere omgevingen (bijv. dev, prod) deployen met AWS CDK?

Ja! CDK ondersteunt omgevingsspecifieke configuratie met contextwaarden en CLI-flags zoals cdk deploy -c env=prod.

Hoe test ik mijn CDK-infrastructuurcode?

Je kunt pytest gebruiken, samen met CDK's assertions en de template-module, om unittests te schrijven die de resources en configuraties van je stack verifiëren vóór deployment.

Wat gebeurt er achter de schermen wanneer ik cdk deploy draai?

cdk deploy synthetiseert je Python-code naar een CloudFormation-template, uploadt deze naar AWS en provisioneert de gedefinieerde resources in je account.

Rahul Sharma

Auteur

Rahul Sharma

Rahul Sharma is een AWS Ambassador, DevOps-architect en technisch blogger, gespecialiseerd in cloudcomputing, DevOps-praktijken en open-sourcetechnologieën. Met expertise in AWS, Kubernetes en Terraform maakt hij complexe concepten eenvoudiger voor zowel studenten als professionals via boeiende artikelen en tutorials. Rahul is gepassioneerd over het oplossen van DevOps-uitdagingen en het delen van inzichten om de techcommunity te versterken.

Onderwerpen

Gerelateerd