Última revisión: mayo de 2026
Crea los servicios de AWS del examen AIP-C01 con Terraform puro: bloque a bloque, cada uno vinculado a un dominio del examen. El mismo código funciona en OpenTofu.
Al final de este laboratorio, habrá aprovisionado, con Terraform simple, un Agente de Bedrock con forma de producción — un bucket S3 para cualquier dato de origen, un rol IAM de mínimo privilegio que el agente asume, una Barandilla de Bedrock (Guardrail) de fuerza de producción (filtros de contenido + PII + temas denegados), el propio Agente de Bedrock, y un Grupo de Acción que permite al agente invocar una función Lambda como herramienta. Esta es la arquitectura de referencia AIP-C01 para IA generativa que llama a herramientas: un modelo con barandillas de seguridad, permisos de alcance limitado y una superficie de extensión invocable.
Cada recurso es Terraform simple. Inserte los fragmentos en un único main.tf, ejecute terraform init, luego terraform apply paso a paso.
>= 1.5 o OpenTofu >= 1.6.us-east-1 (el soporte para Agentes de Bedrock es más amplio allí).anthropic.claude-3-haiku-20240307-v1:0 como mínimo (el agente en el Paso 4 lo referencia). El acceso al modelo es un interruptor a nivel de cuenta fuera de la infraestructura como código.aws_bedrockagent_* requieren el proveedor de AWS ~> 5.60 y el servicio de Agente de Bedrock debe estar disponible generalmente (GA) en su región. Verifique en la consola de AWS si aws bedrock-agent list-agents funciona.La facturación en reposo es mínima; la factura escala con el uso:
La trampa de costos que AIP-C01 prueba específicamente: Las Bases de Conocimiento de Bedrock requieren una colección de OpenSearch Serverless que factura un mínimo de ~$350/mes en reposo. El laboratorio deliberadamente NO aprovisiona una Base de Conocimiento — el patrón de Grupo de Acción en el Paso 5 demuestra la forma de agente de llamada a herramientas más común sin la trampa de OpenSearch. Si desea estudiar las Bases de Conocimiento, hágalo conceptualmente primero; aprovisione la colección OSS solo cuando esté listo para usarla realmente.
Inicio estándar. us-east-1 para la más amplia disponibilidad de características de Bedrock + Agente de Bedrock. La fijación de la versión del proveedor no es negociable: los recursos aws_bedrockagent_* requieren ~> 5.60 o posterior.
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" {}La mayoría de los Agentes de Bedrock en producción terminan leyendo algo de S3 — documentos fuente de bases de conocimiento, definiciones de herramientas JSON, plantillas de respuesta. Aprovisionamos un bucket de antemano para no tener que configurar permisos más tarde. La encriptación + los valores predeterminados de bloqueo de acceso público son el dominio de Integración de Modelos Fundacionales, Gestión de Datos y Cumplimiento de AIP-C01 en acción.
El examen AIP-C01 evalúa un patrón de cumplimiento específico en torno a este bucket: la encriptación del lado del cliente con una clave controlada por la aplicación es la respuesta correcta cuando la regulación establece que "AWS nunca debe tener los datos sin encriptar". Para todo lo demás, SSE-S3 (lo que hacemos aquí) es suficiente.
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"
}
}
}El dominio de Seguridad, Protección y Gobernanza de IA de AIP-C01 (20% del examen) es mucho más profundo que la versión AIF-C01. El examen evalúa la composición multicapa de la barandilla: filtros de contenido para categorías dañinas con alta fuerza, políticas de información sensible para PII (con BLOCK en lugar del estilo AIF ANONYMIZE — los agentes de producción suelen necesitar bloqueos estrictos), y políticas de temas para temas prohibidos específicos de la aplicación.
Configuramos los tres. El tema denegado "FinancialAdvice" en la política es una barandilla de producción común para chatbots no financieros — incluso Claude 3 a veces se desviará para dar consejos bursátiles a menos que le diga a la barandilla que bloquee la desviación temática. AIP-C01 prueba este patrón de composición exacto en preguntas de escenario donde la instrucción es benigna pero la respuesta podría salirse de la política.
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"
}
}
}El agente une un modelo fundacional, una instrucción de sistema y (en el Paso 5) uno o más grupos de acción que extienden sus capacidades. El rol IAM que adjuntamos es el rol de ejecución del agente — es lo que el agente usa para invocar modelos, recuperar de bases de conocimiento y llamar a las Lambdas de los grupos de acción. El dominio de Implementación e Integración de AIP-C01 prueba esta forma exacta de rol/confianza: bedrock.amazonaws.com como principal, permisos de alcance limitado para bedrock:InvokeModel en ARN de modelos específicos, y lambda:InvokeFunction en ARN de funciones específicas.
El campo instruction del agente es la instrucción del sistema — corta, orientada a la acción, que nombra el propósito del agente. Las preguntas de AIP-C01 sobre ingeniería de prompts a nivel de agente prueban exactamente esto: la instrucción es la personalidad persistente; el mensaje del usuario cambia en cada turno.
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
}
}Los Grupos de Acción son la forma en que los Agentes de Bedrock llaman a su código. El patrón: definir el esquema de la API (lo que la herramienta acepta y devuelve), apuntar a una Lambda que implementa las acciones, y Bedrock se encarga del resto — cuando el modelo decide que necesita la herramienta, llama a su Lambda con argumentos estructurados y devuelve la respuesta a la conversación.
Definimos una acción mínima get_current_time con el esquema OpenAPI 3.0 que Bedrock espera. La implementación de la Lambda es intencionadamente pequeña — lo que el examen evalúa es la forma de la integración (Lambda que llama a funciones + esquema OpenAPI + permiso de invocación de Bedrock), no la lógica interna de la función.
El recurso aws_lambda_permission es el problema clásico de AIP-C01: sin él, la invocación de la Lambda por parte del agente recibe AccessDenied aunque todas las demás piezas estén correctamente conectadas. Agente de Bedrock → Lambda es un patrón de invocación de servicio externo; la política de recursos de la función necesita permitir bedrock.amazonaws.com explícitamente.
Con los Grupos de Acción implementados, la forma completa del agente está lista: modelo + instrucción del sistema + barandilla de seguridad + extensibilidad de llamada a herramientas, todo bajo una identidad IAM con alcance limitado. Cada patrón adicional de AIP-C01 (recuperación de Bases de Conocimiento, agentes de múltiples acciones, colaboración entre agentes a través de agentes supervisores) extiende esta base.
# ── 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 derriba todo en este laboratorio, con cuidado en el orden:
force_destroy = false. Si subió algún dato de referencia, vacíelo (aws s3 rm s3://<bucket> --recursive) antes de destruirlo.AIP-C01 cubre superficies de GenAI en producción que este laboratorio no puede abarcar — Bases de Conocimiento de Bedrock (requieren OpenSearch Serverless = $350+/mes en reposo, omitido deliberadamente según la nota de costos), Alias de Agente de Bedrock para la gestión de versiones y el cambio de tráfico, colaboración multi-agente (agentes supervisores que delegan en subagentes especialistas), memoria del agente para estados conversacionales de larga duración, Modelos Personalizados de Bedrock (ajuste fino), Rendimiento Aprovisionado de Bedrock para despliegues de producción de alto volumen, Amazon Q para Negocios (sin recursos de Terraform), SageMaker JumpStart para el alojamiento de modelos fundacionales fuera de la plataforma, y la pila de observabilidad de Bedrock (registro de invocación de modelos más profundo de lo que cubría AIF-C01).
Nos ceñimos a la forma Agente + Grupo de Acción + Barandilla de Producción (Guardrail) porque es la arquitectura de GenAI en producción más evaluada en el examen y el sustrato al que se adhieren todos los patrones más avanzados. Las Bases de Conocimiento se adhieren a este agente. Los alias versionan este agente. La colaboración multi-agente compone agentes como este.
Para la cobertura de las superficies anteriores, las secciones Buscar, Manual y Editorial de esta página de certificación contienen el material conceptual. Un laboratorio de seguimiento natural añadiría una Base de Conocimiento encima de esta base (el costo de OpenSearch es la única razón por la que no lo incluimos aquí).