Cours
La gestion de l'infrastructure cloud avec des modèles JSON ou YAML bruts peut s'avérer fastidieuse et sujette aux erreurs. Le kit de développement cloud AWS (CDK) change la donne en vous permettant de définir des ressources cloud à l'aide de langages de programmation modernes tels que Python, TypeScript, Java et C#.
Avec CDK, l'infrastructure devient un code réutilisable, testable et contrôlé par version. Il vous permet de penser comme un développeur, même lors du provisionnement de systèmes cloud complexes.
Dans ce tutoriel, vous apprendrez à mettre en place un projet AWS CDK à l'aide de Python. Nous verrons comment écrire votre première pile, ajouter une ressource AWS essentielle et la déployer sur votre compte AWS. À la fin, vous comprendrez clairement comment fonctionne CDK et comment l'utiliser pour gérer l'infrastructure d'une manière conviviale pour les développeurs, avec du code.
Pour mieux comprendre les pratiques qui sous-tendent des outils comme AWS CDK, explorez les principes fondamentaux dans notre cours Concepts DevOps.
Conditions préalables
Avant de commencer à écrire du code avec AWS CDK, assurez-vous que votre environnement est correctement configuré. Voici ce dont vous aurez besoin :
Compte AWS pour l'expérimentation
Vous devez avoir accès à un compte AWS pour déployer l'application que nous allons créer. Si votre système est déjà configuré avec les informations d'identification d'un utilisateur de niveau administrateur, n'hésitez pas à passer à l'étape suivante.
Si vous n'avez pas encore de compte AWS, créez-en un ici.
Pour un cursus d'apprentissage structuré couvrant les fondamentaux d'AWS, le parcours AWS Cloud Practitioner est un excellent point de départ.
Utilisateur administrateur
Vous aurez besoin d'un utilisateur disposant d'un accès programmatique et de permissions complètes pour suivre le processus.
- Connectez-vous à votre compte AWS.
- Ouvrez la console IAM.
- Créez un nouvel utilisateur - vous pouvez le nommer quelque chose comme "dataCamp-cdk"
- Choisir Accès programmatique.
- Cliquez sur Next : Permissions.
- Choisissez Joindre directement les politiques existantes et cochez Accès administrateur.
- Cliquez sur Suivant : Tags,Suivant : Consultez le site , puiscréez un utilisateur.
Sur le dernier écran, notez votre ID de clé d'accès et votre clé d'accès secrète. Vous en aurez besoin à l'étape suivante.
Configurez vos identifiants AWS
Ouvrez un terminal et exécutez :
aws configure
Vous serez invité à saisir les informations d'identification de la 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]:
Choisir un IDE pour le développement
Le CDK AWS permet aux développeurs de travailler dans un environnement de programmation complet au lieu de modèles YAML ou JSON. Cet environnement complet vous permet d'utiliser votre IDE préféré tout en bénéficiant de fonctionnalités de complétion de code, de linting en temps réel et d'outils de refactorisation pour une gestion efficace du code de l'infrastructure.
Pour obtenir la meilleure expérience de développement avec le CDK Python, je vous suggère d'utiliser un IDE qui prend en charge les éléments suivants :
- Mise en évidence de la syntaxe
- Achèvement du code
- Navigation intelligente et suggestions
- Soutien à l'environnement virtuel
Installez Python et pip
Pour utiliser AWS CDK avec Python, la version 3.8 ou supérieure de Python doit être installée sur votre système. Si vous ne l'avez pas encore, vous pouvez télécharger la dernière version sur le site officiel de Python.
Si vous êtes sous Windows, assurez-vous que Python est ajouté à la variable d'environnement PATH
de votre système. Pour vérifier, ouvrez un terminal ou une invite de commande et exécutez :
python --version
Si vous voyez un "command not found" ou une erreur similaire, Python n'est probablement pas sur votre PATH
. La solution la plus simple consiste à cocher la case "Add Python 3.x to PATH" lors de l'installation.
Vous aurez également besoin de pip, le programme d'installation de paquets Python, pour installer ultérieurement les dépendances du CDK AWS. La plupart des distributions Python modernes sont livrées avec pip préinstallé.
pip --version
S'il n'est pas installé, suivez le guide d'installation officiel de Pip.
Premiers pas avec AWS CDK
Avant d'écrire le moindre code, il est essentiel de comprendre ce qu'est AWS CDK, pourquoi il existe et comment il s'inscrit dans le monde plus large de l'infrastructure en tant que code (IaC). Cette section vous présentera les concepts de base du CDK et vous montrera comment il se compare à d'autres outils IaC populaires.
Qu'est-ce que le CDK AWS et pourquoi est-il utilisé ?
AWS Cloud Development Kit (CDK) est un framework open-source qui permet aux utilisateurs de créer une infrastructure cloud par le biais de langages de programmation familiers, notamment Python, TypeScript, Java et C#.
Le CDK permet aux utilisateurs de générer des modèles CloudFormation de manière programmatique par le biais d'un code réel au lieu de nécessiter l'écriture manuelle de modèles JSON ou YAML.
Cela signifie que vous pouvez :
- Réutiliser la logique à l'aide de boucles et de fonctions.
- Organisez votre infrastructure à l'aide de modules et de classes.
- Votre IDE fournit des outils de complétion de code, de vérification des erreurs et de remaniement.
Le CDK s'articule autour de trois concepts principaux :
- App - Le point d'entrée de votre projet CDK. Il peut contenir une ou plusieurs piles.
- Pile - Une unité de déploiement qui correspond à une pile CloudFormation. Chaque pile définit un ensemble de ressources à créer.
- Structure - L'élément constitutif de la CDK. Les constructions représentent les composants du cloud comme les buckets S3, les fonctions Lambda, les VPC et les modèles complexes combinant plusieurs ressources.
Hiérarchie visuelle d'une application AWS CDK
CDK vs Terraform vs CloudFormation
Le tableau suivant décrit les différences entre les outils disponibles dans AWS pour gérer l'infrastructure.
Fonctionnalité |
AWS CDK |
Terraform |
AWS CloudFormation |
Soutien linguistique |
Python, TypeScript, Java, C# |
HCL (déclaratif) |
YAML / JSON |
Niveau d'abstraction |
Élevé (OOP + bibliothèques) |
Moyen |
Faible |
Modularité |
Fort (constructions, classes) |
Fort (modules) |
Faible (piles imbriquées) |
Gestion de l'État |
Géré par CloudFormation |
Géré par Terraform (tfstate) |
Géré par CloudFormation |
Multi-cloud |
AWS uniquement |
Oui |
AWS uniquement |
Langues prises en charge et conditions préalables
Le CDK AWS prend en charge plusieurs langages de programmation, ce qui permet aux développeurs de choisir celui avec lequel ils sont le plus à l'aise :
- TypeScript
- Python
- Java
- C#/.NET
- Allez
Dans ce tutoriel, nous nous concentrerons sur Python, mais les concepts de base s'appliquent à tous les langages pris en charge.
Installation et configuration
Maintenant que votre environnement est prêt, il est temps d'utiliser Python pour échafauder votre première application AWS CDK. La commande CDK init
met en place toute la structure du projet, y compris les fichiers, les répertoires et un environnement virtuel, pour vous aider à démarrer rapidement.
Créer un répertoire de projet
Ouvrez votre terminal et exécutez la commande suivante pour créer un nouveau répertoire et y naviguer :
mkdir cdk_datacamp && cd cdk_datacamp
Initialiser l'application CDK
cdk init sample-app --language python
Cela crée un projet de démarrage préconfiguré avec un exemple de base qui comprend :
- Un exemple de pile (
cdk_datacamp_stack
) - Une file d'attente SQS souscrite à un sujet SNS
- Un fichier
cdk.json
qui configure l'exécution de votre application CDK. - Un environnement virtuel (dans
.venv
) pour les dépendances de Python
Une fois la commande terminée, vous obtiendrez un résultat similaire à celui-ci :
Échafaudage du projet Python CDK
Configuration de l'environnement virtuel
Si le processus cdk init
ne crée pas automatiquement un environnement virtuel, vous pouvez le faire manuellement :
python3 -m venv .venv
source .venv/bin/activate
Une fois activé, installez les dépendances nécessaires :
pip install -r requirements.txt
Comprendre les concepts CDK
Avant de plonger plus profondément dans le code, explorons la manière dont les principaux composants d'AWS CDK - applications, piles et constructions - fonctionnent ensemble dans la pratique. Maintenant que vous savez ce que chacun représente, il est essentiel de voir comment ils interagissent pour former une infrastructure modulaire et évolutive.
Nous décomposerons également les différents niveaux de construction (L1, L2, L3) et examinerons les bibliothèques de CDK qui rendent cela possible.
Applications, piles et constructions
Maintenant que vous savez ce que sont App, Stack et Construct dans les sections précédentes, nous allons comprendre comment ils fonctionnent ensemble dans une application CDK.
Pensez-y comme à la construction d'une maison :
- L'App est le projet de construction dans son ensemble.
- Chaque pile est comme un bâtiment ou une structure distincte dans ce projet.
- Chaque structure est un composant, comme les murs, les portes ou la plomberie, qui entre dans une pile.
Dans le code, la relation se présente comme suit :
# 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")
Ici, l'application instancie une pile, qui comprend des constructions telles qu'un seau S3.
Comprendre les niveaux de construction : L1, L2 et L3
Dans AWS CDK, les constructions se déclinent en trois niveaux d'abstraction, ce qui vous offre une certaine souplesse en fonction du degré de contrôle ou de simplicité dont vous avez besoin.
Niveau 1 (L1) - Constructions CloudFormation
Il s'agit des blocs de construction bruts générés directement à partir de la spécification AWS CloudFormation. Chaque ressource AWS dans CloudFormation a une construction L1 équivalente dans CDK ; leurs noms commencent toujours par "Cfn".
Les constructions L1 exposent toutes les options de configuration possibles, mais n'offrent aucune abstraction ou valeur par défaut. Elles sont idéales lorsque vous avez besoin d'un contrôle total ou que vous utilisez des fonctionnalités AWS plus récentes qui ne sont pas encore intégrées dans des constructions de niveau supérieur.
- Exemple :
s3.CfnBucket
Niveau 2 (L2) - Constructions natives d'AWS CDK
Les constructions L2 offrent une abstraction de plus haut niveau et plus conviviale pour les développeurs que les constructions L1. Il s'agit de composants à opinion, avec des valeurs par défaut raisonnables et des méthodes intégrées qui simplifient les tâches quotidiennes. Elles sont conçues pour une utilisation quotidienne et permettent de réduire le nombre de tâches répétitives tout en offrant un bon niveau de personnalisation.
- Exemple :
s3.Bucket
- Vous pouvez créer un seau versionné en une seule ligne de code.
Niveau 3 (L3) - Constructions de modèles
Les constructions L3 sont des abstractions qui regroupent plusieurs ressources AWS dans des modèles architecturaux communs. Ils peuvent être fournis par AWS ou construits en tant que composants réutilisables par la communauté ou par vous-même. Utilisez les constructions L3 pour encapsuler la complexité et réutiliser les modèles d'infrastructure dans les projets ou les équipes.
- Exemple :
aws_s3_deployment.BucketDeployment
- Combine un seau S3 et une stratégie de déploiement pour automatiser les téléchargements de ressources.
La plupart des développeurs commencent par des constructions L2 et n'introduisent L1 qu'en cas de besoin. L3 devient pratique lorsque votre projet prend de l'ampleur et que vous souhaitez abstraire les modèles répétés pour en faire des composants réutilisables.
Bibliothèques et modules CDK
Vous n'interagissez pas directement avec CloudFormation brut lorsque vous construisez avec AWS CDK. Au lieu de cela, vous utilisez les bibliothèques modulaires de CDK, qui fournissent des constructions pour les services AWS tels que S3, Lambda, IAM, et plus encore. Tous les modules de service AWS sont regroupés dans le paquet de base appelé aws-cdk-lib
, et sont ensuite organisés par service.
Bibliothèques couramment utilisées en Python
Vous trouverez ci-dessous quelques-unes des bibliothèques (ou modules) les plus fréquemment utilisées à partir de aws-cdk-lib
dans les projets Python :
aws_cdk.aws_s3
- Pour créer des buckets S3aws_cdk.aws_lambda
- Pour définir les fonctions Lambdaaws_cdk.aws_iam
- Pour la gestion des rôles et des autorisationsaws_cdk.aws_dynamodb
- Pour travailler avec les tableaux DynamoDBaws_cdk.aws_ec2
- Pour les composants réseau tels que les VPC et les groupes de sécuritéaws_cdk.aws_sns
/aws_cdk.aws_sns_subscriptions
- Pour les sujets SNS et leurs abonnés
Ces modules ne sont importés qu'en cas de besoin, ce qui permet à votre projet de rester léger et modulaire.
Comment importer et utiliser un module CDK
Pour utiliser un service AWS spécifique, vous importez son module et appelez ses classes de construction. Par exemple, pour créer un godet S3 :
from aws_cdk import aws_s3 as s3
# Inside your stack
bucket = s3.Bucket(self, "MyBucket")
Cet exemple utilise la construction L2 s3.Bucket
, qui comprend des valeurs par défaut intégrées telles que le cryptage et les options de versionnement.
Si vous devez utiliser un autre service, il vous suffit d'importer son module de la même manière :
from aws_cdk import aws_lambda as lambda_
from aws_cdk import aws_iam as iam
Note : Sur votre site requirements.txt
, vous n'avez généralement besoin que d'une seule personne :
aws-cdk-lib==2.179.0
constructs>=10.0.0,<11.0.0
Ces deux packages vous donnent accès à toutes les constructions AWS CDK et aux fonctionnalités de base du framework.
Création de votre première pile CDK
Après avoir appris les opérations internes du CDK AWS, vous pouvez mettre en œuvre ces connaissances. La section suivante vous guide dans la construction d'une pile CDK opérationnelle à l'aide de Python. Avant de les déployer sur votre compte AWS, vous créerez une structure de projet par le biais du code et mettrez en œuvre des ressources AWS réelles, telles que des buckets S3 et des fonctions Lambda.
Echafaudage d'un nouveau projet
Lorsque vous exécutez la commande cdk init
avec l'option --language python
, elle met en place une structure de projet complète qui ressemble à ceci :
Structure des dossiers d'un projet AWS CDK Python
Le fichier app.py
est l'endroit où l'application est définie, et le fichier cdk_datacamp_stack.py
est l'endroit où vous écrivez le code pour votre pile et vos constructions.
Conseil : Vous pouvez renommer le fichier de pile ou la classe en fonction de l'objectif de votre application, par exemple storage_stack.py
ou monitoring_stack.py
.
Ajouter des ressources AWS
Ajoutons maintenant quelques ressources AWS à votre pile CDK. Vous écrirez cela dans la méthode __init__()
de votre classe Stack
dans le fichier cdk_datacamp_stack.py.
Seau 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
)
Fonction 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'
)
Déploiement de la pile
Une fois que vous avez ajouté vos ressources, il est temps de les déployer sur AWS.
Dans votre terminal, activez votre environnement virtuel et exécutez :
cdk deploy
Ce sera le cas :
- Synthétiser votre pile dans un modèle CloudFormation
- Téléchargez ce modèle sur AWS
- Approvisionner les ressources de votre compte
Vous serez invité à approuver les modifications si c'est la première fois que vous déployez la pile.
Après le déploiement, vous pouvez :
- Ouvrez la console AWS
- Naviguez vers le service concerné (par exemple, S3, Lambda).
- Consultez les ressources que le CDK vient de créer
Travailler avec des constructions CDK
Les applications AWS CDK s'appuient sur des constructions en tant qu'éléments structurels essentiels. Votre code d'infrastructure deviendra plus modulaire, plus facile à maintenir et plus lisible lorsque vous maîtriserez les constructions, que vous utilisiez les constructions de services intégrées ou que vous créiez vos propres modèles réutilisables.
Cette section vous apprend à utiliser les constructions L2 (de haut niveau) et à développer des constructions personnalisées qui réduisent les schémas répétitifs.
Utiliser les concepts de la L2
Les constructions L2 sont des abstractions natives de CDK qui sont plus faciles à utiliser que CloudFormation brut (L1). Ils ont des valeurs par défaut raisonnables et une sécurité de type, ce qui nécessite souvent moins de lignes de code pour configurer une ressource AWS.
Pourquoi utiliser des constructions en L2 ?
- Moins de formulaires standard - moins de champs obligatoires par rapport à L1
- Un code Python plus lisible et idiomatique
- Comprend des méthodes utilitaires telles que
.add_to_role_policy()
ou.add_event_notification()
- Gestion automatique des dépendances entre les ressources
Exemple : Création d'un seau S3 à l'aide de 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
)
La construction équivalente en L1, s3.CfnBucket
, nécessiterait que toutes les propriétés soient définies manuellement et que la configuration soit définie sous forme de dictionnaires bruts, ce qui est beaucoup moins intuitif.
Parmi les autres constructions courantes de la L2, on peut citer
lambda_.Function()
pour AWS Lambdadynamodb.Table()
pour DynamoDBsqs.Queue()
pour SQSsns.Topic()
pour le SNS
Créer des constructions personnalisées
Votre infrastructure se développera avec des schémas récurrents, comme la création de fonctions Lambda avec des autorisations et des buckets S3 particuliers. Les constructions personnalisées constituent la solution idéale pour ce scénario spécifique.
Les constructions personnalisées vous permettent de combiner des ressources connexes en une seule unité logique, qui peut être réutilisée dans des piles ou des projets.
Quand créer une construction personnalisée :
- Lorsque vous avez plus de 3 ressources qui sont toujours provisionnées ensemble
- Lorsque vous souhaitez encapsuler une logique réutilisable
- Lorsque vous souhaitez réduire la duplication du code entre les piles
Exemple : Un modèle S3 + Lambda réutilisable
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)
Vous pouvez maintenant utiliser cette construction à l'intérieur de n'importe quelle pile comme ceci :
from my_project.storage_with_lambda import StorageWithLambda
storage = StorageWithLambda(self, "ReusableComponent")
Avant d'exécuter l'opération ci-dessus, créez un dossier nommé lambda
à la racine du projet et créez un fichier index.py
avec le contenu suivant :
def handler(event, context):
return {
"statusCode": 200,
"body": "Hello from Lambda!"
}
Conseils de réutilisation
- Préfixez les fichiers par
construct_
ou placez-les dans un dossierconstructs/
. - Exposez des sorties telles que
self.bucket
ouself.function
pour plus de flexibilité. - Veillez à ce que chaque construction se concentre sur une seule responsabilité
Test et synthèse des applications CDK
Après avoir écrit votre code d'infrastructure, il est essentiel de vérifier ce que le CDK va déployer et, idéalement, de tester que vos piles se comportent comme prévu. Le CDK AWS fournit des outils pour synthétiser les modèles CloudFormation et écrire des tests automatisés pour détecter les mauvaises configurations avant le déploiement.
Synthèse des modèles
La commande cdk synth
génère le modèle CloudFormation à partir de votre code CDK.
cdk synth
Lorsque vous exécutez ce programme, le CDK :
- Charge votre application (via
app.py
) - Résout toutes les constructions et les piles
- Produit des modèles CloudFormation YAML/JSON bruts.
Modèle CloudFormation synthétisé
Par défaut, la sortie s'effectue dans votre terminal, mais vous pouvez également l'effectuer dans un fichier si nécessaire :
cdk synth > template.yaml
Ceci est utile lorsque :
- Vous souhaitez inspecter le modèle réel avant de le déployer
- Vous déboguez la structure d'une pile
- Vous partagez le modèle avec des équipes qui n'utilisent pas CDK
Infrastructure de test
Bien que le test de l'infrastructure en tant que code puisse sembler inhabituel, il est bénéfique, en particulier lorsque vos piles deviennent importantes ou comprennent une logique conditionnelle, des boucles ou des constructions réutilisables.
Le CDK AWS propose le module assertions pour tester les piles synthétisées.
Écrire un test simple avec pytest
Voici un exemple de test qui vérifie si une ressource spécifique (comme un seau S3) est incluse dans la pile :
# 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)
Pour exécuter les tests, assurez-vous que pytest
est installé :
pip install -U pytest
Ensuite, courez :
pytest
Si tout se passe bien, vous verrez apparaître une coche verte. Si ce n'est pas le cas, le résultat du test vous indiquera ce qui manque.
Sortie de Pytest montrant l'exécution réussie de tous les cas de test pour la pile AWS CDK
Vous pouvez également inclure la validation dans votre pile CDK. Les tests de validation sont des vérifications au moment de l'exécution dans votre code de construction ou de pile qui valident les entrées avant le déploiement. Ils permettent de détecter les mauvaises configurations ou d'appliquer des contraintes dès le début du cycle de développement.
Supposons que nous voulions transmettre le site bucket_name
en tant que variable de contexte, mais que nous voulions le valider :
- Le nom du seau n'est pas vide
- Il respecte les règles de dénomination du S3 (par exemple, minuscules uniquement).
Créez un fichier nommé test/test_storage_with_lambda.py
et ajoutez-y ce qui suit :
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")
Pour tester la validation, exécutez la commande suivante :
test/test_storage_with_lambda.py
Sortie de Pytest montrant l'exécution réussie de tous les cas de test pour la pile AWS CDK
Quand utiliser les tests ?
- Vous créez des constructions ou des modèles réutilisables.
- La mise en œuvre de tests permet d'établir des exigences techniques standard parmi les membres de l'équipe.
- Vous souhaitez détecter les régressions ou les changements involontaires pendant le processus CI/CD.
Vous souhaitez renforcer vos connaissances sur les CDK lors d'un entretien ? Ces principales questions d'entretien AWS DevOps peuvent vous aider à vous préparer.
Meilleures pratiques et conseils pour travailler avec le CDK AWS
Après avoir maîtrisé la création et le déploiement de la pile CDK, vous devez suivre les meilleures pratiques pour que le code de votre infrastructure reste propre, sécurisé et évolutif. Cette section aborde la manière de structurer les grands projets, de gérer correctement la sécurité et d'intégrer CDK dans les pipelines CI/CD.
Organiser de grands projets
Au fur et à mesure que votre application CDK se développe, il devient essentiel d'organiser le code en unités gérables.
Utilisez plusieurs piles
Répartissez votre infrastructure en fonction de vos préoccupations. Par exemple :
- NetworkingStack : VPC, sous-réseaux, groupes de sécurité
- ComputeStack : EC2, Lambda
- StorageStack : S3, DynamoDB
Cela vous permet de déployer, de tester ou de détruire des parties de votre infrastructure de manière indépendante. Voici comment l'inclure dans le site app.py
:
network_stack = NetworkingStack(app, "NetworkingStack")
compute_stack = ComputeStack(app, "ComputeStack")
Vous pouvez également transmettre des ressources entre les piles à l'aide de sorties ou de références.
Créer des constructions imbriquées réutilisables
Encapsulez les ressources connexes (comme une Lambda et ses autorisations) dans une construction personnalisée, comme vous l'avez fait avec StorageWithLambda
. Cela améliore la lisibilité et la réutilisation des piles ou des applications.
Utiliser une configuration spécifique à l'environnement
Prendre en charge plusieurs environnements (dev, staging, prod) en utilisant :
cdk.json
avec des valeurs contextuelles- Remplacements de l'interface de programmation :
cdk deploy -c env=prod
- Logique conditionnelle dans vos piles
env = app.node.try_get_context("env")
if env == "prod":
bucket_name = "mycompany-prod-logs"
Sécurité et autorisations
Tout projet d'infrastructure doit donner la priorité à la sécurité lors des processus de déploiement automatisé d'AWS CDK. La section suivante présente la gestion sécurisée des ressources IAM à l'aide des principes du moindre privilège.
Définir les rôles IAM au lieu d'utiliser les valeurs par défaut
Les constructions CDK, qui incluent des tâches Lambda ou ECS, créeront automatiquement des rôles IAM. Bien que pratique, elle peut limiter votre contrôle sur les autorisations et le nommage.
Définissez plutôt les rôles de manière explicite :
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")
]
)
Par défaut, ce rôle n'autorise que la journalisation et rien d'autre.
Appliquer le principe du moindre privilège
Évitez d'utiliser "*"
dans actions
ou resources
, sauf en cas d'absolue nécessité.
Exemple :
lambda_fn.add_to_role_policy(
iam.PolicyStatement(
actions=["*"],
resources=["*"]
)
)
Vous pouvez également utiliser des subventions spécifiques aux ressources lorsqu'elles sont disponibles :
bucket.grant_read(lambda_fn)
Cela génère automatiquement la politique nécessaire avec un accès limité au seau S3.
Utiliser des politiques gérées lorsque c'est possible
Les règles gérées par AWS simplifient la maintenance et réduisent les risques d'erreur.
iam.ManagedPolicy.from_aws_managed_policy_name("AmazonSQSReadOnlyAccess")
Vous pouvez les associer à des rôles personnalisés pour des services tels que ECS, Batch ou Step Functions.
Intégration CI/CD
Le CDK AWS offre une puissance exceptionnelle grâce à sa capacité à s'intégrer aux pipelines CI/CD contemporains. CDK prend en charge la fourniture automatisée d'infrastructures grâce au déploiement de code contrôlé par version, qui fonctionne avec GitHub, GitLab et les services natifs d'AWS, y compris CodePipeline. Le système réduit les erreurs humaines tout en raccourcissant les cycles de retour d'information et permet un déploiement dans des environnements multiples.
Actions GitHub : Automatiser les déploiements de CDK
Vous pouvez utiliser les actions GitHub pour synthétiser, différencier, tester et déployer les piles CDK à chaque demande de téléchargement.
Jetez un coup d'œil à ce site .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 }}
Utilisez cdk diff
dans les PR pour prévisualiser les changements infra avant de les fusionner.
Pipelines CDK : CDK natif CI/CD avec CodePipeline
Pour les déploiements entièrement gérés au sein d'AWS, CDK fournit un module appelé aws_cdk.pipelines
, qui vous permet de définir l'ensemble de votre pipeline CI/CD en tant que code, tout comme l'infrastructure.
Voici un exemple simplifié :
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")
)
Dans le code ci-dessus :
SecretValue.secrets_manager("GITHUB_TOKEN")
extrait en toute sécurité votre jeton GitHub de Secrets Manager.MyAppStage
doit être une classe qui étendStage
et qui englobe vos piles CDK réelles.
Si vous déployez des systèmes d'apprentissage automatique, l'intégration de CDK aux pratiques de déploiement continu est abordée dans notre cours CI/CD pour l'apprentissage automatique.
Conclusion
Ce tutoriel vous a montré comment construire et déployer une infrastructure cloud en Python grâce aux opérations du kit de développement cloud (CDK) d'AWS. Vous avez appris à.. :
- Créez votre première pile CDK.
- Définir et valider les buckets S3 et les fonctions Lambda en tant que ressources.
- Organisez un projet à l'aide de constructions personnalisées et de modèles à plusieurs piles.
- Appliquer les meilleures pratiques en matière de sécurité en appliquant le principe du moindre privilège.
- Automatisez les déploiements en combinant les actions GitHub et les pipelines CDK.
- Rédigez des tests pour valider la logique de votre infrastructure.
Maintenant que vous avez déployé votre première application CDK, voici quelques moyens de progresser :
- Utiliser des environnements paramétrés pour dev/staging/prod
- Ajouter des alarmes CloudWatch, API Gateway ou des fonctions Step
- Explorez les constructions CDK telles que
aws_s3_deployment
,aws_ecs_patterns
, etcdk.pipelines
- Convertissez vos constructions en une bibliothèque Python interne afin de pouvoir les réutiliser.
Pour continuer à apprendre et à construire, consultez le cours Introduction à AWS Boto en Python.le cours Introduction à AWS Boto en Python!
FAQ
Qu'est-ce que AWS CDK et en quoi est-il différent de CloudFormation ou de Terraform ?
AWS CDK vous permet de définir l'infrastructure cloud à l'aide de langages de programmation comme Python, tandis que CloudFormation et Terraform s'appuient sur JSON/YAML ou HCL. Le CDK offre une plus grande abstraction et une meilleure réutilisation grâce à des constructions.
Dois-je connaître CloudFormation pour utiliser AWS CDK ?
Non, CDK fait abstraction de la majeure partie de la complexité de CloudFormation. Cependant, la compréhension de CloudFormation est utile lorsque vous utilisez des constructions de niveau inférieur ou que vous dépannez des déploiements.
Puis-je déployer plusieurs environnements (par exemple, dev, prod) avec AWS CDK ?
Oui ! CDK prend en charge la configuration spécifique à l'environnement à l'aide de valeurs de contexte et de drapeaux CLI tels que cdk deploy -c env=prod
.
Comment puis-je tester mon code d'infrastructure CDK ?
Vous pouvez utiliser pytest avec les assertions de CDK et le module template pour écrire des tests unitaires qui vérifient les ressources et les configurations de votre pile avant le déploiement.
Que se passe-t-il dans les coulisses lorsque j'exécute cdk deploy ?
cdk deploy
synthétise votre code Python dans un modèle CloudFormation, le télécharge sur AWS et provisionne les ressources définies dans votre compte.
Rahul Sharma est ambassadeur AWS, architecte DevOps et blogueur technique spécialisé dans le cloud computing, les pratiques DevOps et les technologies open-source. Avec une expertise dans AWS, Kubernetes et Terraform, il simplifie les concepts complexes pour les apprenants et les professionnels à travers des articles et des tutoriels engageants. Rahul est passionné par la résolution des défis DevOps et par le partage des connaissances afin d'aider la communauté technologique.