Последняя проверка: май 2026 г.
Разверните сервисы AWS для экзамена AIF-C01 с помощью чистого Terraform: пошаговое руководство с привязкой каждого блока к разделам экзамена. Код также совместим с OpenTofu.
К концу этой лабораторной работы вы с помощью чистого Terraform развернете работающее окружение Amazon Bedrock, демонстрирующее четыре из пяти разделов экзамена AIF-C01: хранилище S3 для входных и выходных данных ИИ, роль IAM с минимальными привилегиями, которую Bedrock может принимать для вызова базовых моделей, фильтр безопасности (guardrail), отсекающий нежелательный контент и PII (персональные данные) в промптах и ответах, а также логирование вызовов на уровне аккаунта и региона.
Каждый ресурс описан на чистом Terraform — этот же код работает без изменений в OpenTofu. Здесь нет переменных, модулей или удаленного хранения состояния. Просто поместите приведенные ниже фрагменты кода в один файл main.tf, один раз выполните terraform init, а затем пошагово примените конфигурацию с помощью terraform apply.
>= 1.5 или OpenTofu >= 1.6.us-east-1, так как Bedrock и его новейшие базовые модели появляются там в первую очередь.Большинство ресурсов в этой лабораторной работе не стоят ничего в режиме ожидания: роли IAM, конфигурация guardrail, настройки логирования, пустой бакет S3 и группа логов CloudWatch без входящих событий полностью бесплатны.
Расходы, которые могут возникнуть при активном тестировании:
Что мы намеренно пропустили: эта лабораторная работа не создает базу знаний (Knowledge Base) Bedrock. Для баз знаний требуется коллекция OpenSearch Serverless, обслуживание которой стоит минимум ~350 $ в месяц даже в простое. Это намеренно вынесено за рамки практики — если вам нужно изучить концепции баз знаний для экзамена AIF-C01 без лишних трат, ознакомьтесь с ними теоретически.
Прежде чем создавать ресурсы, нам нужно указать Terraform, какую версию утилиты мы используем и какой провайдер AWS нам понадобится. Мы фиксируем версию провайдера AWS на уровне ~> 5.60, так как все связанные с 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, которые мы используем в этой лабораторной работе (Bedrock на текущем этапе и аудит-логирование, которое мы настроем на Шаге 5), считывают входные данные и сохраняют результаты через Amazon S3. Поэтому первым реальным элементом инфраструктуры станет бакет. Мы будем возвращаться к нему практически на каждом последующем шаге.
Мы включим версионирование, чтобы иметь возможность откатить поврежденные загрузки, полностью заблокируем публичный доступ (ведь это обучающие данные и логи вызова моделей, а не публичные файлы веб-сайта) и настроем шифрование AES256 при хранении (encryption at rest). Последнее особенно важно для экзамена AIF-C01: домен Security, Compliance, and Governance for AI Solutions проверяет умение применять шифрование при хранении по умолчанию для любых хранилищ данных ИИ.
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 не может выполнять вызовы моделей сам по себе — ему требуется IAM-роль, которую он сможет принимать. Мы создадим роль с политикой доверия (trust policy), указывающей bedrock.amazonaws.com в качестве единственного доверенного субъекта, и прикрепим политику с минимальными правами: вызов любых базовых моделей и чтение/запись только в пределах бакета, созданного на Шаге 2.
Соблюдение принципа наименьших привилегий — одна из ключевых тем экзамена 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}/*"
},
]
})
}Сама по себе модель Bedrock готова ответить на любой вопрос, если это позволяют ее обучающие данные. Фильтры безопасности (Guardrails) находятся перед каждым вызовом модели и применяют политики контента и персональных данных (PII) независимо от выбранной базовой модели. Это значит, что один и тот же фильтр будет работать для Claude, Llama, Titan и любых будущих моделей.
В этом шаге мы настроим два уровня защиты. Фильтр контента блокирует неприемлемые высказывания, темы насилия и сексуального характера высокой степени выраженности как в промптах, так и в ответах. Политика конфиденциальной информации предотвращает утечку адресов электронной почты, номеров телефонов и номеров социального страхования США (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"
}
}
}Логирование вызовов Bedrock позволяет сохранять полный промпт, ответ модели и эмбеддинги для каждого обращения в рамках аккаунта и региона. Логи направляются в CloudWatch Logs (удобно для быстрого поиска через grep) и в S3 (подходит для долгосрочного хранения) — мы настроим оба направления. Роль, которую мы подключим, предоставляет только те права, которые действительно необходимы сервису Bedrock.
Важный нюанс для экзамена AIF-C01: конфигурация логирования вызовов является синглтоном — одна настройка на аккаунт в каждом регионе. Если вы запустите эту лабораторную работу повторно в регионе us-east-1, Terraform сообщит об отсутствии изменений, но текущая конфигурация будет перепривязана. Если вы захотите изменить места хранения логов, обязательно удалите старую конфигурацию (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 завершится ошибкой, если в бакете остались объекты (включая маркеры удаления). Вы можете либо очистить бакет через консоль AWS перед удалением, либо установить force_destroy = true в описании ресурса бакета, применить изменения (terraform apply), а затем выполнить уничтожение инфраструктуры.Экзамен AIF-C01 охватывает широкий спектр сервисов AWS AI — Rekognition, Comprehend, Textract, Polly, Translate, Transcribe, Lex, SageMaker, Kendra, Personalize и Q. Мы намеренно не настраиваем их в этой лабораторной работе.
Причина не в том, что они не важны, а в том, что практическая работа с этими сервисами либо вообще не требует инфраструктуры (Textract, Comprehend, Rekognition — это чистые API-вызовы к существующим данным S3), либо требует ресурсов, которых нет в AWS-провайдере Terraform (лексиконы Polly, терминологии Translate, Amazon Q), либо приводит к лишним расходам при простое (базы знаний Bedrock, Kendra, домены SageMaker).
Для этих сервисов разделы Просмотр, Справочник и Editorial на этой странице сертификации содержат всю необходимую теоретическую информацию для экзамена. Практическая ценность заключается в том, что сложнее всего усвоить без практики: уровень управления Bedrock (IAM + guardrail + логирование).