נבדק לאחרונה: מאי 2026
בנו את שירותי AWS של בחינת MLA-C01 עם Terraform פשוט — בלוק אחד בכל פעם, כאשר כל אחד מהם מקושר בחזרה לתחום במבחן. אותו הקוד עובד גם ב-OpenTofu.
בסיום מעבדה זו תקצה, עם Terraform פשוט, את מישור הבקרה של פלטפורמת ML מבוססת SageMaker — דלי S3 לנתוני אימון וחפצי מודל, תפקיד IAM בהרשאה מינימלית ש-SageMaker מקבל, קבוצת חבילות מודלים של SageMaker (הרישום שמקטלג גרסאות מודלים), וכלל EventBridge המגיב לאירועי אישור מודל כך שניתן יהיה להפוך את קידום הייצור לאוטומטי.
אנו נמנעים במכוון מהקצאת מישור הנתונים — משימות אימון, נקודות קצה, מופעי מחברת, דומייני Studio — מכיוון שכולם מחויבים גם כשהם לא פעילים ויהפכו מעבדה למלכודת חיוב. ברגע שמישור הבקרה קיים, מישור הנתונים מתחבר בצורה נקייה: אתה מכוון משימת אימון לתפקיד משלב 3, היא כותבת את החפץ שלה לדלי משלב 2, ורושמת גרסה חדשה בקבוצת חבילות המודלים משלב 4.
כל משאב הוא Terraform פשוט. שים את קטעי הקוד בקובץ main.tf יחיד, הפעל terraform init, ולאחר מכן terraform apply צעד אחר צעד.
>= 1.5 או OpenTofu >= 1.6.us-east-1 (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.
הצפנה במנוחה אינה ניתנת למשא ומתן עבור כל מאגר נתוני ML – הבחינה בודקת זאת במפורש תחת אבטחה, ציות וממשל עבור פתרונות ML. אנו משתמשים כאן ב-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"
}
}משימות אימון, נקודות קצה ו-Pipelines של SageMaker מבוצעות כולן תחת תפקיד IAM. אנו יוצרים תפקיד אחד עם מדיניות אמון המציינת את sagemaker.amazonaws.com ומגבילים את הרשאותיו בדיוק למה שנדרש לעומס עבודה של למידת מכונה: קריאה מקידומת נתוני האימון, כתיבה לקידומת חפצי המודל, ושליחת יומנים ל-CloudWatch. הבחינה בודקת שוב ושוב את צורת ההרשאה המינימלית הזו.
עבור המעבדה אנו מצרפים את מדיניות AmazonSageMakerFullAccess המנוהלת על ידי AWS בנוסף, מכיוון שכיסוי כל פעולת 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/*"
},
]
})
}קבוצת חבילות מודלים היא רישום המודלים של SageMaker – מיכל בעל שם עבור מספר גרסאות של אותו מודל, כל אחת עם סטטוס משלה (PendingManualApproval, Approved, Rejected). כל סיפור MLOps שבחינת MLA-C01 בודקת עובר דרך אובייקט זה: צינור אימון רושם גרסה חדשה ← מהנדס MLOps בודק ← הסטטוס משתנה ל-Approved ← צינור CI/CD קולט את השינוי ופורס את המודל החדש לנקודת הקצה.
הקבוצה עצמה אינה עולה כלום – היא מטא נתונים. ברגע שהיא קיימת, משימות אימון ו-Pipelines יכולות לקרוא ל-RegisterModel כנגדה ו-SageMaker עוקב אחר השושלת באופן אוטומטי. אנו מניחים את היסודות לכלל EventBridge בשלב 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."
}כל פעולת רישום מודל של SageMaker משגרת אירוע EventBridge – רישום, שינויי סטטוס, מחיקות. תחום פריסה ותזמור של MLA-C01 בודק דפוס מדויק זה: אישור מודל צריך להפעיל את האוטומציה של השלב הבא (פריסה לסביבת ביניים, הפעלת בדיקות אינטגרציה, זימון כונן) ללא מעורבות אנושית בלחיצת כפתורים בקונסולה.
אנו יוצרים כלל EventBridge התואם מעברי סטטוס Approved עבור קבוצת חבילות המודלים הספציפית שלנו, וממקדים נושא SNS כמקום שמור במורד הזרם – בייצור היית מכוון למכונת מצבים של Step Functions, לפונקציית Lambda, או לצינור CodePipeline. המבנה נשאר זהה; רק ה-ARN של היעד משתנה.
עם החלק הסופי הזה במקום, שרשרת מישור הבקרה הושלמה: משימת אימון (מישור נתונים, לא מסופק כאן) כותבת את חפץ המודל שלה ל-S3 משלב 2, מקבלת את התפקיד משלב 3 כדי לבצע זאת, רושמת גרסה חדשה בקבוצת חבילות המודלים משלב 4, וכל אישור מפעיל את האוטומציה במורד הזרם באמצעות כלל EventBridge משלב 5. חבר משימת אימון והלולאה תפעל מעצמה.
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 (סביבת פיתוח משולבת למשתמשים מרובים), מופעי מחברת (סביבת פיתוח משולבת למשתמש יחיד שמחויבת בקלות 24/7 אם נשכחה), JumpStart (פריסות מודלי יסוד בלחיצה אחת), Feature Store, Model Monitor, Clarify (זיהוי הטיה), Edge Manager, Ground Truth (תיעוד), Pipelines (שכבת התזמור מעל כל זה), ו-Autopilot.
אנו נצמדים למישור הבקרה — החלקים שתוכל להשאיר פועלים ללא הפתעות חיוב — מכיוון שזהו הבסיס שאליו מתחברים כל דפוסי MLA-C01 האחרים. חריץ משימת אימון בחשבונך מצביע על התפקיד והדלי שמעבדה זו יצרה. פריסת נקודת קצה קוראת את חפץ המודל שהרישום הזה מפנה אליו. Pipelines מתזמרות רישום לקבוצה שמעבדה זו בנתה.
לתרגול מעשי עם חלקי מישור הנתונים, המהלך הנכון הוא מעבדת המשך שמוסיפה אחד מהם בכל פעם (משימת אימון יחידה שפועלת פעם אחת ונעצרת; נקודת קצה יחידה מאחורי התראת תקציב מפורשת) — אף פעם לא כמה בבת אחת, כי העלויות אמיתיות ומצטברות. כיסוי קונספטואלי של השאר נמצא בתיקיות עיון, מדריך, ו-Editorial בדף הסמכה זה.