Zuletzt überprüft: Mai 2026
Erstellen Sie die AWS-Dienste der AIF-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 haben Sie mit reinem Terraform ein funktionierendes Setup für Amazon Bedrock bereitgestellt, das vier der fünf Prüfungsdomänen von AIF-C01 demonstriert: einen S3-Speicher für KI-Ein- und Ausgaben, eine IAM-Rolle mit dem Prinzip der geringsten Berechtigungen, die Bedrock annehmen kann, um Foundation Models aufzurufen, ein Guardrail zur Filterung von Prompts und Antworten auf Sicherheit und PII sowie eine Protokollierung der Modellaufrufe auf Konto- und Regionsebene.
Jede Ressource besteht aus reinem Terraform — derselbe Code funktioniert ohne Änderungen auch mit OpenTofu. Es gibt keine Variablen, keine Module und keinen Remote-Status. Fügen Sie die folgenden Snippets einfach in eine einzige main.tf-Datei ein, führen Sie einmalig terraform init aus und wenden Sie den Code dann Schritt für Schritt mit terraform apply an.
>= 1.5 oder OpenTofu >= 1.6.us-east-1, da Bedrock und seine neuesten Foundation Models dort zuerst eingeführt werden.Die meisten Ressourcen in diesem Lab kosten nichts, wenn sie inaktiv sind: IAM-Rollen, die Guardrail-Konfiguration, die Logging-Konfiguration, ein leerer S3-Bucket und eine CloudWatch-Protokollgruppe ohne Ereignisse sind alle kostenlos.
Posten, die Sie auf einer Rechnung sehen könnten, wenn Sie das Lab tatsächlich nutzen:
Was wir bewusst ausgelassen haben: Das Lab erstellt keine Bedrock Knowledge Base. Knowledge Bases erfordern eine OpenSearch Serverless-Sammlung, die mindestens ~350 $/Monat kostet, selbst wenn sie inaktiv ist. Das liegt hier bewusst außerhalb des Rahmens — besuchen Sie die AIF-C01-Zertifizierungsseite, wenn Sie Knowledge Bases konzeptionell lernen möchten, ohne eine bereitzustellen.
Bevor wir Ressourcen erstellen, müssen wir Terraform mitteilen, welche Version wir erwarten und welchen AWS-Provider wir verwenden werden. Wir legen den AWS-Provider auf ~> 5.60 fest, da jede in diesem Lab verwendete Bedrock-Ressource in dieser Version enthalten ist, und wir stellen alles in us-east-1 bereit — AWS führt Foundation Models dort zuerst ein, und die meisten AIF-C01-Fragen setzen die Verfügbarkeit in us-east-1 voraus, wenn sie sich auf einen „neuesten“ Dienst beziehen.
Fügen Sie dies in eine neue main.tf ein, um zu beginnen. Alles, was im Lab folgt, befindet sich in derselben Datei.
terraform {
required_version = ">= 1.5"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.60"
}
}
}
provider "aws" {
region = "us-east-1"
}Jeder AWS-KI-Dienst, den wir in diesem Lab verwenden werden — Bedrock heute und die Audit-Protokollierung, die wir in Schritt 5 einrichten werden —, liest Eingaben und schreibt Ausgaben über Amazon S3. Daher ist das erste echte Infrastrukturteil ein Bucket. Wir werden in fast jedem späteren Schritt darauf zurückkommen.
Wir aktivieren die Versionierung, damit ein fehlerhafter Upload rückgängig gemacht werden kann, sperren den öffentlichen Zugriff (dies sind Trainingsdaten und Protokolle von Modellaufrufen, keine Website-Ressourcen) und aktivieren die AES256-Verschlüsselung im Ruhezustand (Encryption at Rest). Dieser letzte Punkt ist wichtig für AIF-C01 — der Bereich Security, Compliance, and Governance for AI Solutions prüft explizit, ob Sie standardmäßig eine Verschlüsselung im Ruhezustand für jeden KI-Datenspeicher vorsehen.
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"
}
}
}Bedrock kann ein Modell nicht von sich aus aufrufen — es benötigt eine IAM-Rolle, die es annehmen kann. Wir erstellen eine Rolle mit einer Vertrauensstellung (Trust Policy), die bedrock.amazonaws.com als einzigen zulässigen Principal definiert. Anschließend hängen wir eine minimale Berechtigungsrichtlinie an: das Aufrufen beliebiger Foundation Models sowie das Lesen/Schreiben ausschließlich in dem in Schritt 2 erstellten Bucket.
Prinzipien der geringsten Berechtigungen (Least-Privilege-Muster) wie dieses sind ein wiederkehrendes Thema in AIF-C01. Beachten Sie, dass wir nicht s3:* gewähren — sondern nur die zwei tatsächlich benötigten Objektaufrufe, beschränkt auf Objekte in unserem Bucket. Die Prüfung belohnt das Erkennen genau dieses Musters in Multiple-Choice-Szenarien: Wenn zwei Antwortmöglichkeiten beide „funktionieren“, ist fast immer die restriktivere Variante korrekt.
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}/*"
},
]
})
}Ein Bedrock-Modell allein beantwortet gerne alles, was seine Trainingsdaten zulassen. Guardrails stehen vor jedem Modellaufruf und wenden Inhalts- sowie PII-Richtlinien unabhängig davon an, welches Foundation Model Sie verwenden — das heißt, ein einziges Guardrail deckt Claude, Llama, Titan und jedes zukünftige Modell ab.
Hier konfigurieren wir zwei Ebenen. Ein Inhaltsfilter blockiert schwerwiegende Inhalte wie Hassrede, Gewalt und sexuelle Inhalte sowohl in Prompts als auch in Antworten. Zudem verhindert eine Richtlinie für sensible Informationen das Durchsickern von E-Mail-Adressen, Telefonnummern und US-Sozialversicherungsnummern. Diese lassen sich direkt dem AIF-C01-Bereich Guidelines for Responsible AI zuordnen — Inhaltsfilterung und PII-Handhabung sind dort die beiden Hauptsäulen.
Sobald das Guardrail eingerichtet ist, kann die in Schritt 3 erstellte Rolle ein Modell aufrufen, und das Ergebnis wird gefiltert, bevor es den Aufrufer erreicht.
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"
}
}
}Die Protokollierung von Bedrock-Aufrufen erfasst den vollständigen Prompt, die Antwort und den Embedding-Payload jedes Modellaufrufs im Konto und in der Region. Sie schreibt in CloudWatch Logs (gut für Ad-hoc-Suchen per grep) und in S3 (gut für die langfristige Aufbewahrung) — wir richten beides ein. Die von uns zugewiesene Rolle gewährt genau die Aktionen, die der Bedrock-Dienst benötigt, und nicht mehr.
Ein wichtiger AIF-C01-relevanter Aspekt: Die Protokollierung von Aufrufen ist ein Singleton — eine Konfiguration pro Konto und Region. Wenn Sie dieses Lab ein zweites Mal in us-east-1 ausführen, meldet Terraform keine Änderung, aber die bestehende Konfiguration wird neu gebunden. Zerstören Sie die Ressourcen vor einem erneuten Durchlauf, falls Sie jemals die Protokollziele ändern.
Sobald die Protokollierung eingerichtet ist, wird jeder Modellaufruf, den wir über die Rolle aus Schritt 3 und das Guardrail aus Schritt 4 durchführen, im Bucket aus Schritt 2 archiviert. Das ist die vollständige Audit-Kette — genau die Art von Nachweisbarkeit, die in der Prüfung von Ihnen erwartet wird.
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/"
}
}
}Ein standardmäßiges terraform destroy baut alle Ressourcen in diesem Lab ab. Zwei Hinweise:
aws_bedrock_model_invocation_logging_configuration gilt für das gesamte Konto und die gesamte Region — das Löschen dieser Ressource deaktiviert die Protokollierung global in us-east-1. Wenn eine andere Arbeitslast ebenfalls auf dieser Konfiguration aufbaut, sollten Sie diesen Schritt überspringen oder sich abstimmen.force_destroy = false bedeutet, dass das Löschen (destroy) fehlschlägt, wenn noch Objekte (einschließlich Löschmarkierungen) vorhanden sind. Leeren Sie den Bucket entweder vor dem Löschen über die Konsole oder setzen Sie force_destroy = true für die Bucket-Ressource und führen Sie vor dem Abbau ein erneutes terraform apply aus.Die AIF-C01-Prüfung deckt ein breites AWS-KI-Portfolio ab — Rekognition, Comprehend, Textract, Polly, Translate, Transcribe, Lex, SageMaker, Kendra, Personalize und Q. Wir verzichten in diesem Lab bewusst auf deren Bereitstellung.
Der Grund dafür ist nicht, dass sie unwichtig sind. Vielmehr erfordert eine sinnvolle praktische Anwendung dieser Dienste entweder überhaupt keine Infrastruktur (Textract, Comprehend, Rekognition sind reine API-Aufrufe auf Basis bestehender S3-Daten), stößt auf Ressourcen, die im Terraform-AWS-Provider nicht existieren (Polly-Lexika, Translate-Terminologien, Amazon Q), oder verursacht im Leerlauf hohe Kosten (Bedrock Knowledge Bases, Kendra, SageMaker-Domänen).
Für diese Dienste bieten die Abschnitte Durchsuchen, Handbuch und Editorial dieser Zertifizierungsseite die konzeptionelle Abdeckung, die Sie für die Prüfung benötigen. Der praktische Nutzen liegt dort, wo die Prüfungsinhalte ohne eigenes Handeln am schwersten zu verinnerlichen sind: in der IAM-Rolle, dem Guardrail und dem Protokollierungs-Control-Plane von Bedrock.