Dernière révision : mai 2026
Configurez les services AWS figurant à l'examen CLF-C02 avec Terraform simple — un bloc à la fois, chacun étant lié à un domaine de l'examen. Le même code fonctionne sur OpenTofu.
À la fin de ce labo, vous aurez provisionné, avec du Terraform simple, la première charge de travail AWS réaliste la plus petite – un compartiment S3 privé chiffré, un rôle IAM avec le moindre privilège, une instance EC2 de niveau gratuit, et une alarme de facturation qui vous envoie un e-mail avant qu'AWS ne le fasse. Chaque ressource correspond à l'un des quatre domaines d'examen CLF-C02.
Chaque ressource est du Terraform simple – le même code fonctionne sans modification sur OpenTofu. Il n'y a pas de variables, pas de modules, pas d'état distant. Déposez les extraits de code suivants dans un seul fichier main.tf, exécutez terraform init une fois, puis terraform apply étape par étape.
>= 1.5 ou OpenTofu >= 1.6.us-east-1 car c'est là que les données de facturation sont centralisées.Toutes les ressources de ce labo s'inscrivent dans le niveau gratuit AWS pour les nouveaux comptes (12 mois à compter de l'inscription) :
t3.micro: 750 heures/mois gratuites.En dehors du niveau gratuit, l'ensemble de la pile coûte moins de 10 $/mois même en fonctionnant 24h/24 et 7j/7. Cela dit : les ressources inactives sont toujours facturées une fois que le niveau gratuit expire – détruisez-les lorsque vous avez terminé. L'alarme de facturation que nous construisons à l'étape 4 est votre filet de sécurité si vous oubliez.
Chaque charge de travail commence par indiquer à Terraform la version que nous attendons de lui et le fournisseur AWS que nous utiliserons. Nous épinglons le fournisseur AWS à ~> 5.60 et utilisons par défaut us-east-1 – la région la plus ancienne d'AWS, où les données de facturation sont centralisées et où la plupart des services sont lancés en premier.
Déposez ceci dans un nouveau fichier main.tf pour commencer. Tout ce qui suit dans le labo se trouve dans le même fichier.
Le bloc default_tags du fournisseur attache les mêmes étiquettes à chaque ressource étiquetable que nous allons créer. AWS Cost Explorer + les rapports d'attribution des coûts regroupent les dépenses par étiquette – bien faire cela dès le premier jour est l'investissement de contrôle des coûts le moins cher que vous ferez jamais, et cela correspond directement au domaine Facturation et tarification du CLF-C02.
terraform {
required_version = ">= 1.5"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.60"
}
}
}
provider "aws" {
region = "us-east-1"
default_tags {
tags = {
Project = "certlabpro-clf-c02"
ManagedBy = "terraform"
Environment = "lab"
}
}
}S3 est la couche de stockage derrière presque toutes les charges de travail AWS – chaque domaine CLF-C02 y fait référence. Nous créons un compartiment, bloquons l'accès public (activé par défaut pour les nouveaux compartiments depuis 2023, mais l'explicite est préférable), et activons le chiffrement côté serveur avec AES256.
Ces trois ressources ensemble – compartiment, bloc d'accès public, chiffrement – constituent le minimum responsable par défaut pour tout compartiment S3. L'examen CLF-C02 présente cela comme le modèle de responsabilité partagée : AWS nous fournit une plateforme sécurisée, mais nous configurons le chiffrement + les contrôles d'accès. Le compartiment fait partie de la « responsabilité du client ».
resource "aws_s3_bucket" "app_data" {
bucket_prefix = "certlabpro-clf-c02-"
}
resource "aws_s3_bucket_public_access_block" "app_data" {
bucket = aws_s3_bucket.app_data.id
block_public_acls = true
block_public_policy = true
ignore_public_acls = true
restrict_public_buckets = true
}
resource "aws_s3_bucket_server_side_encryption_configuration" "app_data" {
bucket = aws_s3_bucket.app_data.id
rule {
apply_server_side_encryption_by_default {
sse_algorithm = "AES256"
}
}
}EC2 est le service AWS que tout candidat CLF-C02 est censé connaître sur le bout des doigts. Nous utilisons le plus petit type d'instance éligible au niveau gratuit (t3.micro) et lui attribuons un profil d'instance IAM afin qu'il puisse lire à partir du compartiment que nous avons créé à l'étape 2 – sans jamais intégrer les identifiants AWS sur la machine. C'est le modèle AWS canonique pour l'authentification application-vers-AWS et il apparaît dans plusieurs variantes de questions CLF-C02.
Le bloc data récupère dynamiquement la dernière AMI Amazon Linux 2023 – épingler à un ID d'AMI spécifique casserait le labo lorsque AWS retirerait l'image. Le groupe de sécurité refuse tout trafic entrant ; nous ajouterions des règles d'entrée dans une charge de travail réelle, mais pour ce labo, une instance verrouillée est le bon défaut.
data "aws_ami" "al2023" {
most_recent = true
owners = ["amazon"]
filter {
name = "name"
values = ["al2023-ami-*-kernel-6.1-x86_64"]
}
}
resource "aws_iam_role" "ec2_app" {
name = "certlabpro-clf-c02-ec2-app"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Effect = "Allow"
Principal = { Service = "ec2.amazonaws.com" }
Action = "sts:AssumeRole"
}]
})
}
resource "aws_iam_role_policy" "ec2_app_s3_read" {
name = "read-app-data-bucket"
role = aws_iam_role.ec2_app.id
policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Effect = "Allow"
Action = ["s3:GetObject", "s3:ListBucket"]
Resource = [aws_s3_bucket.app_data.arn, "${aws_s3_bucket.app_data.arn}/*"]
}]
})
}
resource "aws_iam_instance_profile" "ec2_app" {
name = "certlabpro-clf-c02-ec2-app"
role = aws_iam_role.ec2_app.name
}
resource "aws_security_group" "ec2_app" {
name = "certlabpro-clf-c02-ec2-app"
description = "Locked down by default; add ingress rules per workload."
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
}
resource "aws_instance" "app" {
ami = data.aws_ami.al2023.id
instance_type = "t3.micro"
iam_instance_profile = aws_iam_instance_profile.ec2_app.name
vpc_security_group_ids = [aws_security_group.ec2_app.id]
metadata_options {
http_endpoint = "enabled"
http_tokens = "required" # IMDSv2 only — required for SCS-C03 best practice
}
}Le CLF-C02 consacre 16 % de l'examen à la Facturation, la tarification et le support. La chose la plus concrète que vous puissiez construire dans cet espace est une alarme de facturation CloudWatch : AWS publie les frais estimés au niveau du compte sous forme de métrique, et nous définissons un seuil au-dessus duquel nous voulons en être informés. L'alarme publie sur un sujet SNS, qui nous envoie un e-mail.
Les alarmes de métriques de facturation doivent être créées dans us-east-1 quelle que soit la région où s'exécutent vos charges de travail – c'est pourquoi nous avons utilisé us-east-1 par défaut à l'étape 1. Vous devrez également activer les Alertes de facturation une fois, dans la console du compte, sous Facturation → Préférences de facturation → Recevoir des alertes de facturation. Terraform ne peut pas activer ou désactiver cela ; c'est un paramètre au niveau du compte en dehors de l'infrastructure en tant que code.
Après terraform apply, AWS envoie un e-mail de confirmation à l'adresse dans email_endpoint – cliquez sur Confirmer l'abonnement une fois, et l'alarme vous parviendra réellement lorsque le seuil sera atteint.
resource "aws_sns_topic" "billing_alerts" {
name = "certlabpro-clf-c02-billing-alerts"
}
resource "aws_sns_topic_subscription" "billing_alerts_email" {
topic_arn = aws_sns_topic.billing_alerts.arn
protocol = "email"
endpoint = "you@example.com" # replace with your real email
}
resource "aws_cloudwatch_metric_alarm" "monthly_bill_over_10" {
alarm_name = "certlabpro-clf-c02-monthly-bill-over-10-usd"
comparison_operator = "GreaterThanThreshold"
evaluation_periods = 1
metric_name = "EstimatedCharges"
namespace = "AWS/Billing"
period = 21600 # 6 hours — billing metric is slow-moving
statistic = "Maximum"
threshold = 10
alarm_description = "Estimated monthly AWS charges exceeded $10 USD."
alarm_actions = [aws_sns_topic.billing_alerts.arn]
dimensions = {
Currency = "USD"
}
}Un terraform destroy standard détruit tout ce qui a été créé dans ce labo. Deux remarques :
default-tags de l'étape 1 facilitent la recherche dans votre Cost Explorer pour Project = certlabpro-clf-c02 et confirment que rien ne persiste.Le CLF-C02 couvre un large catalogue de services — RDS, Lambda, détails VPC, CloudFront, Route 53, ECS, EKS, Aurora, Elastic Beanstalk, AppSync, et bien d'autres. Nous ne les provisionnons délibérément pas dans ce labo fondamental.
L'objectif du CLF-C02 est une fluidité conceptuelle large, et non un provisionnement approfondi service par service. Les quatre étapes ci-dessus touchent une ressource de chacun des quatre domaines d'examen — Concepts du cloud (IAM + S3 comme primitives de plateforme et de stockage), Sécurité et conformité (IAM à moindre privilège, chiffrement au repos, IMDSv2), Technologies et services cloud (EC2 comme service de calcul canonique), et Facturation, tarification et support (l'alarme de facturation CloudWatch). C'est la bonne approche pour l'examen.
Pour une couverture service par service, consultez les sections Parcourir et Editorial de cette page de certification – elles référencent chaque service du champ d'application du CLF-C02 avec des descriptions d'une ligne et des liens vers les domaines d'examen. La valeur pratique de ce labo réside dans la compréhension de la connexion des quatre piliers dès le premier jour, et non dans une visite de tous les plus de 200 services AWS.