Dernière révision : mai 2026
Configurez les services AWS figurant à l'examen MLA-C01 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 laboratoire, vous aurez provisionné, avec du Terraform simple, le plan de contrôle d'une plateforme ML basée sur SageMaker — un compartiment S3 pour les données d'entraînement et les artefacts de modèle, un rôle IAM à privilèges minimaux que SageMaker assume, un groupe de packages de modèle SageMaker (le registre qui catalogue les versions de modèle), et une règle EventBridge qui réagit aux événements d'approbation de modèle afin que la promotion en production puisse être automatisée.
Nous évitons délibérément de provisionner le plan de données — les tâches d'entraînement, les points de terminaison, les instances de bloc-notes, les domaines Studio — car ils facturent tous en mode inactif et transformeraient un laboratoire en piège de facturation. Une fois le plan de contrôle en place, le plan de données s'y connecte proprement : vous pointez une tâche d'entraînement vers le rôle de l'étape 3, elle écrit son artefact dans le compartiment de l'étape 2, et enregistre une nouvelle version dans le groupe de packages de modèle de l'étape 4.
Chaque ressource est du Terraform simple. Déposez les extraits dans un seul fichier main.tf, exécutez terraform init, puis terraform apply étape par étape.
>= 1.5 ou OpenTofu >= 1.6.us-east-1 (SageMaker est disponible dans la plupart des régions ; us-east-1 offre la couverture de fonctionnalités la plus large, y compris SageMaker Pipelines).Tout ce qui se trouve dans ce laboratoire ne coûte rien en mode inactif :
Tout ce que nous n'avons délibérément pas provisionné est là où les dépenses SageMaker se produisent :
Une fois que vous connectez l'entraînement ou l'inférence à ce laboratoire, surveillez votre facture. Le plan de contrôle que ce laboratoire provisionne est la partie que vous pouvez laisser tourner en toute sécurité.
Ouverture standard. SageMaker est régional, et la plupart des nouvelles fonctionnalités de SageMaker (Pipelines, Model Cards, JumpStart) sont d'abord disponibles dans us-east-1 et us-west-2 — choisissez l'une de ces régions pour éviter les surprises.
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-mla-c01"
ManagedBy = "terraform"
}
}
}Chaque tâche d'entraînement SageMaker lit les données d'entrée depuis S3 et écrit son artefact de modèle vers S3 — c'est l'interface de stockage que SageMaker expose. Nous créons un seul compartiment avec une convention de dossiers (training-data/, model-artifacts/) qui reflète l'architecture de référence MLA-C01.
Le chiffrement au repos est non négociable pour tout magasin de données ML — l'examen teste cela explicitement sous Sécurité, conformité et gouvernance pour les solutions ML. Nous utilisons AES256 ici pour la simplicité ; en production, une clé KMS gérée par le client vous offre une piste d'audit plus fine.
resource "aws_s3_bucket" "ml" {
bucket_prefix = "certlabpro-mla-c01-"
}
resource "aws_s3_bucket_public_access_block" "ml" {
bucket = aws_s3_bucket.ml.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" "ml" {
bucket = aws_s3_bucket.ml.id
rule {
apply_server_side_encryption_by_default {
sse_algorithm = "AES256"
}
}
}
resource "aws_s3_bucket_versioning" "ml" {
bucket = aws_s3_bucket.ml.id
versioning_configuration {
status = "Enabled"
}
}Les tâches d'entraînement, les points de terminaison et les Pipelines SageMaker s'exécutent tous sous un rôle IAM. Nous créons un rôle avec une politique de confiance qui nomme sagemaker.amazonaws.com et limite ses permissions à exactement ce dont une charge de travail ML a besoin : lire à partir du préfixe des données d'entraînement, écrire vers le préfixe des artefacts de modèle et émettre des journaux vers CloudWatch. L'examen teste cette forme de moindre privilège encore et encore.
Pour le laboratoire, nous attachons la politique AmazonSageMakerFullAccess gérée par AWS en plus, car couvrir chaque action SageMaker à la main représenterait des centaines de lignes et ce n'est pas ce que teste MLA-C01. En production, vous réduiriez cela — c'est un exercice de durcissement distinct.
resource "aws_iam_role" "sagemaker_exec" {
name = "certlabpro-mla-c01-sagemaker-exec"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Effect = "Allow"
Principal = { Service = "sagemaker.amazonaws.com" }
Action = "sts:AssumeRole"
}]
})
}
resource "aws_iam_role_policy_attachment" "sagemaker_full" {
role = aws_iam_role.sagemaker_exec.name
policy_arn = "arn:aws:iam::aws:policy/AmazonSageMakerFullAccess"
}
resource "aws_iam_role_policy" "sagemaker_lab_bucket" {
name = "lab-bucket-read-write"
role = aws_iam_role.sagemaker_exec.id
policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Effect = "Allow"
Action = ["s3:GetObject", "s3:ListBucket"]
Resource = [aws_s3_bucket.ml.arn, "${aws_s3_bucket.ml.arn}/training-data/*"]
},
{
Effect = "Allow"
Action = "s3:PutObject"
Resource = "${aws_s3_bucket.ml.arn}/model-artifacts/*"
},
]
})
}Un groupe de packages de modèle est le registre de modèles de SageMaker — un conteneur nommé pour plusieurs versions du même modèle, chacune avec son propre statut (PendingManualApproval, Approved, Rejected). Chaque scénario MLOps que MLA-C01 teste passe par cet objet : le pipeline d'entraînement enregistre une nouvelle version → l'ingénieur MLOps examine → le statut passe à Approved → le pipeline CI/CD prend en compte le changement et déploie le nouveau modèle vers le point de terminaison.
Le groupe lui-même ne coûte rien — c'est des métadonnées. Une fois qu'il existe, les tâches d'entraînement et les Pipelines peuvent appeler RegisterModel dessus et SageMaker suit la lignée automatiquement. Nous posons les bases auxquelles la règle EventBridge de l'étape 5 réagira.
resource "aws_sagemaker_model_package_group" "main" {
model_package_group_name = "certlabpro-mla-c01-models"
model_package_group_description = "Lab-only model registry for the MLA-C01 walkthrough."
}Chaque action de registre de modèle SageMaker émet un événement EventBridge — enregistrement, changements de statut, suppressions. Le domaine Déploiement et Orchestration de MLA-C01 teste ce modèle exact : l'approbation du modèle devrait déclencher l'automatisation de l'étape suivante (déploiement en pré-production, exécution de tests d'intégration, alerte de l'astreinte) sans intervention humaine dans la console.
Nous créons une règle EventBridge qui correspond aux transitions de statut Approved pour notre groupe de packages de modèle spécifique, et ciblons un sujet SNS comme substitut en aval — en production, vous pointeriez vers une machine d'état Step Functions, une fonction Lambda ou un pipeline CodePipeline. La structure reste la même ; seul l'ARN cible change.
Avec cette dernière pièce en place, la chaîne du plan de contrôle est complète : une tâche d'entraînement (plan de données, non provisionné ici) écrit son artefact dans S3 à partir de l'étape 2, assume le rôle de l'étape 3 pour le faire, enregistre une nouvelle version dans le groupe de packages de modèle de l'étape 4, et toute approbation déclenche l'automatisation en aval via la règle EventBridge de l'étape 5. Connectez une tâche d'entraînement et la boucle s'exécute d'elle-même.
resource "aws_sns_topic" "model_approvals" {
name = "certlabpro-mla-c01-model-approvals"
}
resource "aws_cloudwatch_event_rule" "model_approved" {
name = "certlabpro-mla-c01-model-approved"
description = "Fires when a model version in our registry is approved."
event_pattern = jsonencode({
source = ["aws.sagemaker"]
"detail-type" = ["SageMaker Model Package State Change"]
detail = {
ModelPackageGroupName = [aws_sagemaker_model_package_group.main.model_package_group_name]
ModelApprovalStatus = ["Approved"]
}
})
}
resource "aws_cloudwatch_event_target" "notify_sns" {
rule = aws_cloudwatch_event_rule.model_approved.name
arn = aws_sns_topic.model_approvals.arn
}
resource "aws_sns_topic_policy" "allow_events" {
arn = aws_sns_topic.model_approvals.arn
policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Effect = "Allow"
Principal = { Service = "events.amazonaws.com" }
Action = "sns:Publish"
Resource = aws_sns_topic.model_approvals.arn
}]
})
}terraform destroy supprime proprement tout ce qui se trouve dans ce laboratoire. Remarques :
force_destroy = false (le comportement par défaut sécurisé) — si vous y avez téléchargé des données d'entraînement, videz-le via la console (ou aws s3 rm s3://<bucket> --recursive) avant de le détruire.aws sagemaker delete-model-package), puis détruisez.MLA-C01 couvre de nombreuses surfaces SageMaker que ce laboratoire ne provisionne pas — Tâches d'entraînement (calcul facturé à la seconde), Points de terminaison (instances facturées 24h/24 et 7j/7), Domaines Studio (IDE multi-utilisateurs), Instances de bloc-notes (IDE mono-utilisateur qui facture facilement 24h/24 et 7j/7 si oublié), JumpStart (déploiements de modèles de fondation en un clic), Feature Store, Model Monitor, Clarify (détection de biais), Edge Manager, Ground Truth (étiquetage), Pipelines (la couche d'orchestration au-dessus de tout cela), et Autopilot.
Nous nous en tenons au plan de contrôle — les parties que vous pouvez laisser tourner sans surprises de facturation — car c'est la base à laquelle tous les autres modèles MLA-C01 se rattachent. Un emplacement de tâche d'entraînement dans votre compte pointe vers le rôle et le compartiment créés par ce laboratoire. Un déploiement de point de terminaison lit l'artefact de modèle référencé par ce registre. Les Pipelines orchestrent l'enregistrement dans le groupe construit par ce laboratoire.
Pour la pratique pratique avec les éléments du plan de données, la bonne approche est un laboratoire de suivi qui ajoute un seul d'entre eux à la fois (une seule tâche d'entraînement qui s'exécute une fois et s'arrête ; un seul point de terminaison derrière une alarme de budget explicite) — jamais plusieurs en une seule fois, car les coûts sont réels et cumulatifs. La couverture conceptuelle du reste se trouve dans les sections Parcourir, Guide et Editorial de cette page de certification.