Última revisão: maio de 2026
Construa os serviços da AWS do exame MLA-C01 com Terraform puro — um bloco de cada vez, cada um vinculado a um domínio do exame. O mesmo código funciona no OpenTofu.
Ao final deste laboratório, você terá provisionado, com Terraform simples, o plano de controle de uma plataforma de ML baseada no SageMaker — um bucket S3 para dados de treinamento e artefatos de modelo, uma função IAM de privilégio mínimo que o SageMaker assume, um grupo de pacotes de modelo do SageMaker (o registro que cataloga as versões do modelo) e uma regra do EventBridge que reage a eventos de aprovação de modelo para que a promoção para produção possa ser automatizada.
Evitamos deliberadamente o provisionamento do plano de dados — trabalhos de treinamento, endpoints, instâncias de notebook, domínios do Studio — porque todos eles geram custos enquanto ociosos e transformariam um laboratório em uma armadilha de cobrança. Uma vez que o plano de controle esteja no lugar, o plano de dados se conecta de forma limpa: você aponta um trabalho de treinamento para a função da Etapa 3, ele grava seu artefato no bucket da Etapa 2 e registra uma nova versão no grupo de pacotes de modelo da Etapa 4.
Cada recurso é Terraform puro. Solte os trechos de código em um único main.tf, execute terraform init e depois terraform apply passo a passo.
>= 1.5 ou OpenTofu >= 1.6.us-east-1 (o SageMaker está disponível na maioria das regiões; us-east-1 tem a cobertura de recursos mais ampla, incluindo SageMaker Pipelines).Tudo neste laboratório custa nada enquanto ocioso:
Tudo o que deliberadamente não provisionamos é onde os gastos com SageMaker acontecem:
Assim que você conectar o treinamento ou a inferência a este laboratório, fique atento à fatura. O plano de controle que este laboratório provisiona é a parte segura para deixar funcionando.
Abertura padrão. O SageMaker é regional, e a maioria dos recursos mais recentes do SageMaker (Pipelines, Model Cards, JumpStart) chegam primeiro em us-east-1 e us-west-2 — escolha uma dessas para ter menos surpresas.
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"
}
}
}Todo trabalho de treinamento do SageMaker lê dados de entrada do S3 e escreve seu artefato de modelo de volta para o S3 — essa é a interface de armazenamento que o SageMaker expõe. Criamos um bucket com uma convenção de pastas (training-data/, model-artifacts/) que espelha a arquitetura de referência MLA-C01.
A criptografia em repouso é inegociável para qualquer armazenamento de dados de ML — o exame testa isso explicitamente sob Segurança, Conformidade e Governança para Soluções de ML. Usamos AES256 aqui para simplificar; em produção, uma chave KMS gerenciada pelo cliente oferece um rastro de auditoria mais detalhado.
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"
}
}Trabalhos de treinamento do SageMaker, endpoints e Pipelines são todos executados sob uma função IAM. Criamos uma função com uma política de confiança que nomeia sagemaker.amazonaws.com e delimita suas permissões exatamente para o que uma carga de trabalho de ML precisa: ler do prefixo de dados de treinamento, gravar no prefixo de artefatos de modelo e emitir logs para o CloudWatch. O exame testa essa forma de privilégio mínimo repetidamente.
Para o laboratório, anexamos a política AmazonSageMakerFullAccess gerenciada pela AWS, porque cobrir cada ação do SageMaker manualmente levaria centenas de linhas e não é o que o MLA-C01 está testando. Em produção, você restringiria isso — o que é um exercício de endurecimento separado.
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/*"
},
]
})
}Um Grupo de Pacotes de Modelo é o registro de modelos do SageMaker — um contêiner nomeado para múltiplas versões do mesmo modelo, cada uma com seu próprio status (PendingManualApproval, Approved, Rejected). Toda história de MLOps que o MLA-C01 testa passa por este objeto: o pipeline de treinamento registra uma nova versão → o engenheiro de MLOps revisa → o status muda para Approved → o pipeline de CI/CD capta a alteração e implementa o novo modelo no endpoint.
O grupo em si não custa nada — são metadados. Uma vez que ele existe, trabalhos de treinamento e Pipelines podem chamar RegisterModel contra ele e o SageMaker rastreia a linhagem automaticamente. Estamos lançando as bases para a regra do EventBridge na Etapa 5 reagir.
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 ação de registro de modelo do SageMaker emite um evento do EventBridge — registro, mudanças de status, exclusões. O domínio de Implantação e Orquestração do MLA-C01 testa este padrão exato: a aprovação do modelo deve iniciar a automação da próxima etapa (implantar em staging, executar testes de integração, acionar plantonistas) sem que um humano aperte botões no console.
Criamos uma regra do EventBridge que corresponde às transições de status Approved para o nosso grupo de pacotes de modelo específico, e direcionamos um tópico SNS como o marcador de posição downstream — em produção, você apontaria para uma máquina de estado do Step Functions, uma Lambda ou um pipeline do CodePipeline. A estrutura permanece a mesma; apenas o ARN do destino muda.
Com esta peça final no lugar, a cadeia do plano de controle está completa: um trabalho de treinamento (plano de dados, não provisionado aqui) escreve seu artefato para o S3 da Etapa 2, assume a função da Etapa 3 para fazer isso, registra uma nova versão no grupo de pacotes de modelo da Etapa 4, e qualquer aprovação aciona a automação downstream via a regra do EventBridge da Etapa 5. Conecte um trabalho de treinamento e o loop se executa.
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 derruba tudo neste laboratório de forma limpa. Observações:
force_destroy = false (o padrão seguro) — se você carregou algum dado de treinamento para ele, esvazie-o via console (ou aws s3 rm s3://<bucket> --recursive) antes de destruir.aws sagemaker delete-model-package), depois destrua.O MLA-C01 abrange muitas superfícies do SageMaker que este laboratório não provisiona — Trabalhos de Treinamento (computação que é cobrada por segundo), Endpoints (instâncias que são cobradas 24/7), Domínios do Studio (IDE multiusuário), Instâncias de Notebook (IDE de usuário único que facilmente é cobrada 24/7 se esquecida), JumpStart (implantações de modelos de base com um clique), Feature Store, Model Monitor, Clarify (detecção de viés), Edge Manager, Ground Truth (rotulagem), Pipelines (a camada de orquestração acima de tudo isso) e Autopilot.
Nós nos concentramos no plano de controle — as partes que você pode deixar funcionando sem surpresas na cobrança — porque essa é a base à qual todos os outros padrões do MLA-C01 se conectam. Um slot de trabalho de treinamento em sua conta aponta para a função e o bucket que este laboratório criou. Uma implantação de endpoint lê o artefato de modelo que este registro referencia. Pipelines orquestram o registro no grupo que este laboratório construiu.
Para a prática prática com as peças do plano de dados, o movimento certo é um laboratório de acompanhamento que adiciona uma delas por vez (um único trabalho de treinamento que executa uma vez e para; um único endpoint por trás de um alarme de orçamento explícito) — nunca várias de uma vez, porque os custos são reais e cumulativos. A cobertura conceitual do restante está nas seções Navegar, Guia e Editorial desta página de certificação.