最后审核时间:2026年5月
使用原生 Terraform 构建 AIF-C01 考试中的 AWS 服务——每次构建一个代码块,并紧扣考试领域。相同的代码可在 OpenTofu 上运行。
在本实验室结束时,您将使用原生 Terraform 配置好一个运行中的 Amazon Bedrock 设置,该设置演示了 AIF-C01 考试五个领域中的四个:用于 AI 输入和输出的 Amazon S3 存储桶、Amazon Bedrock 可以扮演以调用基础模型的最小特权 AWS IAM 角色、用于过滤提示词和回复以确保安全性和 PII(个人身份信息)的安全护栏,以及账户和区域级别的调用日志记录。
所有资源均采用原生 Terraform 编写——相同的代码无需任何修改即可在 OpenTofu 上运行。这里没有变量、没有模块,也没有远程状态。只需将以下代码片段放入单个 main.tf 文件中,运行一次 terraform init,然后逐步执行 terraform apply 即可。
>= 1.5 或 OpenTofu >= 1.6。us-east-1,因为 Amazon Bedrock 及其最新的基础模型会首先在该区域推出。本实验室中的大多数资源在空闲时均不产生费用:AWS IAM 角色、安全护栏配置、日志记录配置、空 Amazon S3 存储桶以及没有事件的 Amazon CloudWatch Logs 日志组都是免费的。
如果您实际使用本实验室,可能会在账单上看到以下计费项:
我们有意跳过的内容:本实验室不会创建 Amazon Bedrock 知识库。知识库需要一个 Amazon OpenSearch Serverless 集合,该集合在空闲时每月最低收费约 350 美元。这显然超出了本实验室范围——如果您想从概念上学习知识库而无需配置它,请参阅 AIF-C01 证书页面。
在创建任何资源之前,我们需要告诉 Terraform 我们预期的版本以及我们将使用的 AWS 提供商(Provider)。我们将 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"
}我们在本实验室中使用的每个 AWS AI 服务(今天的 Amazon Bedrock,以及我们将在步骤 5 中配置的审计日志)都会通过 Amazon S3 读取输入并写入输出,因此第一块真正的基础设施是一个存储桶。我们几乎会在后面的每一步中再次用到它。
我们启用版本控制以便在上传损坏时进行回滚,锁住公共访问权限(这些是训练输入和模型调用日志,而不是网站静态资源),并启用 AES256 静态加密。最后一点对 AIF-C01 考试非常重要——AI 解决方案的安全、合规性与治理领域会明确测试您是否默认对任何 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 角色。我们创建了一个角色,其信任策略将 bedrock.amazonaws.com 指定为唯一允许的主体(Principal),然后附加了一个最小权限策略:允许调用任何基础模型,并且只对我们在步骤 2 中创建的 Amazon S3 存储桶进行读写。
像这样的最小特权(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 模型本身会乐意回答其训练数据允许的任何问题。安全护栏(Guardrail)位于每次模型调用的前置环节,并且独立于您使用的基础模型应用内容和 PII 策略——这意味着单个安全护栏可以同时覆盖 Claude、Llama、Titan 以及未来的任何模型。
在这里,我们配置了两个层级。内容过滤器(Content filter)在提示词和回复中都阻止高严重性的仇恨/暴力/性内容,而敏感信息策略(Sensitive-information policy)则阻止电子邮件、电话号码和美国社会保障号(SSN)泄露。这些直接对应于 AIF-C01 考试的可信赖 AI 指南领域——内容过滤和 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"
}
}
}Amazon Bedrock 调用日志记录(Invocation logging)会捕获账户和区域中每次模型调用的完整提示词、回复和嵌入向量(Embedding)负载。它会写入 Amazon CloudWatch Logs(适合临时检索)和 Amazon S3(适合长期保存)——我们同时配置了这两者。我们附加的角色仅授予 Amazon Bedrock 服务所需的具体操作,没有多余权限。
一个值得了解的与 AIF-C01 相关的注意事项:调用日志记录是一个单例(Singleton)——每个账户在每个区域只能有一个配置。如果您在 us-east-1 中第二次运行此实验室,Terraform 会报告没有更改,但现有的配置会被重新绑定。如果您需要更改日志目标,请在重新运行前销毁现有配置。
配置日志后,我们通过步骤 4 的安全护栏对步骤 3 的角色进行的每次模型调用,最终都会归档在步骤 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 将失败。要么在销毁前通过控制台清空存储桶,要么在存储桶资源上设置 force_destroy = true 并在拆除前重新应用配置。AIF-C01 考试涵盖了广泛的 AWS AI 服务组合 —— Rekognition、Comprehend、Textract、Polly、Translate、Transcribe、Lex、SageMaker、Kendra、Personalize 和 Q。我们在本实验中特意不配置它们。
这并非因为它们不重要,而是因为对这些服务进行有意义的实际操作要么根本不需要任何基础设施(Textract、Comprehend、Rekognition 均是针对现有 S3 数据的纯 API 调用),要么会遇到 Terraform AWS 提供商中不存在的资源(Polly 发音词典、Translate 术语表、Amazon Q),或者在空闲时会产生高昂费用(Bedrock 知识库、Kendra、SageMaker 域)。
对于这些服务,此认证页面的浏览、手册和Editorial部分提供了您备考所需的理论覆盖。动手实践的价值在于那些如果不亲自操作就最难理解的领域:Bedrock IAM + 安全屏障 (Guardrail) + 日志记录控制面。