最后审核时间:2026年5月
使用原生 Terraform 构建 MLA-C01 考试中的 AWS 服务——每次构建一个代码块,并紧扣考试领域。相同的代码可在 OpenTofu 上运行。
在本实验结束时,您将使用纯 Terraform 配置一个基于 SageMaker 的机器学习平台控制平面,包括一个用于训练数据和模型工件的 S3 存储桶、一个 SageMaker 假定的最小权限 IAM 角色、一个 SageMaker 模型包组(用于编目模型版本的注册表),以及一个响应模型批准事件的 EventBridge 规则,以便实现自动化生产部署。
我们特意避免配置数据平面——训练作业、端点、笔记本实例、Studio 域——因为它们在空闲时都会产生费用,会将实验变成一个费用陷阱。一旦控制平面到位,数据平面就能干净地接入:您将训练作业指向步骤 3 中的角色,它将工件写入步骤 2 中的存储桶,并将新版本注册到步骤 4 中的模型包组中。
每个资源都是纯粹的 Terraform。将这些代码片段放入单个 main.tf 文件中,运行 terraform init,然后逐步运行 terraform apply。
>= 1.5 或 OpenTofu >= 1.6。us-east-1 区域配置好 AWS CLI 身份验证(SageMaker 在大多数区域可用;us-east-1 拥有最广泛的功能覆盖,包括 SageMaker Pipelines)。本实验中的所有内容在空闲时均不产生费用:
我们特意没有配置的所有内容才是 SageMaker 产生费用的地方:
一旦您将训练或推理连接到本实验中,请密切关注费用。本实验配置的控制平面是您可以安全地保持运行的部分。
标准开场。SageMaker 是区域性的,大多数较新的 SageMaker 功能(Pipelines、Model Cards、JumpStart)首先在 us-east-1 和 us-west-2 区域推出——选择其中一个以减少意外情况。
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"
}
}
}每个 SageMaker 训练作业都从 S3 读取输入数据,并将其模型工件写回 S3——这是 SageMaker 暴露的存储接口。我们创建一个存储桶,其文件夹约定(training-data/、model-artifacts/)与 MLA-C01 参考架构相对应。
对于任何机器学习数据存储,静态加密是不可协商的——考试在“机器学习解决方案的安全、合规和治理”部分明确测试了这一点。为简化起见,我们在此使用 AES256;在生产环境中,客户管理的 KMS 密钥可提供更精细的审计跟踪。
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"
}
}SageMaker 训练作业、端点和 Pipelines 都以 IAM 角色身份执行。我们创建一个具有信任策略的角色,该策略指定 sagemaker.amazonaws.com,并将其权限范围精确限定为机器学习工作负载所需的权限:从训练数据前缀读取、写入模型工件前缀,以及将日志发送到 CloudWatch。考试反复测试这种最小权限模式。
在实验中,我们额外附加了 AWS 托管的 AmazonSageMakerFullAccess 策略,因为手动覆盖所有 SageMaker 操作将涉及数百行代码,这不是 MLA-C01 考试的重点。在生产环境中,您会收窄此权限——这是一个单独的加固练习。
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/*"
},
]
})
}一个 Model Package Group 是 SageMaker 的模型注册表——一个用于同一模型多个版本的命名容器,每个版本都有自己的状态(PendingManualApproval、Approved、Rejected)。MLA-C01 考试中涉及的每个 MLOps 场景都通过此对象进行:训练管道注册一个新版本 → MLOps 工程师审查 → 状态变为 Approved → CI/CD 管道检测到更改并将新模型部署到端点。
该组本身不产生任何费用——它只是元数据。一旦它存在,训练作业和 Pipelines 就可以对其调用 RegisterModel,SageMaker 会自动跟踪血缘。我们正在为步骤 5 中的 EventBridge 规则奠定基础。
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."
}每个 SageMaker 模型注册表操作都会发出一个 EventBridge 事件——注册、状态更改、删除。MLA-C01 的“部署和编排”领域测试的就是这种模式:模型批准应该触发下一步自动化(部署到预演环境、运行集成测试、呼叫待命人员),而无需人工在控制台中点击按钮。
我们创建了一个 EventBridge 规则,该规则匹配我们特定模型包组的 Approved 状态转换,并将 SNS 主题作为下游的占位符——在生产环境中,您会指向一个 Step Functions 状态机、一个 Lambda 或一个 CodePipeline 管道。结构保持不变;只有目标 ARN 会改变。
有了这最后一部分,控制平面链就完整了:一个训练作业(数据平面,此处未配置)将其工件写入步骤 2 中的 S3,假定步骤 3 中的角色来执行此操作,将新版本注册到步骤 4 中的模型包组中,并且任何批准都会通过步骤 5 中的 EventBridge 规则触发下游自动化。连接一个训练作业,循环就会自行运行。
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 会干净地拆除本实验中的所有内容。注意事项:
force_destroy = false(安全默认值)——如果您已向其中上传任何训练数据,请在销毁前通过控制台(或 aws s3 rm s3://<bucket> --recursive)清空它。aws sagemaker delete-model-package),然后再销毁。MLA-C01 涵盖了本实验未配置的许多 SageMaker 表面——训练作业(按秒计费的计算资源)、端点(24/7 计费的实例)、Studio 域(多用户 IDE)、笔记本实例(如果忘记停止则很容易 24/7 计费的单用户 IDE)、JumpStart(一键式基础模型部署)、特征存储、模型监控、Clarify(偏见检测)、Edge Manager、Ground Truth(标注)、Pipelines(所有这些之上的编排层)和 Autopilot。
我们专注于控制平面——那些您可以保持运行而不会出现意外账单的部分——因为这是所有其他 MLA-C01 模式所依赖的基础。您账户中的训练作业插槽指向本实验创建的角色和存储桶。端点部署读取此注册表引用的模型工件。Pipelines 协调注册到本实验构建的组中。
对于数据平面部分的动手实践,正确的做法是后续实验每次添加一个组件(一个运行一次即停止的训练作业;一个在明确预算警报下的单个端点)——绝不要一次性添加多个,因为成本是真实且累积的。其余概念性内容请参阅此认证页面的浏览、手册和 Editorial 部分。