נבדק לאחרונה: מאי 2026
בנו את שירותי AWS של בחינת AIP-C01 עם Terraform פשוט — בלוק אחד בכל פעם, כאשר כל אחד מהם מקושר בחזרה לתחום במבחן. אותו הקוד עובד גם ב-OpenTofu.
בסיום מעבדה זו תגדיר, באמצעות Terraform רגיל, סוכן Bedrock ברמת הפקה — דלי S3 לכל נתוני מקור, תפקיד IAM עם הרשאות מינימליות שהסוכן ייטול, Bedrock Guardrail ברמת הפקה (סינון תוכן + מידע מזהה אישי (PII) + נושאים אסורים), סוכן ה-Bedrock עצמו, וקבוצת פעולה (Action Group) שתאפשר לסוכן להפעיל פונקציית Lambda ככלי. זוהי ארכיטקטורת הייחוס של AIP-C01 עבור AI יוצר המפעיל כלים: מודל עם מגני בטיחות, הרשאות מוגבלות, ומשטח הרחבה ניתן להפעלה.
כל משאב הוא Terraform רגיל. הכנס את קטעי הקוד לקובץ main.tf יחיד, הרץ terraform init, ואז terraform apply צעד אחר צעד.
>= 1.5 או OpenTofu >= 1.6.us-east-1 (תמיכת Bedrock Agents היא הרחבה ביותר שם).anthropic.claude-3-haiku-20240307-v1:0 לפחות (הסוכן בצעד 4 מפנה אליו). גישת מודל היא מתג ברמת חשבון מחוץ לתשתית כקוד.aws_bedrockagent_* דורשים ספק AWS ~> 5.60 ושירות Bedrock Agent חייב להיות זמין באופן כללי (GA) באזורך. בדוק בקונסולת AWS אם aws bedrock-agent list-agents עובד.חיוב במצב סרק הוא מינימלי; החיוב גדל עם השימוש:
מלכודת העלות ש-AIP-C01 בודק במיוחד: Knowledge Bases של Bedrock דורשים אוסף OpenSearch Serverless שמחויב בכ-$350 לחודש מינימום במצב סרק. המעבדה בכוונה לא מקצה Knowledge Base — דפוס קבוצת הפעולה בצעד 5 מדגים את צורת הסוכן הקורא לכלים הנפוצה יותר ללא מלכודת ה-OpenSearch. אם ברצונך ללמוד על Knowledge Bases, עשה זאת קונספטואלית תחילה; הקצה את אוסף ה-OSS רק כשתהיה מוכן להשתמש בו בפועל.
פתיחה סטנדרטית. us-east-1 עבור הזמינות הרחבה ביותר של תכונות Bedrock + Bedrock Agent. קיבוע גרסת הספק אינו ניתן למשא ומתן: משאבי aws_bedrockagent_* דורשים ~> 5.60 או מאוחר יותר.
terraform {
required_version = ">= 1.5"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.60"
}
archive = {
source = "hashicorp/archive"
version = "~> 2.4"
}
}
}
provider "aws" {
region = "us-east-1"
default_tags {
tags = {
Project = "certlabpro-aip-c01"
ManagedBy = "terraform"
}
}
}
data "aws_caller_identity" "current" {}
data "aws_region" "current" {}רוב סוכני Bedrock בסביבת ייצור קוראים משהו מ-S3 — מסמכי מקור של בסיס ידע, הגדרות כלי JSON, תבניות תגובה. אנו מקצים דלי מראש כדי שלא נצטרך להגדיר הרשאות מאוחר יותר. ברירות המחדל של הצפנה + חסימת גישה ציבורית הן מתחום ה-שילוב מודלי בסיס, ניהול נתונים ותאימות של AIP-C01 בפעולה.
bחינת AIP-C01 בודקת דפוס תאימות ספציפי אחד סביב הדלי הזה: הצפנה בצד הלקוח עם מפתח שהיישום שולט בו היא התשובה הנכונה כאשר התקנות קובעות "AWS אסור שתחזיק בנתונים הלא מוצפנים". עבור כל השאר, SSE-S3 (מה שאנו עושים כאן) מספיק.
resource "aws_s3_bucket" "agent_data" {
bucket_prefix = "certlabpro-aip-c01-"
}
resource "aws_s3_bucket_public_access_block" "agent_data" {
bucket = aws_s3_bucket.agent_data.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" "agent_data" {
bucket = aws_s3_bucket.agent_data.id
rule {
apply_server_side_encryption_by_default {
sse_algorithm = "AES256"
}
}
}תחום ה-בטיחות, אבטחה וממשל של AI של AIP-C01 (20% מהבחינה) יורד לעומק רב יותר מגרסת AIF-C01. הבחינה בודקת את הרכב ה-Guardrail הרב-שכבתי: מסנני תוכן לקטגוריות מזיקות בעוצמה גבוהה, מדיניות מידע רגיש עבור PII (עם BLOCK במקום ANONYMIZE בסגנון AIF — סוכני ייצור בדרך כלל דורשים חסימות קשות), ומדיניות נושאים לנושאים אסורים ספציפיים ליישום.
אנו מגדירים את כל השלושה. הנושא הנאסר "FinancialAdvice" במדיניות הוא Guardrail נפוץ בסביבת ייצור עבור צ'אטבוטים לא פיננסיים — גם Claude 3 יסטה לפעמים למתן טיפים למניות אלא אם כן תנחה את ה-Guardrail לחסום סטייה נושאית. AIP-C01 בודק דפוס הרכב מדויק זה בשאלות תרחיש שבהן ההנחיה היא תמימה אך התגובה עלולה לחרוג מהמדיניות.
resource "aws_bedrock_guardrail" "production" {
name = "certlabpro-aip-c01-production"
description = "Production-grade safety rail for the AIP-C01 lab agent."
blocked_input_messaging = "I can't help with that request."
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"
}
filters_config {
input_strength = "HIGH"
output_strength = "HIGH"
type = "INSULTS"
}
filters_config {
input_strength = "HIGH"
output_strength = "HIGH"
type = "MISCONDUCT"
}
}
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"
}
pii_entities_config {
action = "BLOCK"
type = "CREDIT_DEBIT_CARD_NUMBER"
}
}
topic_policy_config {
topics_config {
name = "FinancialAdvice"
definition = "Specific recommendations to buy, sell, or hold financial instruments."
examples = ["Should I buy NVDA?", "Is now a good time to sell my Bitcoin?"]
type = "DENY"
}
}
}הסוכן מקשר יחד מודל בסיס, הנחיה מערכתית, ו(בשלב 5) קבוצת פעולות אחת או יותר שמרחיבות את יכולותיו. תפקיד ה-IAM שאנו מצרפים הוא תפקיד הביצוע של הסוכן — זה מה שהסוכן משתמש בו כדי להפעיל מודלים, לאחזר מבסיסי ידע, ולקרוא ל-Lambdas של קבוצות פעולה. תחום ה-יישום ואינטגרציה של AIP-C01 בודק בדיוק צורת תפקיד/אמון זו: bedrock.amazonaws.com כעקרון, הרשאות מוגבלות ל-bedrock:InvokeModel על ARNs ספציפיים של מודלים, ו-lambda:InvokeFunction על ARNs ספציפיים של פונקציות.
שדה ה-instruction של הסוכן הוא ההנחיה המערכתית — קצרה, מוכוונת פעולה, המציינת את מטרת הסוכן. שאלות AIP-C01 על הנדסת הנחיות ברמת הסוכן בודקות בדיוק את זה: ההנחיה היא האישיות הקבועה; הודעת המשתמש משתנה לפי תור.
resource "aws_iam_role" "agent" {
name = "certlabpro-aip-c01-agent"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Effect = "Allow"
Principal = { Service = "bedrock.amazonaws.com" }
Action = "sts:AssumeRole"
Condition = {
StringEquals = {
"aws:SourceAccount" = data.aws_caller_identity.current.account_id
}
}
}]
})
}
resource "aws_iam_role_policy" "agent_invoke_model" {
name = "invoke-foundation-model"
role = aws_iam_role.agent.id
policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Effect = "Allow"
Action = ["bedrock:InvokeModel", "bedrock:InvokeModelWithResponseStream"]
Resource = "arn:aws:bedrock:${data.aws_region.current.name}::foundation-model/anthropic.claude-3-haiku-20240307-v1:0"
}]
})
}
resource "aws_bedrockagent_agent" "main" {
agent_name = "certlabpro-aip-c01-agent"
agent_resource_role_arn = aws_iam_role.agent.arn
foundation_model = "anthropic.claude-3-haiku-20240307-v1:0"
instruction = "You are a helpful assistant for the certlabpro AIP-C01 lab. Answer concisely. When the user asks about the current time, use the get_current_time tool."
idle_session_ttl_in_seconds = 600
# Attach the guardrail from Step 3. Bedrock evaluates inputs and outputs
# against the guardrail policy on every model call.
guardrail_configuration {
guardrail_identifier = aws_bedrock_guardrail.production.guardrail_id
guardrail_version = aws_bedrock_guardrail.production.version
}
}קבוצות פעולה הן הדרך שבה סוכני Bedrock קוראים לקוד שלך. התבנית: הגדר את סכימת ה-API (מה הכלי מקבל ומחזיר), הצבע על Lambda שמיישמת את הפעולות, ו-Bedrock מטפל בכל השאר — כשהמודל מחליט שהוא זקוק לכלי, הוא קורא ל-Lambda שלך עם ארגומנטים מובנים ומזין את התגובה בחזרה לשיחה.
אנו מגדירים פעולת get_current_time מינימלית עם סכימת OpenAPI 3.0 ש-Bedrock מצפה לה. מימוש ה-Lambda קטן בכוונה — מה שהבחינה בודקת הוא הצורה של האינטגרציה (Lambda קוראת לפונקציה + סכימת OpenAPI + הרשאת הפעלת Bedrock), לא את הלוגיקה הפנימית של הפונקציה.
משאב aws_lambda_permission הוא המלכודת הקלאסית של AIP-C01: בלעדיו, הפעלת ה-Lambda על ידי הסוכן תקבל AccessDenied למרות שכל שאר החלקים מחוברים כהלכה. Bedrock Agent → Lambda הוא דפוס הפעלת שירות חיצוני; מדיניות המשאב של הפונקציה צריכה לאפשר במפורש את bedrock.amazonaws.com.
עם קבוצות פעולה במקום, צורת הסוכן המלאה הושלמה: מודל + הנחיה מערכתית + Guardrail בטיחות + יכולת הרחבה לקריאת כלים, הכל תחת זהות IAM אחת מוגבלת בהיקפה. כל דפוס נוסף של AIP-C01 (אחזור מבסיס ידע, סוכנים מרובי פעולות, שיתוף פעולה בין סוכנים באמצעות סוכני מפקח) מרחיב בסיס זה.
# ── Lambda tool ───────────────────────────────────────────────
data "archive_file" "tool" {
type = "zip"
output_path = "${path.module}/build/tool.zip"
source {
filename = "index.py"
content = <<-EOT
import json
from datetime import datetime, timezone
def handler(event, context):
# Bedrock Agent passes the parsed args under `requestBody` / `parameters`.
# For a simple no-arg tool, just return the current time.
now_iso = datetime.now(timezone.utc).isoformat()
return {
"messageVersion": "1.0",
"response": {
"actionGroup": event.get("actionGroup", ""),
"apiPath": event.get("apiPath", "/"),
"httpMethod": event.get("httpMethod", "GET"),
"httpStatusCode": 200,
"responseBody": {"application/json": {"body": json.dumps({"current_time_utc": now_iso})}},
},
}
EOT
}
}
resource "aws_iam_role" "tool_lambda" {
name = "certlabpro-aip-c01-tool"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Effect = "Allow"
Principal = { Service = "lambda.amazonaws.com" }
Action = "sts:AssumeRole"
}]
})
}
resource "aws_iam_role_policy_attachment" "tool_logs" {
role = aws_iam_role.tool_lambda.name
policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
}
resource "aws_lambda_function" "tool" {
function_name = "certlabpro-aip-c01-tool"
role = aws_iam_role.tool_lambda.arn
runtime = "python3.12"
handler = "index.handler"
filename = data.archive_file.tool.output_path
source_code_hash = data.archive_file.tool.output_base64sha256
timeout = 10
}
resource "aws_lambda_permission" "agent_invoke_tool" {
statement_id = "AllowBedrockAgentInvoke"
action = "lambda:InvokeFunction"
function_name = aws_lambda_function.tool.function_name
principal = "bedrock.amazonaws.com"
source_arn = aws_bedrockagent_agent.main.agent_arn
}
# Also let the agent invoke the lambda from its execution role.
resource "aws_iam_role_policy" "agent_invoke_lambda" {
name = "invoke-tool"
role = aws_iam_role.agent.id
policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Effect = "Allow"
Action = "lambda:InvokeFunction"
Resource = aws_lambda_function.tool.arn
}]
})
}
# ── Action Group ──────────────────────────────────────────────
resource "aws_bedrockagent_agent_action_group" "time" {
action_group_name = "time-tools"
agent_id = aws_bedrockagent_agent.main.agent_id
agent_version = "DRAFT"
description = "Time-related tool calls for the agent."
skip_resource_in_use_check = false
action_group_executor {
lambda = aws_lambda_function.tool.arn
}
api_schema {
payload = jsonencode({
openapi = "3.0.0"
info = { title = "Time tools", version = "1.0.0" }
paths = {
"/get_current_time" = {
get = {
operationId = "get_current_time"
description = "Returns the current UTC time as an ISO-8601 string."
responses = {
"200" = {
description = "Current UTC time"
content = {
"application/json" = {
schema = {
type = "object"
properties = {
current_time_utc = { type = "string", format = "date-time" }
}
}
}
}
}
}
}
}
}
})
}
}terraform destroy מפרק את כל המשאבים במעבדה זו, תוך הקפדה על סדר נכון:
force_destroy = false. אם העלית נתוני ייחוס כלשהם, רוקן אותו (aws s3 rm s3://<bucket> --recursive) לפני ההריסה.AIP-C01 מכסה שטחי GenAI בייצור שמעבדה זו אינה יכולה להכיל — Bedrock Knowledge Bases (דורשים OpenSearch Serverless = $350+/חודש במצב סרק, דולגו בכוונה לפי הערת העלות), Bedrock Agent Aliases להסטת תעבורה וניהול גרסאות, שיתוף פעולה רב-סוכני (סוכני מפקח המאצילים סמכויות לסוכני משנה מומחים), זיכרון סוכן למצב שיחה ארוך טווח, Bedrock Custom Models (כיוונון עדין), Bedrock Provisioned Throughput לפריסות ייצור בנפח גבוה, Amazon Q for Business (ללא משאבי Terraform), SageMaker JumpStart לאירוח מודלי בסיס מחוץ לפלטפורמה, וערימת הניתוב (observability stack) של Bedrock (רישום הפעלות מודלים עמוק יותר ממה ש-AIF-C01 כיסה).
אנו נצמדים לצורת הסוכן + קבוצת פעולה + Guardrail ייצור מכיוון שזוהי ארכיטקטורת ה-GenAI לייצור הנבדקת ביותר בבחינה והתשתית אליה מתחברים כל הדפוסים המתקדמים יותר. בסיסי ידע מתחברים לסוכן זה. כינויים יוצרים גרסאות לסוכן זה. שיתוף פעולה רב-סוכני מרכיב סוכנים כמו זה.
לכיסוי השטחים הנ''ל, סעיפי עיון, מדריך ו-Editorial בדף הסמכה זה מכילים את החומר הקונספטואלי. מעבדת המשך טבעית הייתה מוסיפה Knowledge Base על בסיס זה (עלות OpenSearch היא הסיבה היחידה שאנו לא כוללים זאת כאן).