最終確認: 2026年5月
MLA-C01 試験の対象となる AWS サービスを、プレーンな Terraform を使用して構築します。1 ブロックずつ、それぞれ試験ドメインに関連付けられています。同じコードが OpenTofu でも動作します。
このラボの終了時には、シンプルなTerraformを使って、SageMakerベースのMLプラットフォームのコントロールプレーンをプロビジョニングしています。具体的には、トレーニングデータとモデルアーティファクト用の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が公開するストレージインターフェースです。MLA-C01の参照アーキテクチャを反映したフォルダー規約(training-data/、model-artifacts/)を持つ1つのバケットを作成します。
あらゆる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"
}
}SageMakerトレーニングジョブ、エンドポイント、およびPipelinesはすべてIAMロールの下で実行されます。信頼ポリシーで sagemaker.amazonaws.com を指定し、権限をMLワークロードが必要とするもの(トレーニングデータプレフィックスからの読み取り、モデルアーティファクトプレフィックスへの書き込み、CloudWatchへのログ出力)に厳密に限定したロールを1つ作成します。試験ではこの最小特権の形態が繰り返し問われます。
このラボでは、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/*"
},
]
})
}モデルパッケージグループは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のデプロイとオーケストレーションの領域では、この正確なパターンがテストされます。モデルの承認は、コンソールで人間がボタンを操作することなく、次の自動化ステップ(ステージングへのデプロイ、統合テストの実行、オンコール通知など)をトリガーするべきです。
ここでは、特定のモデルパッケージグループの Approved ステータス遷移に一致するEventBridgeルールを作成し、ダウンストリームのプレースホルダーとして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時間365日課金されるインスタンス)、Studioドメイン(マルチユーザーIDE)、ノートブックインスタンス(忘れられた場合24時間365日課金されやすいシングルユーザーIDE)、JumpStart(ワンクリックの基盤モデルデプロイ)、Feature Store、Model Monitor、Clarify(バイアス検出)、Edge Manager、Ground Truth(ラベリング)、Pipelines(これらすべてのオーケストレーションレイヤー)、およびAutopilotです。
私たちはコントロールプレーンにこだわります — 予期せぬ請求なしに稼働させ続けることができる部分です — なぜなら、それが他のすべてのMLA-C01パターンが接続する基盤となるからです。アカウント内のトレーニングジョブスロットは、このラボで作成したロールとバケットを指します。エンドポイントのデプロイは、このレジストリが参照するモデルアーティファクトを読み取ります。Pipelinesは、このラボで構築されたグループへの登録をオーケストレーションします。
データプレーンの要素を実践的に学ぶには、一度に1つずつ追加する(一度だけ実行されて停止する単一のトレーニングジョブ、明示的な予算アラームの背後にある単一のエンドポイントなど)フォローアップラボが適切なアプローチです。複数の要素を一度に導入することは避けてください。コストは現実的かつ累積的だからです。残りの概念的な内容は、この認定ページの閲覧、プレイブック、およびEditorialセクションに記載されています。