Última revisión: mayo de 2026
Crea los servicios de AWS del examen MLA-C01 con Terraform puro: bloque a bloque, cada uno vinculado a un dominio del examen. El mismo código funciona en OpenTofu.
Al final de este laboratorio, habrás aprovisionado, con Terraform simple, el plano de control de una plataforma de ML basada en SageMaker: un bucket de S3 para datos de entrenamiento y artefactos de modelos, un rol de IAM de privilegio mínimo que SageMaker asume, un grupo de paquetes de modelos de SageMaker (el registro que cataloga las versiones de modelos) y una regla de EventBridge que reacciona a los eventos de aprobación de modelos para que la promoción a producción pueda automatizarse.
Evitamos deliberadamente el aprovisionamiento del plano de datos —trabajos de entrenamiento, puntos de conexión, instancias de notebook, dominios de Studio— porque todos facturan mientras están inactivos y convertirían un laboratorio en una trampa de facturación. Una vez que el plano de control está en su lugar, el plano de datos se conecta limpiamente: apuntas un trabajo de entrenamiento al rol del Paso 3, este escribe su artefacto en el bucket del Paso 2 y registra una nueva versión en el grupo de paquetes de modelos del Paso 4.
Cada recurso es Terraform simple. Coloca los fragmentos en un único archivo main.tf, ejecuta terraform init y luego terraform apply paso a paso.
>= 1.5 o OpenTofu >= 1.6.us-east-1 (SageMaker está disponible en la mayoría de las regiones; us-east-1 tiene la cobertura de características más amplia, incluyendo SageMaker Pipelines).Todo en este laboratorio no cuesta nada mientras está inactivo:
Todo lo que deliberadamente no aprovisionamos es donde se genera el gasto de SageMaker:
Una vez que integres el entrenamiento o la inferencia en este laboratorio, vigila la factura. El plano de control que este laboratorio aprovisiona es la parte segura para dejar en ejecución.
Apertura estándar. SageMaker es regional, y la mayoría de las características más nuevas de SageMaker (Pipelines, Model Cards, JumpStart) se implementan primero en us-east-1 y us-west-2; elige una de estas para tener las menores sorpresas.
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"
}
}
}Cada trabajo de entrenamiento de SageMaker lee datos de entrada de S3 y escribe su artefacto de modelo de vuelta en S3; esa es la interfaz de almacenamiento que SageMaker expone. Creamos un bucket con una convención de carpetas (training-data/, model-artifacts/) que refleja la arquitectura de referencia MLA-C01.
El cifrado en reposo no es negociable para ningún almacén de datos de ML; el examen evalúa esto explícitamente bajo Seguridad, Cumplimiento y Gobernanza para Soluciones de ML. Aquí usamos AES256 por simplicidad; en producción, una clave KMS gestionada por el cliente te proporciona una pista de auditoría más detallada.
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"
}
}Los trabajos de entrenamiento, puntos de conexión y Pipelines de SageMaker se ejecutan bajo un rol de IAM. Creamos un rol con una política de confianza que nombra a sagemaker.amazonaws.com y limita sus permisos exactamente a lo que una carga de trabajo de ML necesita: leer del prefijo de datos de entrenamiento, escribir en el prefijo de artefactos de modelos y emitir registros a CloudWatch. El examen evalúa este modelo de privilegio mínimo una y otra vez.
Para el laboratorio, adjuntamos la política gestionada por AWS AmazonSageMakerFullAccess encima, porque cubrir cada acción de SageMaker a mano son cientos de líneas y no es lo que evalúa el MLA-C01. En producción, lo restringirías; ese es un ejercicio de endurecimiento aparte.
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 Grupo de Paquetes de Modelos es el registro de modelos de SageMaker: un contenedor con nombre para múltiples versiones del mismo modelo, cada una con su propio estado (PendingManualApproval, Approved, Rejected). Cada historia de MLOps que evalúa el MLA-C01 pasa por este objeto: el pipeline de entrenamiento registra una nueva versión → el ingeniero de MLOps revisa → el estado cambia a Approved → el pipeline de CI/CD toma el cambio y despliega el nuevo modelo en el punto de conexión.
El grupo en sí no cuesta nada; es metadatos. Una vez que existe, los trabajos de entrenamiento y los Pipelines pueden llamar a RegisterModel contra él y SageMaker rastrea el linaje automáticamente. Estamos sentando las bases a las que reaccionará la regla de EventBridge en el Paso 5.
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."
}Cada acción de registro de modelos de SageMaker emite un evento de EventBridge: registro, cambios de estado, eliminaciones. El dominio Implementación y Orquestación del MLA-C01 evalúa este patrón exacto: la aprobación de un modelo debe iniciar la automatización del siguiente paso (desplegar en staging, ejecutar pruebas de integración, notificar al equipo de guardia) sin que un humano presione botones en la consola.
Creamos una regla de EventBridge que coincide con las transiciones de estado Approved para nuestro grupo de paquetes de modelos específico, y apuntamos a un tema de SNS como el marcador de posición para la parte posterior; en producción, apuntarías a una máquina de estado de Step Functions, una Lambda o un pipeline de CodePipeline. La estructura permanece igual; solo cambia el ARN del destino.
Con esta pieza final en su lugar, la cadena del plano de control está completa: un trabajo de entrenamiento (plano de datos, no aprovisionado aquí) escribe su artefacto en S3 desde el Paso 2, asume el rol del Paso 3 para hacerlo, registra una nueva versión en el grupo de paquetes de modelos del Paso 4, y cualquier aprobación activa la automatización posterior a través de la regla de EventBridge del Paso 5. Conecta un trabajo de entrenamiento y el ciclo se ejecuta solo.
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 destruye todo en este laboratorio de forma limpia. Notas:
force_destroy = false (el valor predeterminado seguro); si has cargado datos de entrenamiento en él, vacíalo a través de la consola (o aws s3 rm s3://<bucket> --recursive) antes de destruirlo.aws sagemaker delete-model-package), luego destruye.El MLA-C01 cubre muchas superficies de SageMaker que este laboratorio no aprovisiona: trabajos de entrenamiento (cómputo que factura por segundo), puntos de conexión (instancias que facturan 24/7), dominios de Studio (IDE multiusuario), instancias de notebook (IDE de un solo usuario que fácilmente factura 24/7 si se olvida), JumpStart (despliegues de modelos fundacionales con un clic), Feature Store, Model Monitor, Clarify (detección de sesgos), Edge Manager, Ground Truth (etiquetado), Pipelines (la capa de orquestación por encima de todo esto) y Autopilot.
Nos ceñimos al plano de control —las partes que puedes dejar en ejecución sin sorpresas en la facturación— porque esa es la base a la que se adjuntan todos los demás patrones del MLA-C01. Una ranura de trabajo de entrenamiento en tu cuenta apunta al rol y al bucket que este laboratorio creó. Un despliegue de punto de conexión lee el artefacto del modelo que este registro referencia. Los Pipelines orquestan el registro en el grupo que este laboratorio construyó.
Para la práctica práctica con las piezas del plano de datos, el movimiento correcto es un laboratorio de seguimiento que agrega una de ellas a la vez (un único trabajo de entrenamiento que se ejecuta una vez y se detiene; un único punto de conexión detrás de una alarma de presupuesto explícita) —nunca varias a la vez, porque los costos son reales y acumulativos. La cobertura conceptual del resto se encuentra en las secciones Buscar, Manual y Editorial de esta página de certificación.