Zuletzt überprüft: Mai 2026
Erstellen Sie die AWS-Dienste der AIP-C01-Prüfung mit reinem Terraform — ein Block nach dem anderen, jeweils abgestimmt auf eine Prüfungsdomäne. Derselbe Code funktioniert auch mit OpenTofu.
Am Ende dieses Labs werden Sie mit einfachem Terraform einen produktionsreifen Bedrock Agent bereitgestellt haben – einen S3-Bucket für beliebige Quelldaten, eine IAM-Rolle mit geringsten Rechten, die der Agent annimmt, eine produktionsstarke Bedrock Guardrail (Inhalts- + PII- + verbotene Themen-Filter), den Bedrock Agent selbst und eine Aktionsgruppe, die es dem Agent ermöglicht, eine Lambda-Funktion als Werkzeug aufzurufen. Dies ist die AIP-C01-Referenzarchitektur für werkzeugaufrufende generative KI: ein Modell mit Sicherheitsvorkehrungen, beschränkten Berechtigungen und einer aufrufbaren Erweiterungsoberfläche.
Jede Ressource ist einfaches Terraform. Fügen Sie die Snippets in eine einzelne main.tf ein, führen Sie terraform init aus, und dann Schritt für Schritt terraform apply.
>= 1.5 oder OpenTofu >= 1.6.us-east-1 (dort ist die Unterstützung für Bedrock Agents am breitesten).anthropic.claude-3-haiku-20240307-v1:0 (der Agent in Schritt 4 referenziert es). Der Modellzugriff ist ein kontoebenenweites Umschalten außerhalb von Infrastructure-as-Code.aws_bedrockagent_*-Ressourcen erfordern AWS Provider ~> 5.60, und der Bedrock Agent-Dienst muss in Ihrer Region allgemein verfügbar sein (GA). Überprüfen Sie in der AWS-Konsole, ob aws bedrock-agent list-agents funktioniert.Die Leerlaufkosten sind minimal; die Rechnung skaliert mit der Nutzung:
Die Kostenfalle, die AIP-C01 spezifisch testet: Bedrock Knowledge Bases erfordern eine OpenSearch Serverless-Sammlung, die mindestens ca. $350/Monat im Leerlauf kostet. Das Lab stellt bewusst KEINE Knowledge Base bereit — das Aktionsgruppen-Muster in Schritt 5 demonstriert die gängigere Form eines werkzeugaufrufenden Agenten ohne die OpenSearch-Falle. Wenn Sie Knowledge Bases studieren möchten, tun Sie dies zuerst konzeptionell; stellen Sie die OSS-Sammlung erst bereit, wenn Sie bereit sind, sie tatsächlich zu nutzen.
Standard-Eröffnung. us-east-1 für die breiteste Verfügbarkeit von Bedrock- und Bedrock Agent-Funktionen. Die Provider-Versionsfixierung ist nicht verhandelbar: aws_bedrockagent_*-Ressourcen erfordern ~> 5.60 oder höher.
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" {}Die meisten produktiven Bedrock Agents lesen schließlich etwas aus S3 – Quelldokumente von Wissensbasen, JSON-Werkzeugdefinitionen, Antwortvorlagen. Wir stellen einen Bucket im Voraus bereit, damit wir später keine Berechtigungen nachrüsten müssen. Die Standardeinstellungen für Verschlüsselung + Blockierung des öffentlichen Zugriffs sind der Bereich Grundlagenmodellintegration, Datenmanagement und Compliance von AIP-C01 in Aktion.
Die AIP-C01-Prüfung testet ein spezifisches Compliance-Muster rund um diesen Bucket: client-seitige Verschlüsselung mit einem Schlüssel, den die Anwendung kontrolliert, ist die richtige Antwort, wenn die Vorschrift besagt, dass “AWS niemals die unverschlüsselten Daten haben darf”. Für alles andere ist SSE-S3 (was wir hier tun) ausreichend.
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"
}
}
}Der Bereich KI-Sicherheit, -Schutz und -Governance von AIP-C01 (20% der Prüfung) geht viel tiefer als die AIF-C01-Version. Die Prüfung testet die mehrschichtige Guardrail-Zusammensetzung: Inhaltsfilter für schädliche Kategorien mit hoher Stärke, Richtlinien für sensible Informationen für PII (mit BLOCK anstelle des AIF-Stils ANONYMIZE — produktive Agenten benötigen in der Regel harte Blöcke) und Themenrichtlinien für anwendungsspezifische verbotene Themen.
Wir konfigurieren alle drei. Das verbotene Thema "FinancialAdvice" in der Richtlinie ist eine gängige Produktions-Guardrail für nicht-finanzielle Chatbots – selbst Claude 3 wird manchmal dazu neigen, Aktientipps zu geben, es sei denn, Sie weisen die Guardrail an, thematische Abweichungen zu blockieren. AIP-C01 testet genau dieses Zusammensetzungsmuster in Szenariofragen, bei denen der Prompt harmlos ist, die Antwort aber von der Richtlinie abweichen könnte.
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"
}
}
}Der Agent verbindet ein Basismodell, einen System-Prompt und (in Schritt 5) eine oder mehrere Aktionsgruppen, die seine Fähigkeiten erweitern. Die IAM-Rolle, die wir zuweisen, ist die Ausführungsrolle des Agenten – sie wird vom Agenten verwendet, um Modelle aufzurufen, aus Wissensbasen abzurufen und Aktionsgruppen-Lambdas aufzurufen. Der Bereich Implementierung und Integration von AIP-C01 testet genau diese Rollen-/Vertrauensform: bedrock.amazonaws.com als Principal, eingeschränkte Berechtigungen für bedrock:InvokeModel auf spezifischen Modell-ARNs und lambda:InvokeFunction auf spezifischen Funktions-ARNs.
Das instruction-Feld des Agenten ist der System-Prompt – kurz, handlungsorientiert und benennt den Zweck des Agenten. AIP-C01-Fragen zum Prompt Engineering auf Agentenebene testen genau dies: Die Anweisung ist die dauerhafte Persönlichkeit; die Benutzernachricht ändert sich pro Runde.
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
}
}Aktionsgruppen sind die Art und Weise, wie Bedrock Agents Ihren Code aufrufen. Das Muster: Definieren Sie das API-Schema (was das Tool akzeptiert und zurückgibt), verweisen Sie auf eine Lambda-Funktion, die die Aktionen implementiert, und Bedrock kümmert sich um den Rest – wenn das Modell entscheidet, dass es das Tool benötigt, ruft es Ihre Lambda-Funktion mit strukturierten Argumenten auf und speist die Antwort zurück in die Konversation.
Wir definieren eine minimale get_current_time-Aktion mit dem von Bedrock erwarteten OpenAPI 3.0-Schema. Die Lambda-Implementierung ist absichtlich winzig – was die Prüfung testet, ist die Form der Integration (funktionsaufrufende Lambda-Funktion + OpenAPI-Schema + Bedrock-Aufrufberechtigung), nicht die interne Logik der Funktion.
Die aws_lambda_permission-Ressource ist die kanonische AIP-C01-Falle: Ohne sie erhält der Aufruf der Lambda-Funktion durch den Agenten AccessDenied, obwohl jedes andere Teil korrekt verdrahtet ist. Bedrock Agent → Lambda ist ein Aufrufmuster für externe Dienste; die Ressourcenrichtlinie der Funktion muss bedrock.amazonaws.com explizit zulassen.
Mit den Aktionsgruppen ist die vollständige Agentenform abgeschlossen: Modell + System-Prompt + Sicherheits-Guardrail + Erweiterbarkeit durch Werkzeugaufrufe, alles unter einer eingeschränkten IAM-Identität. Jedes zusätzliche AIP-C01-Muster (Abruf aus Wissensbasis, Multi-Aktions-Agenten, Agenten-Kollaboration über Supervisor-Agenten) erweitert diese Basis.
# ── 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 reißt alles in diesem Lab ab, unter Berücksichtigung der Reihenfolge:
force_destroy = false. Wenn Sie Referenzdaten hochgeladen haben, leeren Sie den Bucket (aws s3 rm s3://<bucket> --recursive), bevor Sie ihn zerstören.AIP-C01 deckt produktive GenAI-Oberflächen ab, die dieses Lab nicht behandeln kann – Bedrock Knowledge Bases (erfordern OpenSearch Serverless = $350+/Monat im Leerlauf, absichtlich gemäß der Kostenhinweis übersprungen), Bedrock Agent Aliases für Traffic-Shifting und Versionsverwaltung, Multi-Agenten-Kollaboration (Supervisor-Agenten, die an spezialisierte Unter-Agenten delegieren), Agenten-Speicher für langanhaltenden Konversationszustand, Bedrock Custom Models (Fine-Tuning), Bedrock Provisioned Throughput für Produktionsbereitstellungen mit hohem Volumen, Amazon Q for Business (keine Terraform-Ressourcen), SageMaker JumpStart für das Hosten von Basismodellen außerhalb der Plattform und den Bedrock-Observability-Stack (Modellaufruf-Protokollierung, die tiefer geht, als AIF-C01 abdeckte).
Wir bleiben bei der Form Agent + Aktionsgruppe + Produktions-Guardrail, da dies die am häufigsten getestete Produktions-GenAI-Architektur in der Prüfung ist und das Substrat, an das jedes fortgeschrittenere Muster anknüpft. Wissensbasen werden an diesen Agenten angefügt. Aliase versionieren diesen Agenten. Multi-Agenten-Kollaboration setzt Agenten wie diesen zusammen.
Für eine Abdeckung der oben genannten Oberflächen finden Sie das konzeptionelle Material in den Abschnitten Durchsuchen, Handbuch und Editorial dieser Zertifizierungsseite. Ein natürliches Folgelab würde eine Knowledge Base auf dieser Basis hinzufügen (die OpenSearch-Kosten sind der einzige Grund, warum wir sie hier nicht aufnehmen).