Kurs
Die Verwaltung der Cloud-Infrastruktur mit rohen JSON- oder YAML-Vorlagen kann mühsam und fehleranfällig sein. Das AWS Cloud Development Kit (CDK) ändert das, indem es dir ermöglicht, Cloud-Ressourcen mit modernen Programmiersprachen wie Python, TypeScript, Java und C# zu definieren.
Mit CDK wird die Infrastruktur zu wiederverwendbarem, testbarem und versionskontrolliertem Code. Sie ermöglicht es dir, auch bei der Bereitstellung komplexer Cloud-Systeme wie ein Entwickler zu denken.
In diesem Lernprogramm lernst du, wie du ein AWS CDK-Projekt mit Python einrichtest. Wir gehen durch den Prozess, wie du deinen ersten Stack schreibst, eine wichtige AWS-Ressource hinzufügst und ihn in deinem AWS-Konto bereitstellst. Am Ende wirst du genau verstehen, wie CDK funktioniert und wie du es nutzen kannst, um die Infrastruktur auf eine entwicklerfreundliche Art und Weise mit Code zu verwalten.
Um die Praktiken hinter Tools wie AWS CDK besser zu verstehen, solltest du die grundlegenden Prinzipien in unserem Kurs DevOps-Konzepte kennenlernen.
Voraussetzungen
Bevor wir mit dem Schreiben von Code mit AWS CDK beginnen, solltest du sicherstellen, dass deine Umgebung richtig eingerichtet ist. Das wirst du brauchen:
AWS-Konto zum Experimentieren
Du brauchst Zugang zu einem AWS-Konto, um die Anwendung, die wir erstellen werden, bereitzustellen. Wenn dein System bereits mit den Anmeldeinformationen für einen Administrator konfiguriert ist, kannst du den Schritt überspringen.
Wenn dunoch kein AWS-Konto hast, kannst du es hier erstellen.
Für einen strukturierten Lernpfad, der die AWS-Grundlagen abdeckt, ist der AWS Cloud Practitioner Track ein hervorragender Einstieg.
Administrator Benutzer
Du brauchst einen Benutzer mit programmatischem Zugriff und vollen Rechten, um mitzumachen.
- Melde dich bei deinem AWS-Konto an.
- Öffne die IAM-Konsole.
- Erstelle einen neuen Benutzer - du kannst ihn z.B. "datacamp-cdk" nennen.
- Wähle Programmatischer Zugang.
- Klicke auf Weiter: Erlaubnisse.
- Wähle Vorhandene Richtlinien direkt anhängen und markiere AdministratorZugang.
- Klicke dich durch Weiter: Tags,Weiter: Überprüfe und dann Benutzer erstellen.
Auf dem letzten Bildschirm notierst du dir deine Zugangsschlüssel-ID und deinen geheimen Zugangsschlüssel. Du brauchst sie im nächsten Schritt.
Konfiguriere deine AWS-Anmeldeinformationen
Öffne ein Terminal und führe es aus:
aws configure
Du wirst aufgefordert, die Anmeldedaten von der IAM-Konsole einzugeben:
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]:
Wähle eine IDE für die Entwicklung
Das AWS CDK ermöglicht es Entwicklern, in einer vollständigen Programmierumgebung zu arbeiten, anstatt mit YAML- oder JSON-Vorlagen. Mit dieser voll ausgestatteten Umgebung kannst du deine bevorzugte IDE verwenden und gleichzeitig von Code-Vervollständigungsfunktionen, Echtzeit-Linting und Refactoring-Tools für ein effizientes Infrastruktur-Code-Management profitieren.
Um die beste Entwicklungserfahrung mit dem Python CDK zu machen, empfehle ich, eine IDE zu verwenden, die Folgendes unterstützt:
- Syntax-Hervorhebung
- Code-Abschluss
- Intelligente Navigation und Vorschläge
- Unterstützung für virtuelle Umgebungen
Python und pip installieren
Um AWS CDK mit Python zu verwenden, musst du Python in der Version 3.8 oder höher auf deinem System installiert haben. Wenn du sie noch nicht hast, kannst du die neueste Version von der offiziellen Python-Website herunterladen.
Unter Windows musst du sicherstellen, dass Python in der Umgebungsvariablen PATH
eingetragen ist. Um das zu überprüfen, öffne ein Terminal oder eine Eingabeaufforderung und führe aus:
python --version
Wenn du einen "Befehl nicht gefunden" oder eine ähnliche Fehlermeldung siehst, ist Python wahrscheinlich nicht auf deiner PATH
. Die einfachste Lösung ist, während der Installation das Kästchen "Python 3.x zu PATH hinzufügen" zu aktivieren.
Außerdem brauchst du pip, das Python-Paketinstallationsprogramm, um später die AWS CDK-Abhängigkeiten zu installieren. Bei den meisten modernen Python-Distributionen ist pip bereits vorinstalliert.
pip --version
Wenn sie nicht installiert ist, folge der offiziellen Pip-Installationsanleitung.
Erste Schritte mit AWS CDK
Bevor wir Code schreiben, ist es wichtig zu verstehen, was AWS CDK ist, warum es existiert und wie es in die Welt von Infrastructure as Code (IaC) passt. In diesem Abschnitt lernst du die Kernkonzepte von CDK kennen und erfährst, wie es im Vergleich zu anderen gängigen IaC-Tools funktioniert.
Was ist AWS CDK und warum wird es verwendet?
Das AWS Cloud Development Kit (CDK) ist ein Open-Source-Framework, das es Nutzern ermöglicht, Cloud-Infrastrukturen mit vertrauten Programmiersprachen wie Python, TypeScript, Java und C# zu erstellen.
Das CDK ermöglicht es Nutzern, CloudFormation-Vorlagen programmatisch durch aktuellen Code zu generieren, anstatt JSON- oder YAML-Vorlagen manuell schreiben zu müssen.
Das heißt, du kannst:
- Wiederverwendung von Logik mit Schleifen und Funktionen.
- Organisiere deine Infrastruktur mit Modulen und Klassen.
- Deine IDE bietet Werkzeuge zur Code-Vervollständigung, Fehlerprüfung und Refactoring-Funktionen.
Im Kern geht es bei der CDK um drei Hauptkonzepte:
- App - Der Einstiegspunkt für dein CDK-Projekt. Er kann einen oder mehrere Stapel enthalten.
- Stack - Eine Bereitstellungseinheit, die auf einen CloudFormation Stack abgebildet wird. Jeder Stapel definiert eine Reihe von Ressourcen, die erstellt werden sollen.
- Construct - Der Baustein der CDK. Konstrukte repräsentieren Cloud-Komponenten wie S3-Buckets, Lambda-Funktionen, VPCs und komplexe Muster, die mehrere Ressourcen kombinieren.
Visuelle Hierarchie einer AWS CDK App
CDK vs Terraform vs CloudFormation
Die folgende Tabelle beschreibt die Unterschiede zwischen den in AWS verfügbaren Tools zur Verwaltung der Infrastruktur.
Feature |
AWS CDK |
Terraform |
AWS CloudFormation |
Sprachunterstützung |
Python, TypeScript, Java, C# |
HCL (deklarativ) |
YAML / JSON |
Abstraktionsebene |
Hoch (OOP + Bibliotheken) |
Medium |
Niedrig |
Modularität |
Stark (Konstrukte, Klassen) |
Stark (Module) |
Schwach (verschachtelte Stapel) |
Staatliches Management |
Verwaltet von CloudFormation |
Wird von Terraform (tfstate) verwaltet |
Verwaltet von CloudFormation |
Multi-cloud |
Nur AWS |
Ja |
Nur AWS |
Unterstützte Sprachen und Voraussetzungen
Das AWS CDK unterstützt mehrere Programmiersprachen, so dass die Entwickler die Sprache wählen können, mit der sie am besten zurechtkommen:
- TypeScript
- Python
- Java
- C#/.NET
- Geh
In diesem Lernprogramm konzentrieren wir uns auf Python, aber die grundlegenden Konzepte gelten für alle unterstützten Sprachen.
Installation und Einrichtung
Jetzt, wo deine Umgebung bereit ist, kannst du Python verwenden, um deine erste AWS CDK-App zu erstellen. Der Befehl CDK init
richtet die gesamte Projektstruktur ein, einschließlich Dateien, Verzeichnissen und einer virtuellen Umgebung, damit du schnell loslegen kannst.
Ein Projektverzeichnis erstellen
Öffne dein Terminal und führe den folgenden Befehl aus, um ein neues Verzeichnis zu erstellen und dorthin zu navigieren:
mkdir cdk_datacamp && cd cdk_datacamp
Initialisiere die CDK-App
cdk init sample-app --language python
Dadurch wird ein Starterprojekt mit einem grundlegenden Beispiel erstellt, das Folgendes enthält:
- Ein Beispielstapel (
cdk_datacamp_stack
) - Eine SQS-Warteschlange, die ein SNS-Thema abonniert hat
- Eine
cdk.json
Datei, die konfiguriert, wie deine CDK-App läuft - Eine virtuelle Umgebung (in
.venv
) für Python-Abhängigkeiten
Wenn der Befehl abgeschlossen ist, siehst du eine ähnliche Ausgabe wie diese:
CDK Python Projektgerüst
Einrichtung der virtuellen Umgebung
Wenn der cdk init
Prozess nicht automatisch eine virtuelle Umgebung erstellt, kannst du dies manuell tun:
python3 -m venv .venv
source .venv/bin/activate
Nach der Aktivierung installierst du die erforderlichen Abhängigkeiten:
pip install -r requirements.txt
CDK-Konzepte verstehen
Bevor wir tiefer in den Code eintauchen, wollen wir uns ansehen, wie die Kernkomponenten von AWS CDK - Apps, Stacks und Konstrukte - in der Praxis zusammenarbeiten. Jetzt, wo du weißt, wofür die einzelnen Elemente stehen, ist es wichtig zu sehen, wie sie zusammenwirken, um eine skalierbare, modulare Infrastruktur zu bilden.
Wir werden auch die verschiedenen Ebenen der Konstrukte (L1, L2, L3) aufschlüsseln und die CDK-Bibliotheken untersuchen, die dies möglich machen.
Apps, Stacks und Konstrukte
Da du nun weißt, was App, Stack und Construct aus den vorherigen Abschnitten sind, wollen wir nun verstehen, wie sie in einer CDK-Anwendung zusammenarbeiten.
Stell dir das so vor, als würdest du ein Haus bauen:
- Die App ist das gesamte Bauprojekt.
- Jeder Stack ist wie ein eigenes Gebäude oder eine eigene Struktur in diesem Projekt.
- Jedes Konstrukt ist ein Bauteil, wie Wände, Türen oder Sanitäranlagen, das in einen Stapel gehört.
Im Code sieht die Beziehung folgendermaßen aus:
# 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 instanziiert die App einen Stack, der Konstrukte wie einen S3-Bucket enthält.
Konstruktebenen verstehen: L1, L2, und L3
In AWS CDK gibt es Konstrukte in drei Abstraktionsebenen, die dir Flexibilität bieten, je nachdem wie viel Kontrolle oder Einfachheit du brauchst.
Level 1 (L1) – CloudFormation Constructs
Dies sind die Rohbausteine, die direkt aus der AWS CloudFormation-Spezifikation generiert werden. Jede AWS-Ressource in CloudFormation hat ein entsprechendes L1-Konstrukt in CDK; ihre Namen beginnen immer mit "Cfn".
L1-Konstrukte stellen alle möglichen Konfigurationsoptionen zur Verfügung, bieten aber keine Abstraktionen oder Voreinstellungen. Sie sind ideal, wenn du die volle Kontrolle brauchst oder neuere AWS-Funktionen verwendest, die noch nicht durch übergeordnete Konstrukte abgedeckt sind.
- Beispiel:
s3.CfnBucket
Level 2 (L2) - AWS CDK-native Konstrukte
L2-Konstrukte bieten eine höhere, entwicklerfreundliche Abstraktion als L1-Konstrukte. Das sind eigenwillige Komponenten mit sinnvollen Voreinstellungen und eingebauten Methoden, die alltägliche Aufgaben vereinfachen. Sie sind für den täglichen Gebrauch konzipiert und helfen dabei, Standardformulierungen zu reduzieren, während sie gleichzeitig ein hohes Maß an Anpassungsmöglichkeiten bieten.
- Beispiel:
s3.Bucket
- Du kannst einen versionierten Bucket mit nur einer Zeile Code erstellen.
Stufe 3 (L3) - Musterkonstruktionen
L3-Konstrukte sind Abstraktionen, die mehrere AWS-Ressourcen in gemeinsamen Architekturmustern bündeln. Sie können von AWS bereitgestellt oder als wiederverwendbare Komponenten von der Community oder von dir gebaut werden. Nutze L3-Konstrukte, um Komplexität zu kapseln und Infrastrukturmuster projekt- oder teamübergreifend wiederzuverwenden.
- Beispiel:
aws_s3_deployment.BucketDeployment
- Kombiniert einen S3-Bucket und eine Bereitstellungsstrategie, um das Hochladen von Assets zu automatisieren.
Die meisten Entwickler beginnen mit L2-Konstrukten und führen L1 nur bei Bedarf ein. L3 wird praktisch, wenn dein Projekt wächst und du wiederkehrende Muster in wiederverwendbare Komponenten abstrahieren willst.
CDK-Bibliotheken und -Module
Wenn du mit AWS CDK baust, interagierst du nicht direkt mit CloudFormation. Stattdessen verwendest du die modularen Bibliotheken von CDK, die Konstrukte für AWS-Services wie S3, Lambda, IAM und mehr bieten. Alle AWS-Servicemodule werden unter dem Kernpaket aws-cdk-lib
gebündelt und sind weiter nach Services gegliedert.
Häufig verwendete Bibliotheken in Python
Im Folgenden findest du einige der am häufigsten verwendeten Bibliotheken (oder Module) von aws-cdk-lib
in Python-Projekten:
aws_cdk.aws_s3
- Zum Erstellen von S3-Bucketsaws_cdk.aws_lambda
- Zur Definition von Lambda-Funktionenaws_cdk.aws_iam
- Zur Verwaltung von Rollen und Berechtigungenaws_cdk.aws_dynamodb
- Für die Arbeit mit DynamoDB-Tabellenaws_cdk.aws_ec2
- Für Netzwerkkomponenten wie VPCs und Sicherheitsgruppenaws_cdk.aws_sns
/aws_cdk.aws_sns_subscriptions
- Für SNS-Themen und ihre Abonnenten
Diese Module werden nur bei Bedarf importiert, damit dein Projekt schlank und modular bleibt.
Wie man ein CDK-Modul importiert und verwendet
Um einen bestimmten AWS-Service zu nutzen, importierst du sein Modul und rufst seine Konstruktionsklassen auf. Zum Beispiel, um einen S3-Bucket zu erstellen:
from aws_cdk import aws_s3 as s3
# Inside your stack
bucket = s3.Bucket(self, "MyBucket")
In diesem Beispiel wird das L2-Konstrukt s3.Bucket
verwendet, das eingebaute Voreinstellungen wie Verschlüsselungs- und Versionierungsoptionen enthält.
Wenn du einen anderen Dienst nutzen willst, importiere einfach dessen Modul auf die gleiche Weise:
from aws_cdk import aws_lambda as lambda_
from aws_cdk import aws_iam as iam
Hinweis: In deinem requirements.txt
brauchst du normalerweise nur:
aws-cdk-lib==2.179.0
constructs>=10.0.0,<11.0.0
Diese beiden Pakete geben dir Zugriff auf alle AWS CDK-Konstrukte und die Kernfunktionen des Frameworks.
Deinen ersten CDK-Stack erstellen
Nachdem du die internen Abläufe von AWS CDK kennengelernt hast, kannst du dieses Wissen umsetzen. Der folgende Abschnitt führt dich durch den Aufbau eines einsatzfähigen CDK-Stacks mit Python. Bevor du sie in deinem AWS-Konto bereitstellst, erstellst du eine Projektstruktur durch Code und implementierst tatsächliche AWS-Ressourcen, wie S3-Buckets und Lambda-Funktionen.
Das Gerüst für ein neues Projekt
Wenn du den Befehl cdk init
mit dem Flag --language python
ausführst, wird eine vollständige Projektstruktur erstellt, die in etwa so aussieht:
Ordnerstruktur eines AWS CDK Python Projekts
In der Datei app.py
wird die App definiert, und in der Datei cdk_datacamp_stack.py
schreibst du den Code für deinen Stack und deine Konstrukte.
Tipp: Du kannst die Stack-Datei oder -Klasse umbenennen, damit sie dem Zweck deiner App entspricht, z. B. storage_stack.py
oder monitoring_stack.py
.
Hinzufügen von AWS-Ressourcen
Fügen wir nun einige AWS-Ressourcen zu deinem CDK-Stack hinzu. Das schreibst du in die Methode __init__()
deiner Klasse Stack
in der Datei cdk_datacamp_stack.py.
S3-Eimer
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-Funktion
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'
)
Einsetzen des Stacks
Sobald du deine Ressourcen hinzugefügt hast, ist es an der Zeit, sie in AWS bereitzustellen.
Aktiviere in deinem Terminal deine virtuelle Umgebung und führe sie aus:
cdk deploy
Das wird:
- Synthetisiere deinen Stack in eine CloudFormation-Vorlage
- Lade diese Vorlage auf AWS hoch
- Bereitstellung der Ressourcen in deinem Konto
Wenn du den Stack zum ersten Mal bereitstellst, wirst du aufgefordert, die Änderungen zu genehmigen.
Nach dem Einsatz kannst du:
- Öffne die AWS-Konsole
- Navigiere zu dem jeweiligen Dienst (z.B. S3, Lambda)
- Schau dir die Ressourcen an, die CDK gerade erstellt hat
Arbeiten mit CDK-Konstrukten
AWS CDK-Anwendungen beruhen auf Konstrukten als ihren wesentlichen Strukturelementen. Dein Infrastrukturcode wird modularer, wartbarer und lesbarer, wenn du die Konstrukte beherrschst, egal ob du eingebaute Service-Konstrukte verwendest oder eigene wiederverwendbare Muster erstellst.
In diesem Abschnitt lernst du, wie du L2-Konstrukte (High-Level-Konstrukte) verwendest und benutzerdefinierte Konstrukte entwickelst, die sich wiederholende Muster reduzieren.
L2-Konstruktionen verwenden
L2-Konstrukte sind CDK-native Abstraktionen, die einfacher zu verwenden sind als die rohe CloudFormation (L1). Sie haben sinnvolle Standardeinstellungen und Typsicherheit und benötigen oft weniger Codezeilen, um eine AWS-Ressource einzurichten.
Warum L2-Konstruktionen verwenden?
- Weniger Textbausteine - weniger Pflichtfelder im Vergleich zu L1
- Besser lesbarer und idiomatischer Python-Code
- Enthält Hilfsmethoden wie
.add_to_role_policy()
oder.add_event_notification()
- Verwaltet automatisch Abhängigkeiten zwischen Ressourcen
Beispiel: Erstellen eines S3-Buckets mit 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
)
Für das entsprechende L1-Konstrukt s3.CfnBucket
müssten alle Eigenschaften manuell festgelegt und die Konfiguration als rohe Dict definiert werden - das ist viel weniger intuitiv.
Andere gängige L2-Konstrukte sind:
lambda_.Function()
für AWS Lambdadynamodb.Table()
für DynamoDBsqs.Queue()
für SQSsns.Topic()
für SNS
Benutzerdefinierte Konstrukte erstellen
Deine Infrastruktur wird mit wiederkehrenden Mustern erweitert, wie z.B. dem Erstellen von Lambda-Funktionen mit bestimmten Berechtigungen und S3-Buckets. Benutzerdefinierte Konstrukte sind die ideale Lösung für dieses spezielle Szenario.
Mit benutzerdefinierten Konstrukten kannst du verwandte Ressourcen zu einer einzigen logischen Einheit zusammenfassen, die über Stapel oder Projekte hinweg wiederverwendet werden kann.
Wann du ein benutzerdefiniertes Konstrukt erstellen solltest:
- Wenn du 3+ Ressourcen hast, die immer zusammen bereitgestellt werden
- Wenn du wiederverwendbare Logik kapseln willst
- Wenn du Code-Duplizierung über Stapel hinweg reduzieren willst
Beispiel: Ein wiederverwendbares S3 + Lambda Muster
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)
Du kannst dieses Konstrukt jetzt in jedem Stapel wie folgt verwenden:
from my_project.storage_with_lambda import StorageWithLambda
storage = StorageWithLambda(self, "ReusableComponent")
Bevor du die obigen Schritte ausführst, erstelle einen Ordner namens lambda
im Stammverzeichnis des Projekts und erstelle eine Datei index.py
mit dem folgenden Inhalt:
def handler(event, context):
return {
"statusCode": 200,
"body": "Hello from Lambda!"
}
Tipps zur Wiederverwendbarkeit
- Setze das Präfix
construct_
vor die Dateien oder platziere sie in einemconstructs/
Ordner. - Lege Ausgänge wie
self.bucket
oderself.function
für mehr Flexibilität frei - Jedes Konstrukt sollte sich auf eine Verantwortung konzentrieren
Testen und Synthetisieren von CDK-Apps
Nachdem du deinen Infrastrukturcode geschrieben hast, ist es wichtig zu prüfen, was das CDK bereitstellen wird und idealerweise zu testen, ob sich deine Stacks wie erwartet verhalten. Das AWS CDK bietet Tools, um CloudFormation-Vorlagen zu synthetisieren und automatisierte Tests zu schreiben, um Fehlkonfigurationen vor der Bereitstellung zu erkennen.
Vorlagen synthetisieren
Der Befehl cdk synth
generiert die CloudFormation-Vorlage aus deinem CDK-Code.
cdk synth
Wenn du dies ausführst, wird die CDK:
- Lädt deine App (über
app.py
) - Löst alle Konstrukte und Stapel auf
- Gibt rohe YAML/JSON CloudFormation-Vorlagen aus
Synthetisierte CloudFormation-Vorlage
Standardmäßig geht die Ausgabe in dein Terminal, aber du kannst sie bei Bedarf auch in eine Datei ausgeben:
cdk synth > template.yaml
Dies ist nützlich, wenn:
- Du möchtest die eigentliche Vorlage vor dem Einsatz prüfen
- Du debuggst die Struktur eines Stacks
- Du teilst die Vorlage mit Teams, die kein CDK verwenden
Prüfinfrastruktur
Obwohl das Testen der Infrastruktur als Code ungewöhnlich klingen mag, ist es von Vorteil, vor allem, wenn deine Stacks groß werden oder bedingte Logik, Schleifen oder wiederverwendbare Konstrukte enthalten.
Das AWS CDK bietet das Assertions-Modul, um synthetisierte Stacks zu testen.
Einen einfachen Test schreiben mit pytest
Hier ist ein Beispieltest, der überprüft, ob eine bestimmte Ressource (wie ein S3-Bucket) im Stack enthalten ist:
# 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)
Um die Tests durchzuführen, stelle sicher, dass pytest
installiert ist:
pip install -U pytest
Dann lauf:
pytest
Wenn alles in Ordnung ist, siehst du ein grünes Häkchen. Wenn nicht, wird dir die Testausgabe sagen, was fehlt.
Die Pytest-Ausgabe zeigt die erfolgreiche Ausführung aller Testfälle für den AWS CDK-Stack
Du kannst die Validierung auch in deinen CDK-Stack aufnehmen. Validierungstests sind Laufzeitprüfungen innerhalb deines Konstrukt- oder Stack-Codes, die Eingaben validieren, bevor die Bereitstellung erfolgt. Sie helfen dabei, Fehlkonfigurationen aufzuspüren oder Beschränkungen frühzeitig im Entwicklungszyklus durchzusetzen.
Nehmen wir an, wir wollen die bucket_name
als Kontextvariable übergeben, aber wir wollen das validieren:
- Der Bucket-Name ist nicht leer
- Er entspricht den S3-Benennungsregeln (z. B. nur Kleinbuchstaben)
Erstelle eine Datei namens test/test_storage_with_lambda.py
und füge Folgendes hinzu:
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")
Um die Validierung zu testen, führe den folgenden Befehl aus:
test/test_storage_with_lambda.py
Die Pytest-Ausgabe zeigt die erfolgreiche Ausführung aller Testfälle für den AWS CDK-Stack
Wann du Tests durchführen solltest:
- Du erstellst wiederverwendbare Konstrukte oder Muster.
- Die Durchführung von Tests dient dazu, einheitliche technische Anforderungen unter den Teammitgliedern festzulegen.
- Du willst Regressionen oder unbeabsichtigte Änderungen während CI/CD abfangen.
Willst du dein CDK-Wissen in einem Vorstellungsgespräch auffrischen? Diese Top AWS DevOps-Interview-Fragen können dir bei der Vorbereitung helfen.
Best Practices und Tipps für die Arbeit mit dem AWS CDK
Nachdem du die Erstellung und den Einsatz des CDK-Stacks gemeistert hast, solltest du Best Practices befolgen, um deinen Infrastrukturcode sauber, sicher und skalierbar zu halten. In diesem Abschnitt wird erörtert, wie man große Projekte strukturiert, die Sicherheit richtig handhabt und CDK in CI/CD-Pipelines integriert.
Große Projekte organisieren
Wenn deine CDK-Anwendung wächst, ist es wichtig, den Code in überschaubaren Einheiten zu organisieren.
Mehrere Stapel verwenden
Teile deine Infrastruktur nach Anliegen auf. Zum Beispiel:
- NetworkingStack: VPCs, Subnetze, Sicherheitsgruppen
- ComputeStack: EC2, Lambda
- StorageStack: S3, DynamoDB
So kannst du Teile deiner Infrastruktur unabhängig voneinander einsetzen, testen oder zerstören. So kann sie in app.py
eingebunden werden:
network_stack = NetworkingStack(app, "NetworkingStack")
compute_stack = ComputeStack(app, "ComputeStack")
Du kannst auch Ressourcen zwischen Stapeln mit Hilfe von Ausgängen oder Referenzen übergeben.
Wiederverwendbare verschachtelte Konstrukte erstellen
Kapseln Sie zusammenhängende Ressourcen (wie ein Lambda und seine Berechtigungen) in einem benutzerdefinierten Konstrukt, wie Sie es mit StorageWithLambda
getan haben. Das verbessert die Lesbarkeit und Wiederverwendbarkeit über Stacks oder Apps hinweg.
Umgebungsspezifische Konfiguration verwenden
Unterstütze mehrere Umgebungen (Dev, Staging, Prod) mit:
cdk.json
mit Kontextwerten- CLI-Übersteuerungen:
cdk deploy -c env=prod
- Bedingte Logik in deinen Stapeln
env = app.node.try_get_context("env")
if env == "prod":
bucket_name = "mycompany-prod-logs"
Sicherheit und Berechtigungen
Jedes Infrastrukturprojekt muss der Sicherheit während der automatisierten Bereitstellungsprozesse von AWS CDK Priorität einräumen. Der folgende Abschnitt demonstriert die sichere IAM-Ressourcenverwaltung durch die Prinzipien der geringsten Privilegien.
IAM-Rollen definieren, statt Standardwerte zu verwenden
CDK-Konstrukte, die Lambda- oder ECS-Aufgaben enthalten, erstellen automatisch IAM-Rollen. Das ist zwar praktisch, aber es kann deine Kontrolle über Berechtigungen und Namensgebung einschränken.
Definiere stattdessen explizit Rollen:
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")
]
)
Diese Rolle erlaubt standardmäßig nur die Protokollierung und nichts anderes.
Das Prinzip des geringsten Privilegs anwenden
Vermeide es, "*"
in actions
oder resources
zu verwenden, wenn es nicht unbedingt notwendig ist.
Beispiel:
lambda_fn.add_to_role_policy(
iam.PolicyStatement(
actions=["*"],
resources=["*"]
)
)
Du kannst auch ressourcenspezifische Zuschüsse nutzen, wenn sie verfügbar sind:
bucket.grant_read(lambda_fn)
Dadurch wird automatisch die notwendige Richtlinie mit beschränktem Zugriff auf den S3-Bucket erstellt.
Verwaltete Richtlinien verwenden, wenn möglich
Von AWS verwaltete Richtlinien vereinfachen die Wartung und verringern das Risiko von Fehlern.
iam.ManagedPolicy.from_aws_managed_policy_name("AmazonSQSReadOnlyAccess")
Du kannst sie mit benutzerdefinierten Rollen für Dienste wie ECS, Batch oder Step Functions verknüpfen.
CI/CD-Integration
Das AWS CDK ist besonders leistungsstark, da es sich in moderne CI/CD-Pipelines integrieren lässt. CDK unterstützt die automatisierte Bereitstellung der Infrastruktur durch versionsgesteuerte Codebereitstellung, die mit GitHub, GitLab und AWS-nativen Diensten, einschließlich CodePipeline, funktioniert. Das System verringert menschliche Fehler, verkürzt die Feedback-Zyklen und ermöglicht den Einsatz in verschiedenen Umgebungen.
GitHub-Aktionen: CDK-Einsätze automatisieren
Du kannst GitHub Actions nutzen, um CDK-Stacks bei jedem Push- oder Pull-Request zu synthetisieren, zu diffundieren, zu testen und einzusetzen.
Sieh dir das an .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 }}
Verwende cdk diff
in PRs, um infra-Änderungen vor dem Zusammenführen anzuzeigen.
CDK-Pipelines: Natives CDK CI/CD mit CodePipeline
Für vollständig verwaltete Bereitstellungen innerhalb von AWS bietet CDK ein Modul namens aws_cdk.pipelines
, mit dem du deine gesamte CI/CD-Pipeline als Code definieren kannst, genau wie die Infrastruktur.
Hier ist ein vereinfachtes Beispiel:
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")
)
Im obigen Code:
SecretValue.secrets_manager("GITHUB_TOKEN")
holt dein GitHub-Token sicher aus dem Secrets Manager.MyAppStage
sollte eine Klasse sein, dieStage
erweitert und deine eigentlichen CDK-Stapel umhüllt.
Wenn du Systeme für maschinelles Lernen bereitstellst, wird die Integration von CDK mit kontinuierlichen Bereitstellungspraktiken in unserem Kurs CI/CD für maschinelles Lernen behandelt.
Fazit
In diesem Lernprogramm hast du gelernt, wie du mit dem AWS Cloud Development Kit (CDK) eine Cloud-Infrastruktur in Python aufbaust und bereitstellst. Du hast gelernt, wie es geht:
- Erstelle deinen ersten CDK-Stack.
- Definiere und validiere S3-Buckets und Lambda-Funktionen als Ressourcen.
- Organisiere ein Projekt durch benutzerdefinierte Konstrukte und Multi-Stack-Muster.
- Bewährte Sicherheitspraktiken nach dem Prinzip der geringsten Privilegien anwenden.
- Automatisiere Einsätze, indem du GitHub Actions mit CDK Pipelines kombinierst.
- Schreibe Tests, um die Logik deiner Infrastruktur zu überprüfen.
Jetzt, wo du deine erste CDK-App eingesetzt hast, gibt es ein paar Möglichkeiten, dich weiterzuentwickeln:
- Verwende parametrisierte Umgebungen für Dev/Staging/Prod
- Hinzufügen von CloudWatch Alarmen, API Gateway oder Schrittfunktionen
- Erforsche CDK-Konstrukte wie
aws_s3_deployment
,aws_ecs_patterns
, undcdk.pipelines
- Konvertiere deine Konstrukte in eine interne Python-Bibliothek, um sie wiederverwenden zu können.
Um weiter zu lernen und zu bauen, schauden Kurs Einführung in AWS Boto in Python an!
FAQs
Was ist AWS CDK, und wie unterscheidet es sich von CloudFormation oder Terraform?
Mit AWS CDK kannst du die Cloud-Infrastruktur mit Programmiersprachen wie Python definieren, während CloudFormation und Terraform auf JSON/YAML oder HCL basieren. CDK bietet eine höhere Abstraktion und Wiederverwendbarkeit durch Konstrukte.
Muss ich CloudFormation kennen, um AWS CDK zu nutzen?
Nein, CDK abstrahiert den größten Teil der Komplexität von CloudFormation. Das Verständnis von CloudFormation hilft jedoch bei der Verwendung von Konstrukten auf niedrigerer Ebene oder bei der Fehlerbehebung in der Bereitstellung.
Kann ich mit AWS CDK mehrere Umgebungen (z. B. Dev, Prod) bereitstellen?
Ja! CDK unterstützt die umgebungsspezifische Konfiguration mithilfe von Kontextwerten und CLI-Flags wie cdk deploy -c env=prod
.
Wie kann ich meinen CDK-Infrastrukturcode testen?
Du kannst pytest zusammen mit den CDK-Assertions und dem Template-Modul verwenden, um Unit-Tests zu schreiben, die die Ressourcen und Konfigurationen deines Stacks vor der Bereitstellung überprüfen.
Was passiert hinter den Kulissen, wenn ich cdk deploy ausführe?
cdk deploy
fasst deinen Python-Code in einer CloudFormation-Vorlage zusammen, lädt ihn zu AWS hoch und stellt die definierten Ressourcen in deinem Konto bereit.
Rahul Sharma ist ein AWS-Botschafter, DevOps-Architekt und technischer Blogger, der sich auf Cloud Computing, DevOps-Praktiken und Open-Source-Technologien spezialisiert hat. Mit seiner Expertise in AWS, Kubernetes und Terraform vereinfacht er komplexe Konzepte für Lernende und Fachleute durch ansprechende Artikel und Tutorials. Rahul liebt es, DevOps-Herausforderungen zu lösen und Erkenntnisse zu teilen, um die Tech-Community zu unterstützen.