נבדק לאחרונה: מאי 2026
בנו את שירותי AWS של בחינת AIF-C01 עם Terraform פשוט — בלוק אחד בכל פעם, כאשר כל אחד מהם מקושר בחזרה לתחום במבחן. אותו הקוד עובד גם ב-OpenTofu.
בסיום מעבדה זו תגדירו, באמצעות Terraform פשוט, סביבת Amazon Bedrock פעילה המציגה ארבעה מחמשת תחומי הבחינה של AIF-C01: אחסון Amazon S3 עבור קלטים ופלטים של AI, תפקיד AWS IAM עם הרשאות מינימליות (least-privilege) ש-Amazon Bedrock יכול להניח כדי להפעיל מודלי יסוד (foundation models), מעקה בטיחות (guardrail) המסנן בקשות ותגובות עבור בטיחות ומידע אישי מזהה (PII), ותיעוד הפעלות (invocation logging) ברמת החשבון והאזור.
כל משאב הוא Terraform פשוט — אותו הקוד עובד ללא שינוי גם ב-OpenTofu. אין משתנים, אין מודולים ואין מצב מרוחק (remote state). העתיקו את קטעי הקוד הבאים לקובץ main.tf יחיד, הריצו terraform init פעם אחת, ואז הריצו terraform apply שלב אחר שלב.
>= 1.5 או OpenTofu >= 1.6.us-east-1 מכיוון ש-Amazon Bedrock ומודלי היסוד החדשים ביותר שלו מופצים שם תחילה.רוב המשאבים במעבדה זו אינם עולים דבר כאשר הם אינם פעילים: תפקידי AWS IAM, הגדרת מעקה הבטיחות (guardrail), הגדרת התיעוד (logging), באקט Amazon S3 ריק וקבוצת יומנים של Amazon CloudWatch Logs ללא אירועים הם כולם בחינם.
סעיפי חיוב שאתם עשויים לראות בחשבונית אם תשתמשו בפועל במעבדה:
מה שהשמטנו בכוונה: המעבדה אינה יוצרת Amazon Bedrock Knowledge Base (מסד ידע). מסדי ידע דורשים אוסף OpenSearch Serverless שמחירו המינימלי הוא כ-350$ בחודש כאשר הוא אינו פעיל. זהו נושא שנמצא מחוץ לטווח של מעבדה זו — עיינו בדף ההסמכה של AIF-C01 אם ברצונכם ללמוד על מסדי ידע באופן תיאורטי ללא פריסה שלהם.
לפני שנצטרך ליצור משאבים כלשהם, עלינו להגדיר ל-Terraform באיזו גרסה שלו אנו מצפים להשתמש ובאיזה ספק (provider) של AWS נשתמש. אנו נועלים את ספק AWS על ~> 5.60 מכיוון שכל משאב הקשור ל-Amazon Bedrock שבו ניגע במעבדה זו התווסף בגרסה זו, ואנו פורסים את הכל באזור us-east-1 — AWS מפיצה שם מודלי יסוד תחילה, ורוב השאלות בבחינת AIF-C01 מניחות זמינות ב-us-east-1 כאשר הן מתייחסות לשירות "החדש ביותר".
הוסיפו קוד זה לקובץ main.tf חדש כדי להתחיל. כל מה שיבוא בהמשך המעבדה ייכנס לאותו הקובץ.
terraform {
required_version = ">= 1.5"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.60"
}
}
}
provider "aws" {
region = "us-east-1"
}כל שירות AI של AWS שנשתמש בו במעבדה זו — Amazon Bedrock כעת, ותיעוד הביקורת (audit logging) שנחבר בשלב 5 — קורא קלטים וכותב פלטים דרך Amazon S3, כך שרכיב התשתית הממשי הראשון שלנו הוא באקט (bucket). נחזור אליו כמעט בכל שלב בהמשך.
אנו מפעילים ניהול גרסאות (versioning) כדי שניתן יהיה לשחזר העלאה פגומה, חוסמים גישה ציבורית (אלו קלטי אימון ויומני הפעלה של מודלים, לא קבצי אתר אינטרנט), ומפעילים הצפנת AES256 במצב מנוחה (encryption at rest). הנקודה האחרונה חשובה עבור AIF-C01 — תחום הבחינה Security, Compliance, and Governance for AI Solutions בודק במפורש שאתם בוחרים בהצפנה במצב מנוחה כברירת מחדל עבור כל מאגר נתונים של AI.
resource "aws_s3_bucket" "ai_data" {
bucket_prefix = "certlabpro-aif-c01-"
}
resource "aws_s3_bucket_public_access_block" "ai_data" {
bucket = aws_s3_bucket.ai_data.id
block_public_acls = true
block_public_policy = true
ignore_public_acls = true
restrict_public_buckets = true
}
resource "aws_s3_bucket_versioning" "ai_data" {
bucket = aws_s3_bucket.ai_data.id
versioning_configuration {
status = "Enabled"
}
}
resource "aws_s3_bucket_server_side_encryption_configuration" "ai_data" {
bucket = aws_s3_bucket.ai_data.id
rule {
apply_server_side_encryption_by_default {
sse_algorithm = "AES256"
}
}
}Amazon Bedrock אינו יכול להפעיל מודל בעצמו — הוא זקוק לתפקיד AWS IAM (IAM role) שהוא יכול להניח (assume). אנו יוצרים תפקיד כזה עם מדיניות אמון (trust policy) שמגדירה את bedrock.amazonaws.com כגורם המורשה היחיד, ואז מצרפים מדיניות הרשאות מינימלית: הפעלת כל מודל יסוד, וקריאה/כתיבה אך ורק מהבאקט שיצרנו בשלב 2.
דפוסי הרשאות מינימליות (Least-privilege) כאלו הם מוטיב חוזר בבחינת AIF-C01. שימו לב שאיננו מעניקים הרשאת s3:* — אלא רק את שתי פעולות האובייקט שאנו באמת צריכים, המוגבלות לאובייקטים בתוך הבאקט שלנו. הבחינה מתגמלת זיהוי של מבנה זהה בשאלות בחירה מרובה: כאשר שתי אפשרויות תשובה "עובדות", האפשרות המצמצמת יותר היא כמעט תמיד הנכונה.
resource "aws_iam_role" "bedrock_caller" {
name = "certlabpro-aif-c01-bedrock-caller"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Effect = "Allow"
Principal = { Service = "bedrock.amazonaws.com" }
Action = "sts:AssumeRole"
}]
})
}
resource "aws_iam_role_policy" "bedrock_caller" {
name = "bedrock-invoke"
role = aws_iam_role.bedrock_caller.id
policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Effect = "Allow"
Action = [
"bedrock:InvokeModel",
"bedrock:InvokeModelWithResponseStream",
]
Resource = "arn:aws:bedrock:*::foundation-model/*"
},
{
Effect = "Allow"
Action = [
"s3:GetObject",
"s3:PutObject",
]
Resource = "${aws_s3_bucket.ai_data.arn}/*"
},
]
})
}מודל Amazon Bedrock כשלעצמו יענה בשמחה על כל דבר שנתוני האימון שלו מאפשרים לו לענות עליו. מעקות בטיחות (Amazon Bedrock Guardrails) יושבים לפני כל קריאת מודל ומחילים מדיניות תוכן ומידע אישי מזהה (PII) ללא קשר למודל היסוד שבו אתם משתמשים — כלומר, מעקה בטיחות יחיד מכסה את Claude, Llama, Titan וכל מודל עתידי.
כאן אנו מגדירים שתי שכבות. מסנן תוכן החוסם תוכן שנאה / אלימות / תוכן מיני בחומרה גבוהה הן בבקשות (prompts) והן בתגובות, ומדיניות מידע רגיש החוסמת דליפה של כתובות דוא"ל, מספרי טלפון ומספרי תעודת זהות אמריקאיים (SSN). אלו ממפים ישירות את תחום הבחינה Guidelines for Responsible AI של AIF-C01 — סינון תוכן וטיפול ב-PII הם שני עמודי התווך המוגדרים שם.
כאשר מעקה הבטיחות מוגדר, התפקיד שיצרנו בשלב 3 יכול להפעיל מודל והתוצאה תסונן לפני שהיא תגיע לפונה.
resource "aws_bedrock_guardrail" "safety" {
name = "certlabpro-aif-c01-safety"
description = "Default safety rails for the lab."
blocked_input_messaging = "I can't help with that."
blocked_outputs_messaging = "I can't share that response."
content_policy_config {
filters_config {
input_strength = "HIGH"
output_strength = "HIGH"
type = "HATE"
}
filters_config {
input_strength = "HIGH"
output_strength = "HIGH"
type = "VIOLENCE"
}
filters_config {
input_strength = "HIGH"
output_strength = "HIGH"
type = "SEXUAL"
}
}
sensitive_information_policy_config {
pii_entities_config {
action = "BLOCK"
type = "EMAIL"
}
pii_entities_config {
action = "BLOCK"
type = "PHONE"
}
pii_entities_config {
action = "BLOCK"
type = "US_SOCIAL_SECURITY_NUMBER"
}
}
}תיעוד הפעלות (Invocation logging) של Amazon Bedrock לוכד את הבקשה המלאה, התגובה ונתוני ה-embedding של כל קריאת מודל בחשבון ובאזור. הוא כותב ל-Amazon CloudWatch Logs (טוב לחיפוש מהיר באמצעות grep) ול-Amazon S3 (טוב לשמירה לטווח ארוך) — אנו מחברים את שניהם. התפקיד שאנו מצרפים מעניק בדיוק את הפעולות ששירות Amazon Bedrock צריך ולא מעבר לכך.
פרט אחד שחשוב לדעת לבחינת AIF-C01: תיעוד הפעלות הוא סינגלטון (singleton) — הגדרה אחת בלבד לכל חשבון באזור מסוים. אם תריצו מעבדה זו פעם נוספת באזור us-east-1, Terraform ידווח כי לא חל שינוי אך ההגדרה הקיימת תקושר מחדש. בצעו destroy לפני הרצה חוזרת אם תשנו אי פעם את יעדי הלוגים.
כאשר התיעוד מופעל, כל קריאת מודל שנבצע באמצעות התפקיד משלב 3, דרך מעקה הבטיחות משלב 4, תגיע בסופו של דבר לארכיון בבאקט משלב 2. זוהי שרשרת הביקורת המלאה — בדיוק סוג תרחיש ה-"הצג לי את הראיות" שהבחינה מצפה מכם לדעת לתאר.
resource "aws_iam_role" "bedrock_logging" {
name = "certlabpro-aif-c01-bedrock-logging"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Effect = "Allow"
Principal = { Service = "bedrock.amazonaws.com" }
Action = "sts:AssumeRole"
}]
})
}
resource "aws_cloudwatch_log_group" "bedrock_invocations" {
name = "/aws/bedrock/invocations"
retention_in_days = 30
}
resource "aws_iam_role_policy" "bedrock_logging" {
name = "write-logs-and-s3"
role = aws_iam_role.bedrock_logging.id
policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Effect = "Allow"
Action = [
"logs:CreateLogStream",
"logs:PutLogEvents",
]
Resource = aws_cloudwatch_log_group.bedrock_invocations.arn
},
{
Effect = "Allow"
Action = "s3:PutObject"
Resource = "${aws_s3_bucket.ai_data.arn}/bedrock-invocations/*"
},
]
})
}
resource "aws_bedrock_model_invocation_logging_configuration" "this" {
logging_config {
embedding_data_delivery_enabled = true
image_data_delivery_enabled = true
text_data_delivery_enabled = true
cloudwatch_config {
log_group_name = aws_cloudwatch_log_group.bedrock_invocations.name
role_arn = aws_iam_role.bedrock_logging.arn
}
s3_config {
bucket_name = aws_s3_bucket.ai_data.bucket
key_prefix = "bedrock-invocations/"
}
}
}הרצת terraform destroy סטנדרטית תסיר את כל המשאבים במעבדה זו. שתי הערות:
aws_bedrock_model_invocation_logging_configuration מוגדר ברמת החשבון והאזור — הסרתו תשבית את התיעוד באופן גלובלי באזור us-east-1. אם סביבות עבודה אחרות מסתמכות גם הן על הגדרה זו, מומלץ לדלג על שלב זה או לתאם זאת מראש.force_destroy = false, מה שאומר שפעולת ה-destroy תיכשל אם יישארו אובייקטים כלשהם בבאקט (כולל סימוני מחיקה - delete markers). רוקנו את הבאקט דרך הקונסולה לפני ההסרה, או הגדירו force_destroy = true במשאב הבאקט והריצו apply מחדש לפני ביצוע ה-destroy.בחינת AIF-C01 מכסה פורטפוליו רחב של כלי בינה מלאכותית של AWS — Rekognition, Comprehend, Textract, Polly, Translate, Transcribe, Lex, SageMaker, Kendra, Personalize, ו-Q. אנו נמנעים במכוון מלהגדיר אותם במעבדה זו.
הסיבה לכך אינה שהם אינם חשובים — אלא שתרגול מעשי משמעותי עבור שירותים אלה אינו דורש תשתית כלל (Textract, Comprehend, Rekognition הם קריאות API טהורות מול נתונים קיימים ב-S3), נתקל במשאבים שאינם קיימים ב-AWS provider של Terraform (מילוני Polly, מינוחים של Translate, או Amazon Q), או גורר עלויות כשהם אינם פעילים (Bedrock Knowledge Bases, Kendra, ודומיינים של SageMaker).
עבור שירותים אלו, הסעיפים עיון, מדריך ו-Editorial בדף הסמכה זה מציעים את הכיסוי המושגי שתזדקקו לו לבחינה. הערך המעשי נמצא במקום שבו הכי קשה להפנים את נושאי הבחינה ללא תרגול בפועל: ממשק הניהול של Bedrock הכולל IAM + guardrail + logging.