AI

Bedrock Agent en Python a través de AWS CDK con la API SERP de Bright Data.

Esta guía muestra cómo utilizar AWS CDK en Python para crear un agente AWS Bedrock que utilice la API SERP de Bright Data para obtener datos de búsqueda web en tiempo real.
11 min de lectura
AWS CDK_SERP API blog image

En este artículo, verá:

  • Qué es el AWS Cloud Development Kit (CDK) y cómo se puede utilizar para definir e implementar la infraestructura en la nube.
  • Por qué debería dar a los agentes de AWS Bedrock IA, creados con AWS CDK, acceso a los resultados de búsqueda web utilizando una herramienta preparada para la IA como la API SERP de Bright Data.
  • Cómo crear un agente AWS Bedrock integrado con la API SERP utilizando AWS CDK en Python.

¡Empecemos!

¿Qué es el kit de desarrollo en la nube (CDK) de AWS?

El AWS Cloud Development Kit, también conocido como AWS CDK, es un marco de código abierto para crear infraestructura en la nube como código utilizando lenguajes de programación modernos. Le proporciona lo que necesita para aprovisionar recursos de AWS e implementar aplicaciones a través de AWS CloudFormation utilizando lenguajes de programación como TypeScript, Python, Java, C# y Go.

Gracias a AWS CDK, también puede crear agentes de IA para Amazon Bedrock mediante programación, ¡exactamente lo que hará en este tutorial!

Los modelos de lenguaje grandes se entrenan con conjuntos de datos que representan conocimientos solo hasta un determinado momento. Como resultado, tienden a producir respuestas inexactas o alucinadas. Esto es especialmente problemático para los agentes de IA que requieren información actualizada.

Esto se puede resolver dotando a su agente de IA de la capacidad de obtener datos nuevos y fiables en una configuración RAG (Retrieval-Augmented Generation, generación aumentada por recuperación). Por ejemplo, el agente de IA podría realizar búsquedas en la web para recopilar información verificable, ampliando así sus conocimientos y mejorando su precisión.

Es posible crear una función AWS Lambda personalizada para rastrear los motores de búsqueda, pero resulta bastante complicado. Tendría que manejar la representación de JavaScript, los CAPTCHA, los cambios en la estructura de los sitios y los bloqueos de IP.

Un enfoque mejor es utilizar una API SERP con múltiples funciones, como la API SERP de Bright Data. Esta se encarga de los proxies, el desbloqueo, la escalabilidad, el formato de los datos y mucho más. Al integrarla con AWS Bedrock mediante una función Lambda, su agente de IA creado con AWS CDK podrá acceder a resultados de búsqueda en tiempo real para ofrecer respuestas más fiables.

Cómo desarrollar un agente de IA con integración de la API SERP utilizando AWS CDK en Python

En esta sección paso a paso, aprenderá a utilizar AWS CDK con Python para crear un agente de IA de AWS Bedrock. Este será capaz de obtener datos de los motores de búsqueda a través de la API SERP de Bright Data.

La integración se implementará a través de una función Lambda (que llama a la API SERP) que el agente puede invocar como herramienta. En concreto, para crear un agente Amazon Bedrock, los componentes principales son:

  • Grupo de acciones: define las funciones que el agente puede ver y llamar.
  • Función Lambda: implementa la lógica para consultar la API SERP de Bright Data.
  • Agente de IA: coordina las interacciones entre los modelos básicos, las funciones y las solicitudes de los usuarios.

Esta configuración se implementará íntegramente con AWS CDK en Python. Para obtener los mismos resultados utilizando la consola visual de AWS Bedrock, consulte nuestra guía Amazon Bedrock + Bright Data.

Siga los pasos que se indican a continuación para crear un agente de IA de AWS Bedrock utilizando AWS CDK, mejorado con capacidades de búsqueda web en tiempo real a través de la API SERP.

Requisitos previos

Para seguir este tutorial, necesita:

Paso n.º 1: Instalar y autorizar la CLI de AWS

Antes de continuar con AWS CDK, debe instalar la CLI de AWS y configurarla para que su terminal pueda autenticarse con su cuenta de AWS.

Nota: Si ya tiene la CLI de AWS instalada y configurada para la autenticación, omita este paso y continúe con el siguiente.

Instale la CLI de AWS siguiendo la guía de instalación oficial para su sistema operativo. Una vez instalada, verifique la instalación ejecutando:

aws --version

Debería ver un resultado similar a este:

aws-cli/2.31.32 Python/3.13.9 Windows/11 exe/AMD64

A continuación, ejecute el comando configure para configurar sus credenciales:

aws configure

Se le pedirá que introduzca:

  1. ID de clave de acceso de AWS
  2. Clave secreta de acceso de AWS
  3. Nombre de la región predeterminada (por ejemplo, us-east-1)
  4. Formato de salida predeterminado (opcional, por ejemplo, json)

Rellene los tres primeros campos, ya que son necesarios para el desarrollo y la implementación de CDK. Si se pregunta dónde obtener esa información:

  1. Vaya a AWS e inicie sesión.
  2. En la esquina superior derecha, haga clic en el nombre de su cuenta para abrir el menú de la cuenta y seleccione la opción «Credenciales de seguridad».
  3. En la sección «Claves de acceso», cree una nueva clave. Guarde tanto el «ID de la clave de acceso» como la «Clave de acceso secreta» en un lugar seguro.

¡Listo! Su máquina puede conectarse a su cuenta de AWS a través de la CLI. Ya está listo para continuar con el desarrollo de AWS CDK.

Paso n.º 2: Instalar AWS CDK

Instale AWS CDK globalmente en su sistema utilizando el paquete npm aws-cdk:

npm install -g aws-cdk

A continuación, compruebe la versión instalada ejecutando:

cdk --version

Debería ver un resultado similar a este:

2.1031.2 (compilación 779352d)

Nota: Se requiere la versión 2.174.3 o posterior para el desarrollo y la implementación de agentes de IA utilizando AWS CDK con Python.

¡Genial! Ahora ya tiene instalada localmente la CLI de AWS CDK.

Paso n.º 3: Configure su proyecto AWS CDK Python

Comience creando una nueva carpeta de proyecto para su agente de IA AWS CDK + Bright Data API SERP.
Por ejemplo, puede llamarla aws-cdk-bright-data-web-search-agent:

mkdir aws-cdk-bright-data-web-search-agent

Navega hasta la carpeta:

cd aws-cdk-bright-data-web-search-agent

A continuación, inicialice una nueva aplicación AWS CDK basada en Python mediante el comando init:

cdk init app --language python

Esto puede tardar un momento, así que tenga paciencia mientras la CLI de CDK configura la estructura de su proyecto.

Una vez inicializada, la carpeta de su proyecto debería tener este aspecto:

aws-cdk-bright-data-web-search-agent
├── .git/
├── venv/
├── aws_cdk_bright_data_web_search_agent/
│   ├── __init__.py
│   └── aws_cdk_bright_data_web_search_agent_stack.py
├── tests/
│   ├── __init__.py
│   └── unit/
│       ├── __init__.py
│       └── test_aws_cdk_bright_data_web_search_agent_stack.py
├── .gitignore
├── app.py
├── cdk.json
├── README.md
├── requirements.txt
├── requirements-dev.txt
└── source.bat

Lo que debes tener en cuenta son estos dos archivos:

  • app.py: contiene la definición de nivel superior de la aplicación AWS CDK.
  • aws_cdk_bright_data_web_search_agent/aws_cdk_bright_data_web_search_agent_stack.py: Define la pila para el agente de búsqueda web (aquí es donde implementará la lógica de su agente de IA).

Para obtener más detalles, consulta la guía oficial de AWS sobre cómo trabajar con CDK en Python.

Ahora, carga tu proyecto en tu IDE de Python favorito, como PyCharm o Visual Studio Code con la extensión Python.

Tenga en cuenta que el comando cdk init crea automáticamente un entorno virtual Python en el proyecto. En Linux o macOS, actívelo con:

source .venv/bin/activate

O, de forma equivalente, en Windows, ejecute:

.venvScriptsactivate

A continuación, dentro del entorno virtual activado, instala todas las dependencias necesarias:

python -m pip install -r requirements.txt

¡Fantástico! Ahora ya tiene configurado un entorno AWS CDK Python para el desarrollo de agentes de IA.

Paso n.º 4: Ejecutar el arranque de AWS CDK

El arranque es el proceso de preparación de su entorno AWS para su uso con el kit de desarrollo en la nube de AWS. Antes de implementar una pila CDK, su entorno debe arrancarse.

En términos más sencillos, este proceso configura los siguientes recursos en su cuenta de AWS:

  • Un bucket de Amazon S3: almacena los archivos de su proyecto CDK, como el código de la función AWS Lambda y otros activos.
  • Un repositorio de Amazon ECR: almacena imágenes de Docker.
  • Roles de AWS IAM: otorgan los permisos necesarios para que AWS CDK realice implementaciones. (Para obtener más detalles, consulte la documentación de AWS sobre los roles de IAM creados durante el arranque).

Para iniciar el proceso de arranque de CDK, ejecute el siguiente comando en la carpeta de su proyecto:

cdk bootstrap

En el servicio AWS CloudFormation, este comando crea una pila denominada «CDKToolkit» que contiene todos los recursos necesarios para implementar aplicaciones CDK.

Compruébelo accediendo a la consola de CloudFormation y consultando la página «Stacks»:
Note the “CDKToolkit” stack in CloudFormation

Verá una pila «CDKToolkit». Siga su enlace y debería ver algo como esto:
The “CDKToolkit” stack generated by the bootstrapping process
Para obtener más información sobre cómo funciona el proceso de arranque, por qué es necesario y qué ocurre entre bastidores, consulte la documentación oficial de AWS CDK.

Paso n.º 5: Prepárese con la API SERP de Bright Data

Ahora que su entorno AWS CDK está configurado para el desarrollo y la implementación, complete los pasos preliminares preparando su cuenta de Bright Data y configurando el servicio API SERP. Puede seguir la documentación oficial de Bright Data o seguir los pasos que se indican a continuación.

Si aún no tiene una cuenta, cree una cuenta de Bright Data. También puede simplemente iniciar sesión. En su cuenta de Bright Data, vaya a la página «Proxy y scraping». En la sección «Mis zonas», busque la fila «API SERP» en la tabla:
Note the “serp_api” row in the table
Si no ve una fila con la etiqueta «API SERP», significa que aún no ha configurado una zona. Desplácese hacia abajo hasta la sección «API SERP» y haga clic en «Crear zona» para añadir una:
Configuring the SERP API zone
Cree una zona API SERP y asígnele un nombre como serp_api (o cualquier otro nombre que prefiera). Recuerde el nombre de la zona que ha elegido, ya que lo necesitará para acceder al servicio a través de la API.

En la página del producto API SERP, activa el interruptor «Activar» para habilitar la zona:
Activating the SERP API zone
Por último, siga la guía oficial para generar su clave API de Bright Data. Guárdela en un lugar seguro, ya que la necesitará en breve.

¡Genial! Ahora ya tiene todo listo para utilizar la API SERP de Bright Data en su agente AWS Bedrock IA desarrollado con AWS CDK.

Paso n.º 6: almacene los secretos de su aplicación CDK en AWS Secrets Manager

Acaba de obtener información confidencial (por ejemplo, su clave API de Bright Data y el nombre de la zona API SERP). En lugar de codificar estos valores en el código de su función Lambda, debe leerlos de forma segura desde AWS Secrets Manager.

Ejecute el siguiente comando Bash para crear un secreto llamado BRIGHT_DATA que contenga su clave API de Bright Data y la zona API SERP:

aws secretsmanager create-secret --name "BRIGHT_DATA" --description "Credenciales API para la integración de Bright Data API SERP" --secret-string '{
    "BRIGHT_DATA_API_KEY": "<YOUR_BRIGHT_DATA_API_KEY>",
    "BRIGHT_DATA_SERP_API_ZONE": "<YOUR_BRIGHT_DATA_SERP_API_ZONE>"
  }'

O, de forma equivalente, en PowerShell:

aws secretsmanager create-secret `
  --name "BRIGHT_DATA" `
  --description "Credenciales API para la integración de Bright Data API SERP" `
  --secret-string '{"BRIGHT_DATA_API_KEY":"<TU_CLAVE_API_BRIGHT_DATA>","BRIGHT_DATA_API_SERP_ZONE":"<TU_ZONA_API_BRIGHT_DATA_SERP>"}'

Asegúrese de sustituir <YOUR_BRIGHT_DATA_API_KEY> y <YOUR_BRIGHT_DATA_SERP_API_ZONE> por los valores reales que ha obtenido anteriormente.

Ese comando configurará el secreto BRIGHT_DATA, como puede confirmar en la consola de AWS Secrets Manager, en la página «Secretos»:
Note the “BRIGHT_DATA” secret in AWS Secrets Manager

Si hace clic en el botón «Recuperar valor secreto», debería ver los secretos BRIGHT_DATA_API_KEY y BRIGHT_DATA_SERP_API_ZONE:
Note the "BRIGHT_DATA_API_KEY” and “BRIGHT_DATA_SERP_API_ZONE” secrets
¡Genial! Estos secretos se utilizarán para autenticar las solicitudes a la API SERP en una función Lambda que definirá en breve.

Paso n.º 7: Implemente su pila AWS CDK

Ahora que ha configurado todo lo necesario para crear su agente de IA, el siguiente paso es implementar la pila de AWS CDK en Python. En primer lugar, es importante comprender qué es una pila de AWS CDK.

Una pila es la unidad más pequeña que se puede implementar en CDK. Representa una colección de recursos de AWS definidos mediante construcciones de CDK. Cuando implementa una aplicación CDK, todos los recursos de la pila se implementan juntos como una única pila de CloudFormation.

El archivo de pila predeterminado se encuentra en:

aws_cdk_bright_data_web_search_agent/aws_cdk_bright_data_web_search_agent_stack.py

Inspecciónelo en Visual Studio Code:
The CDK stack script in Visual Studio Code
Contiene una plantilla de pila genérica en la que definirá su lógica. Su tarea consiste en implementar la pila completa de AWS CDK para crear el agente de IA con la integración de la API SERP de Bright Data, incluidas las funciones Lambda, los roles de IAM, los grupos de acciones y el agente de IA Bedrock.

Consiga todo eso con:

import aws_cdk.aws_iam as iam
from aws_cdk import (
  Aws,
  CfnOutput,
  Duration,
  Stack)

from aws_cdk import aws_bedrock as bedrock
from aws_cdk import aws_lambda as _lambda
from constructs import Construct

# Define las constantes necesarias
AI_MODEL_ID = "amazon.nova-lite-v1:0" # El nombre del LLM utilizado para alimentar el agente
ACTION_GROUP_NAME = "action_group_web_search"
LAMBDA_FUNCTION_NAME = "serp_api_lambda"
AGENT_NAME = "web_search_agent"

# Definir la pila CDK para implementar el agente de búsqueda web impulsado por Bright Data
class AwsCdkBrightDataWebSearchAgentStack(Stack):

    def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
        super().__init__(scope, construct_id, **kwargs)

        # Otorga permisos Lambda para registrar y leer secretos.
        lambda_policy = iam.Policy(
            self,
            "LambdaPolicy",
            statements=[
                # Permiso para crear grupos de registros de CloudWatch.
                iam.PolicyStatement(
                    sid="CreateLogGroup",
                    effect=iam.Effect.ALLOW,
                    actions=["logs:CreateLogGroup"],
                    resources=[f"arn:aws:logs:{Aws.REGION}:{Aws.ACCOUNT_ID}:*"],
                ),
                # Permiso para crear flujos de registros y colocar eventos de registro
                iam.PolicyStatement(
                    sid="CreateLogStreamAndPutLogEvents",
                    effect=iam.Effect.ALLOW,
                    actions=["logs:CreateLogStream", "logs:PutLogEvents"],
                    resources=[
                        f"arn:aws:logs:{Aws.REGION}:{Aws.ACCOUNT_ID}:log-group:/aws/lambda/{LAMBDA_FUNCTION_NAME}",
                        f"arn:aws:logs:{Aws.REGION}:{Aws.ACCOUNT_ID}:log-group:/aws/lambda/{LAMBDA_FUNCTION_NAME}:log-stream:*",
                    ],
                ),
                # Permiso para leer secretos BRIGHT_DATA desde Secrets Manager
                iam.PolicyStatement(
                    sid="GetSecretsManagerSecret",
                    effect=iam.Effect.ALLOW,
                    actions=["secretsmanager:GetSecretValue"],
                    resources=[
                        f"arn:aws:secretsmanager:{Aws.REGION}:{Aws.ACCOUNT_ID}:secret:BRIGHT_DATA*",
                    ],),

],
)

        # Definir la función IAM para las funciones Lambda
        lambda_role = iam.Role(
            self,
            "LambdaRole",
            role_name=f"{LAMBDA_FUNCTION_NAME}_role",
            assumed_by=iam.ServicePrincipal("lambda.amazonaws.com"),
        )

        # Adjuntar la política a la función Lambda
        lambda_role.attach_inline_policy(lambda_policy)

        # Definición de la función Lambda
        lambda_function = _lambda.Function(
            self,
            LAMBDA_FUNCTION_NAME,
            function_name=LAMBDA_FUNCTION_NAME,
            runtime=_lambda.Runtime.PYTHON_3_12,  # Tiempo de ejecución de Python
            architecture=_lambda.Architecture.ARM_64,
            code=_lambda.Code.from_asset("lambda"),  # Leer el código Lambda desde la carpeta «lambda/»
            handler=f"{LAMBDA_FUNCTION_NAME}.lambda_handler",
timeout=Duration.seconds(120),
role=lambda_role,  # Adjuntar función IAM
            environment={"LOG_LEVEL": "DEBUG", "ACTION_GROUP": f"{ACTION_GROUP_NAME}"},
        )

        # Permitir que el servicio Bedrock invoque funciones Lambda
        bedrock_account_principal = iam.PrincipalWithConditions(
            iam.ServicePrincipal("bedrock.amazonaws.com"),
            conditions={
                "StringEquals": {"aws:SourceAccount": f"{Aws.ACCOUNT_ID}"},
            },
        )
        lambda_function.add_permission(
            id="LambdaResourcePolicyAgentsInvokeFunction",
            principal=bedrock_account_principal,
            action="lambda:invokeFunction",
        )

        # Definir la política de IAM para el agente Bedrock
        agent_policy = iam.Policy(
            self,
            "AgentPolicy",
            statements=[
                iam.PolicyStatement(
                    sid="AmazonBedrockAgentBedrockFoundationModelPolicy",
                    effect=iam.Effect.ALLOW,
                    actions=["bedrock:InvokeModel"],  # Otorgarle permiso para llamar al modelo base
                    resources=[f"arn:aws:bedrock:{Aws.REGION}::foundation-model/{AI_MODEL_ID}"],
                ),
            ],
        )

        # Relación de confianza para que el rol de agente permita a Bedrock asumirlo
        agent_role_trust = iam.PrincipalWithConditions(
            iam.ServicePrincipal("bedrock.amazonaws.com"),
            conditions={
                "StringLike": {"aws:SourceAccount": f"{Aws.ACCOUNT_ID}"},
                "ArnLike": {"aws:SourceArn": f"arn:aws:bedrock:{Aws.REGION}:{Aws.ACCOUNT_ID}:agent/*"},
            },
        )

        # Definir la función IAM para el agente Bedrock
        agent_role = iam.Role(
            self,
            "AmazonBedrockExecutionRoleForAgents",
            role_name=f"AmazonBedrockExecutionRoleForAgents_{AGENT_NAME}",
            assumed_by=agent_role_trust,
        )
        agent_role.attach_inline_policy(agent_policy)

        # Definir el grupo de acciones para el agente de IA
        action_group = bedrock.CfnAgent.AgentActionGroupProperty(
            action_group_name=ACTION_GROUP_NAME,
            description="Llamar a la API SERP de Bright Data para realizar búsquedas web y recuperar información actualizada de los motores de búsqueda.",
            action_group_executor=bedrock.CfnAgent.ActionGroupExecutorProperty(lambda_=lambda_function.function_arn),
            function_schema=bedrock.CfnAgent.FunctionSchemaProperty(
                functions=[
                    bedrock.CfnAgent.FunctionProperty(
                        name=LAMBDA_FUNCTION_NAME,
                        description="Se integra con la API SERP de Bright Data para realizar búsquedas web.",
                        parameters={
                            "search_query": bedrock.CfnAgent.ParameterDetailProperty(
                                type="string",
                                description="La consulta de búsqueda para la búsqueda web de Google.",
                                required=True,
                            )
                        },
                    ),
                ]
            ),
        )

        # Crear y especificar el agente Bedrock AI
        agent_description = """
            Un agente de IA que puede conectarse a la API SERP de Bright Data para recuperar contexto de búsqueda web actualizado de los motores de búsqueda.
        """

        agent_instruction = """
            Eres un agente diseñado para gestionar casos de uso que requieren recuperar y procesar información actualizada.
            Puedes acceder a datos actuales, incluyendo noticias y resultados de motores de búsqueda, a través de búsquedas web impulsadas por la API SERP de Bright Data.
        """

        agent = bedrock.CfnAgent(
            self,
            AGENT_NAME,
            description=agent_description,
            agent_name=AGENT_NAME,
            foundation_model=AI_MODEL_ID,
            action_groups=[action_group],
            auto_prepare=True,
            instruction=agent_instruction,
            agent_resource_role_arn=agent_role.role_arn,
        )

        # Exportar las salidas clave para la implementación.
        CfnOutput(self, "agent_id", value=agent.attr_agent_id)
        CfnOutput(self, "agent_version", value=agent.attr_agent_version)

El código anterior es una versión modificada de la implementación oficial de la pila AWS CDK para un agente de IA de búsqueda web.

Lo que ocurre en esas más de 150 líneas de código refleja los pasos descritos anteriormente en la guía: Paso n.º 1, Paso n.º 2 y Paso n.º 3 de nuestro artículo«Cómo integrar la API SERP de Bright Data con los agentes de IA de AWS Bedrock».

Para comprender mejor lo que ocurre en ese archivo, desglosemos el código en cinco bloques funcionales:

  1. Política y función IAM de Lambda: configura los permisos para la función Lambda. Lambda requiere acceso a los registros de CloudWatch para registrar los detalles de ejecución y a AWS Secrets Manager para leer de forma segura la clave y la zona de la API de Bright Data. Se crea una función IAM para Lambda y se adjunta la política adecuada, lo que garantiza que funcione de forma segura con solo los permisos que necesita.
  2. Definición de la función Lambda: aquí se define y configura la función Lambda. Especifica el tiempo de ejecución y la arquitectura de Python, apunta a la carpeta que contiene el código Lambda (que se implementará en el siguiente paso) y configura variables de entorno como el nivel de registro y el nombre del grupo de acciones. Se conceden permisos para que AWS Bedrock pueda invocar Lambda, lo que permite al agente de IA activar búsquedas web a través de la API SERP de Bright Data.
  3. Rol IAM del agente Bedrock: crea el rol de ejecución para el agente de IA Bedrock. El agente necesita permisos para invocar el modelo de IA base seleccionado de entre los compatibles (amazon.nova-lite-v1:0, en este caso). Se define una relación de confianza para que solo Bedrock pueda asumir el rol dentro de su cuenta. Se adjunta una política que concede acceso al modelo.
  4. Definición del grupo de acciones: un grupo de acciones define las acciones específicas que puede realizar el agente de IA. Vincula al agente con la función Lambda que le permite ejecutar búsquedas web a través de la API SERP de Bright Data. El grupo de acciones también incluye metadatos para los parámetros de entrada, de modo que el agente entiende cómo interactuar con la función y qué información se requiere para cada búsqueda.
  5. Definición del agente IA de Bedrock: define el propio agente IA. Vincula al agente con el grupo de acciones y la función de ejecución, y proporciona una descripción clara e instrucciones para su uso.

Después de implementar la pila CDK, aparecerá un agente de IA en su consola de AWS. Ese agente puede realizar búsquedas web de forma autónoma y recuperar información actualizada aprovechando la integración de la API SERP de Bright Data en la función Lambda. ¡Fantástico!

Paso n.º 8: Implementar Lambda para la integración de la API SERP

Eche un vistazo a este fragmento del código anterior:

lambda_function = _lambda.Function(
    self,
    LAMBDA_FUNCTION_NAME,
    function_name=LAMBDA_FUNCTION_NAME,
    runtime=_lambda.Runtime.PYTHON_3_12,  # Tiempo de ejecución de Python
    architecture=_lambda.Architecture.ARM_64,
    code=_lambda.Code.from_asset("lambda"),  # Lee el código Lambda de la carpeta «lambda/»
    handler=f"{LAMBDA_FUNCTION_NAME}.lambda_handler",
    timeout=Duration.seconds(120),
    role=lambda_role,  # Adjuntar función IAM
    environment={"LOG_LEVEL": "DEBUG", "ACTION_GROUP": f"{ACTION_GROUP_NAME}"},
)

La línea code=_lambda.Code.from_asset("lambda") especifica que el código de la función Lambda se cargará desde la carpeta lambda/. Por lo tanto, cree una carpeta lambda/ en su proyecto y añada un archivo llamado serp_api_lambda.py dentro de ella:
The serp_api_lambda.py file inside the lambda/ folder
El archivo serp_api_lambda.py debe contener la implementación de la función Lambda utilizada por el agente de IA definido anteriormente. Implemente esta función para gestionar la integración con la API SERP de Bright Data de la siguiente manera:

import json
import logging
import os
import urllib.parse
import urllib.request

import boto3

# ----------------------------
# Configuración de registro
# ----------------------------
log_level = os.environ.get("LOG_LEVEL", "INFO").strip().upper()
logging.basicConfig(
    format="[%(asctime)s] p%(process)s {%(filename)s:%(lineno)d} %(levelname)s - %(message)s"
)
logger = logging.getLogger(__name__)
logger.setLevel(log_level)

# ----------------------------
# Región AWS del entorno
# ----------------------------
AWS_REGION = os.environ.get("AWS_REGION")
if not AWS_REGION:
    logger.warning("Variable de entorno AWS_REGION no establecida; boto3 utilizará la región predeterminada")

# ----------------------------
# Recuperar el objeto secreto de AWS Secrets Manager
# ----------------------------
def get_secret_object(key: str) -> str:
    """
    Obtener un valor secreto de AWS Secrets Manager.
    """
    session = boto3.session.Session()
    client = session.client(
        service_name='secretsmanager',
        region_name=AWS_REGION
    )

    try:
        get_secret_value_response = client.get_secret_value(
            SecretId=key
        )
    except Exception as e:
        logger.error(f"No se pudo obtener el secreto '{key}' de Secrets Manager: {e}")
        raise e

    secret = json.loads(get_secret_value_response["SecretString"])

    return secret


# Recuperar credenciales de Bright Data
bright_data_secret = get_secret_object("BRIGHT_DATA")
BRIGHT_DATA_API_KEY = bright_data_secret["BRIGHT_DATA_API_KEY"]
BRIGHT_DATA_SERP_API_ZONE = bright_data_secret["BRIGHT_DATA_SERP_API_ZONE"]

# ----------------------------
# Búsqueda web API SERP
# ----------------------------
def serp_api_web_search(search_query: str) -> str:
    """
    Llama a la API SERP de Bright Data para recuperar los resultados de búsqueda de Google.
    """
    logger.info(f"Ejecutando búsqueda en la API SERP de Bright Data para search_query='{search_query}'")

    # Codifica la consulta para la URL
    encoded_query = urllib.parse.quote(search_query)
    # Construye la URL de Google para extraer la SERP desde
    search_engine_url = f"https://www.google.com/search?q={encoded_query}"

    # Solicitud de la API SERP de Bright Data (documentación: https://docs.brightdata.com/scraping-automation/serp-api/send-your-first-request)
    url = "https://api.brightdata.com/request"
    headers = {
        "Content-Type": "application/json",
        "Authorization": f"Bearer {BRIGHT_DATA_API_KEY}"
    }
    data = {
        "zone": BRIGHT_DATA_SERP_API_ZONE,
        "url": search_engine_url,
        "format": "raw",
        "data_format": "markdown" # Para obtener el SERP como un documento Markdown listo para IA
    }

    payload = json.dumps(data).encode("utf-8")
    request = urllib.request.Request(url, data=payload, headers=headers)

    try:
        response = urllib.request.urlopen(request)
        response_data: str = response.read().decode("utf-8")
        logger.debug(f"Respuesta de la API SERP: {response_data}")
        return response_data
    except urllib.error.HTTPError as e:
        logger.error(f"Error al llamar a la API SERP de Bright Data. Error HTTP {e.code}: {e.reason}")
    except urllib.error.URLError as e:
        logger.error(f"Error al llamar a la API SERP de Bright Data. Error de URL: {e.reason}")

    return ""


# ----------------------------
# Controlador Lambda
# ----------------------------
def lambda_handler(event, _):
    """
    Controlador AWS Lambda.
    Espera un evento con actionGroup, function y parámetros opcionales (incluido search_query).
    """
    logger.debug(f"lambda_handler llamado con evento: {event}")

    action_group = event.get("actionGroup")
    function = event.get("function")
    parameters = event.get("parameters", [])

    # Extrae search_query de los parámetros
    search_query = next(
        (param["value"] for param in parameters if param.get("name") == "search_query"),
        None,
    )
    logger.debug(f"Entrada de consulta de búsqueda: {search_query}")

    serp_page = serp_api_web_search(search_query) if search_query else ""
    logger.debug(f"Resultados de la consulta de búsqueda: {serp_page}")

    # Preparar la respuesta Lambda
    function_response_body = {"TEXT": {"body": serp_page}}

    action_response = {
        "actionGroup": action_group,
        "function": function,
        "functionResponse": {"responseBody": function_response_body},
    }

    response = {"response": action_response, "messageVersion": event.get("messageVersion")}

    logger.debug(f"lambda_handler response: {response}")

    return response

Esta función Lambda gestiona tres tareas principales:

  1. Recuperar credenciales API de forma segura: obtiene la clave API de Bright Data y la zona API SERP de AWS Secrets Manager, de modo que la información confidencial nunca queda codificada.
  2. Realizar búsquedas web a través de la API SERP: codifica la consulta de búsqueda, construye la URL de búsqueda de Google y envía una solicitud a la API SERP de Bright Data. La API devuelve los resultados de la búsqueda con formato Markdown, que es un formato de datos ideal para el consumo de IA.
  3. Responder a AWS Bedrock: devuelve los resultados en una respuesta estructurada que el agente de IA puede utilizar.

¡Ya está! Su función AWS Lambda para conectarse a la API SERP de Bright Data ya se ha definido correctamente.

Paso n.º 9: Implemente su aplicación AWS CDK

Ahora que se han implementado su pila CDK y su función Lambda relacionada, el último paso es implementar su pila en AWS. Para ello, en la carpeta de su proyecto, ejecute el comando de implementación:

cdk deploy

Cuando se le solicite permiso para crear la función IAM, escriba y para aprobar.

Al cabo de unos instantes, si todo funciona como se espera, debería ver un resultado como este:
The output of the “deploy” command

A continuación, vaya a la consola de Amazon Bedrock. Dentro de la página «Agentes», debería ver una entrada «web_search_agent»:
Note the “web_search_agent” entry

Abra el agente y verá los detalles del agente implementado:
The details page for the “web_search_agent”
Inspecciónelo pulsando el botón «Edit and Agent Builder» (Editar y creador de agentes) y verá exactamente el mismo agente de IA implementado en«Cómo integrar la API SERP de Bright Data con AWS Bedrock».

Por último, ten en cuenta que puedes probar el agente directamente utilizando la interfaz de chat de la esquina derecha. ¡Esto es lo que harás en el siguiente y último paso!

Paso n.º 10: Prueba el agente de IA

Para probar las capacidades de búsqueda web y recuperación de datos en tiempo real de su agente de IA, pruebe con un comando como:

«Dame las tres últimas noticias sobre el cierre del Gobierno de EE. UU.».

(Nota: esto es solo un ejemplo. Por lo tanto, puede probar cualquier comando que requiera resultados de búsqueda web).

Es una solicitud ideal porque pide información actualizada que el modelo base por sí solo no conoce. El agente llamará a la función Lambda integrada con la API SERP, recuperará los resultados y procesará los datos para generar una respuesta coherente.

Ejecute esta indicación en la sección «Probar agente» de su agente y debería ver un resultado similar a este:
Running the prompt in the AWS Amazon Bedrock console
Entre bastidores, el agente invoca la función Lambda de la API SERP, recupera los últimos resultados de búsqueda de Google para la consulta «cierre del gobierno de EE. UU.» y extrae los artículos más relevantes (junto con sus URL). Esto es algo que un LLM estándar, como el Nova Lite configurado, no puede hacer por sí solo.

En detalle, esta es la respuesta generada por el agente:

The agent’s response
Los artículos de noticias seleccionados (y sus URL) coinciden con lo que encontrarías manualmente en Google para la consulta «cierre del gobierno de EE. UU.» (al menos en la fecha en que se probó el agente):
The SERP for the “US government shutdown” search query
Ahora bien, cualquiera que haya intentado extraer resultados de búsqueda de Google sabe lo difícil que puede resultar debido a la detección de bots, las prohibiciones de IP, la representación de JavaScript y otros retos. La API SERP de Bright Data se encarga de todos estos problemas por usted, devolviendo SERP extraídos en formato Markdown (o HTML, JSON, etc.) optimizado para IA.

Para confirmar que su agente realmente llamó a la función Lambda de la API SERP, haga clic en el botón «Mostrar rastro» en el cuadro de respuesta. En la sección «Paso 1 del rastro», desplácese hacia abajo hasta el registro de invocación del grupo para inspeccionar el resultado de la llamada a Lambda:
The output of the SERP API Lambda function
Esto verifica que la función Lambda se ha ejecutado correctamente y que el agente ha interactuado con la API SERP según lo previsto. También puede consultar los registros de AWS CloudWatch de su función Lambda para confirmar la ejecución.

¡Es hora de llevar a tu agente más allá! Prueba las indicaciones relacionadas con la verificación de datos, la supervisión de marcas, el análisis de tendencias de mercado u otros escenarios para ver cómo funciona en diferentes casos de uso de agentes y RAG.

¡Et voilà! Ha creado con éxito un agente AWS Bedrock integrado con la API SERP de Bright Data utilizando Python y la biblioteca AWS CDK. Este agente de IA es capaz de recuperar datos de búsqueda web actualizados, fiables y contextuales bajo demanda.

Conclusión

En esta entrada del blog, ha aprendido a integrar la API SERP de Bright Data en un agente de IA de AWS Bedrock utilizando un proyecto AWS CDK Python. Este flujo de trabajo es perfecto para los desarrolladores que desean crear agentes de IA más sensibles al contexto en AWS.

Para crear agentes de IA aún más sofisticados, explore la infraestructura de Bright Data para IA. Esta ofrece un conjunto de herramientas para recuperar, validar y transformar datos web en tiempo real.

¡Cree hoy mismo una cuenta gratuita en Bright Data y comience a experimentar con nuestras soluciones de datos web preparadas para la IA!

AI

Ofrezca a los agentes de AWS Bedrock la capacidad de buscar en la web a través de la API SERP de Bright Data.

Aprenda a potenciar los agentes de AWS Bedrock integrando la API SERP de Bright Data, lo que permite realizar búsquedas web en tiempo real y obtener respuestas más precisas y actualizadas.
19 min de lectura
AWS Bedrock Agents with SERP API blog image

En este tutorial, aprenderá

  • Qué es un agente de IA de AWS Bedrock y qué puede hacer.
  • Por qué dar a los agentes acceso a los resultados de búsqueda web a través de una herramienta preparada para IA como la API SERP de Bright Data mejora la precisión y el contexto.
  • Cómo crear un agente de AWS Bedrock integrado con la API SERP paso a paso en la consola de AWS.
  • Cómo es posible lograr lo mismo utilizando código con AWS CDK.

¡Vamos a sumergirnos!

¿Qué es un agente IA de AWS Bedrock?

En AWS Bedrock, un agente de IA es un servicio que utiliza LLMs para automatizar tareas de múltiples pasos dividiéndolas en pasos lógicos. Más en detalle, un agente de IA de Amazon Bedrock es un sistema que aprovecha los modelos de cimientos, las API y los datos para comprender las solicitudes de los usuarios, recopilar información relevante y completar tareas automáticamente.

Los agentes de AWS Bedrock admiten memoria para la continuidad de las tareas, seguridad integrada a través de Bedrock Guardrails y pueden colaborar con otros agentes para flujos de trabajo complejos. Gracias a la infraestructura de AWS, son administrados, escalables y sin servidor, lo que simplifica el proceso de creación e implementación de aplicaciones impulsadas por IA.

Por qué los agentes de IA en Amazon Bedrock se benefician del contexto dinámico de búsqueda web

Los LLM se entrenan en grandes Conjuntos de datos que representan el conocimiento disponible hasta un punto específico en el tiempo. Esto significa que cuando se libera un LLM, solo conoce lo que se incluyó en sus datos de entrenamiento, que rápidamente quedan obsoletos.

Por eso, los modelos de IA carecen de información en tiempo real sobre los acontecimientos actuales y los conocimientos emergentes. Como resultado, pueden producir respuestas desfasadas, incorrectas o incluso alucinadas, lo que supone un gran problema en los agentes de IA.

Esta limitación puede superarse dotando a su agente de IA de la capacidad de obtener información fresca y fiable en una configuración RAG (Retrieval-Augmented Generation). La idea es equipar a tu agente con una herramienta fiable que pueda realizar búsquedas en la web y recuperar datos verificables para apoyar su razonamiento, ampliar sus conocimientos y, en última instancia, ofrecer resultados más precisos.

Una opción sería crear una función de AWS Lambda personalizada que rastree las SERP (páginas de resultados de motores de búsqueda) y prepare los datos para la ingesta de LLM. Sin embargo, este enfoque es técnicamente complejo. Requiere el manejo de la renderización de JavaScript, Resolución de CAPTCHA, y el cambio constante de las estructuras del sitio. Además, no es fácilmente escalable, ya que los motores de búsqueda como Google pueden bloquear rápidamente tus IPs tras unas pocas peticiones automatizadas.

Una solución mucho mejor es utilizar una API de búsqueda web y SERP de primera categoría, como la API SERP de Bright Data. Este servicio devuelve los datos del motor de búsqueda a la vez que gestiona automáticamente los proxies, el desbloqueo, el análisis de datos y todos los demás retos.

Al integrar la API SERP de Bright Data en AWS Bedrock mediante una función Lambda, su agente de IA obtiene acceso a la información de búsqueda web, sin ninguna de las cargas operativas. ¡Veamos cómo!

Cómo integrar la API SERP de Bright Data en su agente de IA de AWS Bedrock para casos de uso contextualizados de búsqueda

En esta sección paso a paso, aprenderá a proporcionar a su agente de IA de AWS Bedrock la capacidad de obtener datos en tiempo real de motores de búsqueda mediante la API SERP de Bright Data.

Esta integración permite a su agente ofrecer respuestas más contextuales y actualizadas, incluyendo enlaces relevantes para lecturas adicionales. La configuración se realizará visualmente en la consola de AWS Bedrock, con sólo una pequeña cantidad de código necesario.

Siga los siguientes pasos para crear un agente de IA de AWS Bedrock sobrealimentado a través de la API SERP.

Requisitos previos

Para seguir este tutorial, necesitas:

No se preocupe si aún no ha creado una cuenta de Bright Data. Se le guiará a través de ese proceso más adelante en la guía.

Paso #1: Crear un Agente AWS Bedrock

Para crear un agente de IA de AWS Bedrock, inicie sesión en su cuenta de AWS y abra la consola de Amazon Bedrock buscando el servicio en la barra de búsqueda:

Reaching the Amazon Bedrock console

A continuación, en la consola de Bedrock, selecciona “Agentes” en el menú de la izquierda y haz clic en el botón “Crear agente”:

Pressing the “Create agent” button

Dale a tu agente un nombre y una descripción, por ejemplo

  • Nombre: web_search_agent
  • Descripción: “Un agente de IA que puede conectarse a la API SERP de Bright Data para recuperar contexto de búsqueda web fresco de los motores de búsqueda”.

Importante: Si planea utilizar LLMs de Amazon, debe utilizar guiones bajos (_) en lugar de guiones (-) en el nombre del agente, funciones, etc. El uso de guiones puede provocar una “Dependency resource: received model timeout/error exception from Bedrock. Si esto ocurre, inténtelo de nuevo“.

Filling out the “Create agent” modal

Haga clic en “Crear” para finalizar su agente IA. Ahora debería ser redirigido a la página “Agent builder”:

Reaching the “Agent builder” page

¡Genial! Ha creado con éxito un agente de IA en AWS Bedrock.

Paso #2: Configurar el Agente de IA

Ahora que ha creado un agente, necesita completar su configuración mediante la configuración de algunas opciones.

Para la información “Agent resource role”, deja la opción por defecto “Create and use a new service role”. Esto crea automáticamente un rol de AWS Identity and Access Management (IAM ) que el agente asumirá:

Configuring the “Agent resource role” option

A continuación, haga clic en “Seleccionar modelo” y elija el modelo LLM para impulsar su agente. En este ejemplo, utilizaremos el modelo “Nova Lite” de Amazon (pero cualquier otro modelo servirá):

Selecting the “Nova Lite” model

Tras seleccionar el modelo, haz clic en “Aplicar” para confirmar.

En la sección “Instrucciones para el agente”, proporcione instrucciones claras y específicas que indiquen al agente lo que debe hacer. Para este agente de búsqueda web, puede introducir algo como

Es un agente diseñado para manejar casos de uso que requieren recuperar y procesar información actualizada. Puede acceder a datos actuales, incluyendo noticias y resultados de motores de búsqueda, a través de búsquedas web impulsadas por la API SERP de Bright Data.

Tras completar las instrucciones, la sección final de detalles del agente debería tener este aspecto:

Editing the agent details

Complete la configuración de los detalles del agente haciendo clic en “Guardar” en la barra superior para guardar todos los detalles del agente.

Nota: AWS Bedrock ofrece muchas otras opciones de configuración. Explórelas para adaptar sus agentes a sus casos de uso específicos.

Paso 3: Añadir el grupo de acción API SERP

Los grupos de acción permiten a los agentes interactuar con sistemas externos o APIs para recopilar información o realizar acciones. Necesitará definir uno para integrarlo con la API SERP de Bright Data.

En la página “Constructor de agentes”, desplácese hasta la sección “Grupos de acciones” y haga clic en “Añadir”:

Pressing the “Add” button in “Action groups”

Esto abrirá un formulario para definir el grupo de acciones. Rellénelo como se indica a continuación:

  • Introduzca el nombre del grupo deacción: action_group_web_search (de nuevo, utilice guiones bajos _, no guiones -)
  • Descripción: “Llamar a la API SERP de Bright Data para realizar búsquedas web y recuperar información actualizada de los motores de búsqueda”.
  • Tipo de grupo de acciones: Seleccione la opción “Definir con detalles de función”.
  • Invocación del grupo de acciones: Seleccione la opción “Crear rápidamente una nueva función Lambda”, que configura una función Lambda básica que el agente puede llamar. En este caso, la función gestionará la lógica para llamar a la API SERP de Bright Data.
Filling out the action group form

Nota: Con la opción “Quick create a new Lambda function”, Amazon Bedrock genera una plantilla de función Lambda para su agente. Más tarde puedes modificar esta función en la consola de Lambda (lo haremos en un paso posterior).

Ahora, configura la función en el grupo. Desplázate hasta la sección “Action group function 1: serp_api” y rellénala de la siguiente manera:

  • Nombre: serp_api (de nuevo, prefiere guiones bajos).
  • Descripción: “Se integra con la API SERP de Bright Data para realizar búsquedas web”.
  • Parámetros: Añade un parámetro llamado search_query de tipo string y márcalo como requerido. Este parámetro se pasará a la función Lambda y representa la entrada para que la API SERP de Bright Data recupere el contexto de búsqueda web.
Filling out the “Action group function“ form

Por último, haga clic en “Crear” para completar la configuración del grupo de acciones:

Pressing the “Create” button to add the action group

Por último, haga clic en “Guardar” para guardar la configuración del agente. ¡Listo!

Paso 4: Configure su cuenta de Bright Data

Ahora es el momento de configurar su cuenta de Bright Data y configurar el servicio API SERP. Tenga en cuenta que puede seguir la documentación oficial de Bright Data o los pasos que se indican a continuación.

Si aún no tiene una cuenta, regístrese en Bright Data. De lo contrario, inicie sesión en su cuenta existente. Una vez conectado, vaya a la sección “Mis Zonas” en la página “Proxies & Scraping” y busque una fila “API SERP” en la tabla:

Note the “serp_api” row in the table

Si no ves una fila para API SERP, significa que aún no has configurado una zona. Desplácese hacia abajo y haga clic en “Crear zona” en la sección “API SERP”:

Configuring the SERP API zone

Cree una Zona API SERP, dándole un nombre como serp_api (o el nombre que prefiera). No pierda de vista el nombre de la Zona API SERP, ya que lo necesitará para conectarse a través de la API.

En la página del producto, active el interruptor “Activar” para habilitar la Zona:

Activating the SERP API zone

Por último, siga la guía oficial para generar su clave API de Bright Data. Guárdela en un lugar seguro, ya que la necesitará en breve.

Ya está. Ya tiene todo lo que necesita para utilizar la API SERP de Bright Data en su agente de IA de AWS Bedrock.

Paso 5: Almacenar secretos en AWS

En el paso anterior, obtuvo información confidencial, como su clave de API de Bright Data y su nombre de zona de API SERP. En lugar de codificar estos valores en su código de función Lambda, almacénelos de forma segura en AWS Secrets Manager.

Busque “Secrets Manager” en la barra de búsqueda de AWS y abra el servicio:

Pressing the “Store a new secret” button

Haz clic en el botón “Almacenar un nuevo secreto” y selecciona la opción “Otro tipo de secreto”. En la sección “Pares clave/valor”, añada los siguientes pares clave-valor:

  • BRIGHT_DATA_API_KEY: Introduzca su clave de API de Bright Data obtenida anteriormente.
  • BRIGHT_DATA_SERP_API_ZONE: Introduzca el nombre de su zona API SERP de Bright Data (por ejemplo, serp_api).
Giving the secret the name

A continuación, haga clic en “Siguiente” e indique un nombre secreto. Por ejemplo, llámelo BRIGHT_DATA:

Giving the secret the name

Este secreto almacenará un objeto JSON que contiene los campos BRIGHT_DATA_API_KEY y BRIGHT_DATA_SERP_API_ZONE.

Complete la creación del secreto siguiendo las indicaciones restantes para terminar de almacenar el secreto. Una vez completado, tu secreto tendrá este aspecto:

The BRIGHT_DATA secret

¡Genial! Accederá a estos secretos en su función Lambda de Python para conectarse de forma segura a la API SERP de Bright Data, que configurará en el siguiente paso.

Paso 6: Crear la función Lambda para llamar a la API SERP

Ya dispone de todos los elementos necesarios para definir la función Lambda asociada al grupo de acciones creado en el paso 3. Dicha función contendrá el código Python para llamar a la API de SERP de Bright Data. Esa función contendrá el código Python para la API SERP de Bright Data y recuperará los datos de búsqueda web.

Para crear la Lambda, busca “Lambda” en la barra de búsqueda de AWS y abre la consola de Amazon Lambda. Verás que AWS Bedrock ya ha creado automáticamente una función en el paso 3:

The “action/_gorup_serp_api_web_serach_XXXX” function

Haz clic en la función llamada action_group_serp_api_web_search_XXXX para abrir su página de resumen:

The Lambda function overview page

En esta página, desplázate hacia abajo hasta la pestaña Code, donde encontrarás un editor de Visual Studio Code integrado para editar tu lógica Lambda:

The online IDE to edit the Lambda logic

Sustituye el contenido del archivo dummy_lambda.py por el siguiente código:

import json
import logging
import os
import urllib.parse
import urllib.request

importar boto3

# ----------------------------
# Configuración de registro
# ----------------------------
log_level = os.environ.get("LOG_LEVEL", "INFO").strip().upper()
logging.basicConfig(
    format="[%(asctime)s] p%(process)s {%(filename)s:%(lineno)d} %(levelname)s - %(message)s"
)
logger = logging.getLogger(__name__)
logger.setLevel(nivel_log)

# ----------------------------
# Región AWS del entorno
# ----------------------------
AWS_REGION = os.environ.get("AWS_REGION")
if not AWS_REGION:
    logger.warning("Variable de entorno AWS_REGION no establecida; boto3 utilizará la región por defecto")

# ----------------------------
# Recuperar el objeto secreto de AWS Secrets Manager
# ----------------------------
def get_secret_object(key: str) -> str:
    """
    Obtener un valor secreto de AWS Secrets Manager.
    """
    session = boto3.session.Session()
    client = session.client(
        service_name='secretsmanager',
        region_name=AWS_REGION
    )

    probar:
        get_secret_value_response = client.get_secret_value(
            SecretId=clave
        )
    except Exception as e:
        logger.error(f "No se pudo obtener el secreto '{key}' del Gestor de Secretos: {e}")
        raise e

    secret = json.loads(get_secret_value_response["SecretString"])

    devolver secreto


# Recuperar credenciales de Bright Data
bright_data_secret = get_secret_object("BRIGHT_DATA")
BRIGHT_DATA_API_KEY = bright_data_secret["BRIGHT_DATA_API_KEY"]].
BRIGHT_DATA_SERP_API_ZONE = bright_data_secret["BRIGHT_DATA_SERP_API_ZONE"]

# ----------------------------
# API SERP Búsqueda web
# ----------------------------
def serp_api_web_search(consulta_busqueda: str) -> str:
    """
    Llama a la API SERP de Bright Data para recuperar los resultados de búsqueda de Google.
    """
    logger.info(f "Ejecutando la búsqueda de la API SERP de Bright Data para search_query='{search_query}'")

    # Codificar la consulta para URL
    encoded_query = urllib.parse.quote(consulta_busqueda)
    # Crea la URL de Google desde la que extraer la SERP
    search_engine_url = f "https://www.google.com/search?q={encoded_query}"

    # Solicitud de Bright Data API (docs: https://docs.brightdata.com/scraping-automation/serp-api/send-your-first-request)
    url = "https://api.brightdata.com/request"
    headers = {
        "Content-Type": "application/json",
        "Authorization": f "Bearer {BRIGHT_DATA_API_KEY}"
    }
    datos = {
        "Zona": BRIGHT_DATA_SERP_API_ZONE,
        "url": search_engine_url,
        "format": "raw",
        "data_format": "markdown" # Para obtener la SERP como un documento Markdown listo para IA.
    }

    payload = json.dumps(data).encode("utf-8")
    request = urllib.request.Request(url, data=payload, headers=cabeceras)

    prueba:
        response = urllib.request.urlopen(request)
        datos_respuesta: str = response.read().decode("utf-8")
        logger.debug(f "Respuesta de la API SERP: {datos_respuesta}")
        return datos_respuesta
    except urllib.error.HTTPError as e:
        logger.error(f "Error al llamar a la API SERP de Bright Data. Error HTTP {e.code}: {e.reason}")
    except urllib.error.URLError as e:
        logger.error(f "Error al llamar a la API SERP de Bright Data. Error de URL: {e.reason}")

    return ""


# ----------------------------
# Lambda handler
# ----------------------------
def lambda_handler(evento, _):
    """
    AWS Lambda handler.
    Espera evento con actionGroup, función y parámetros opcionales incluyendo search_query.
    """
    logger.debug(f "lambda_handler llamado con evento: {event}")

    action_group = event.get("actionGroup")
    function = event.get("function")
    parameters = event.get("parameters", [])

    # Extraer search_query de los parámetros
    consulta_búsqueda = next(
        (param["value"] for param in parameters if param.get("name") == "search_query"),
        Ninguno
    )
    logger.debug(f "Consulta de búsqueda introducida: {consulta_búsqueda}")

    serp_page = serp_api_web_search(consulta_busqueda) if consulta_busqueda else ""
    logger.debug(f "Resultados de la consulta de búsqueda: {serp_page}")

    # Preparar la respuesta Lambda
    function_response_body = {"TEXT": {"body": serp_page}}

    action_response = {
        "actionGroup": action_group,
        "function": función,
        "functionResponse": {"responseBody": function_response_body},
    }

    response = {"response": action_response, "messageVersion": event.get("messageVersion")}

    logger.debug(f "lambda_handler respuesta: {respuesta}")

    devolver respuesta

Este fragmento recupera las credenciales de Bright Data API de AWS Secrets Manager, llama a la API SERP con una consulta de búsqueda de Google y devuelve los resultados de la búsqueda como texto Markdown. Para obtener más información sobre cómo llamar a la API SERP, consulte la documentación.

Pega el código anterior en el IDE en línea:

Updating the Lambda's code

A continuación, pulse “Deploy” para actualizar la función Lambda:

Clicking the “Deploy” button to update the Lambda code

Si todo va según lo esperado, recibirás un mensaje como “Se ha actualizado correctamente la función action_group_serp_api_web_search_XXXX.”

Nota: La función Lambda se configura automáticamente con una política basada en recursos que permite a Amazon Bedrock invocarla. Dado que esto fue manejado por la opción “Quick create a new Lambda function” antes, no hay necesidad de modificar manualmente el rol IAM.

¡Perfecto! Su función AWS Lambda para conectarse a la API SERP de Bright Data ya está completa.

Paso 7: Configurar los permisos de Lambda

Aunque su función Lambda no requiere permisos IAM personalizados para ser invocada, sí necesita acceso a las claves API almacenadas en AWS Secrets Manager.

Para configurarlo, en la página de detalles de la función Lambda, vaya a la pestaña “Configuración” y, a continuación, seleccione la opción “Permisos”:

Reaching the AWS Lambda “Permissions” page

En la sección “Rol de ejecución”, haz clic en el enlace “Nombre del rol” para abrir la consola de IAM:

Clicking the role name

En la página del rol, localice y seleccione la política de permisos adjunta:

Selecting the permission policy

Abra la vista “JSON” y haga clic en “Editar” para preparar la actualización de la política de permisos:

Accessing the JSON view of the permission policy

Asegúrese de que la matriz Statement incluye el siguiente bloque:

{
  "Acción": "secretsmanager:GetSecretValue",
  "Recurso": [
    "arn:aws:secretsmanager:<TU_REGION_AWS>:<TU_ID_CUENTA_AWS>:secret:BRIGHT_DATA*"
  ],
  "Effect": "Permitir",
  "Sid": "GetSecretsManagerSecret"
}

Reemplaza <YOUR_AWS_REGION> y <YOUR_AWS_ACCOUNT_ID> con los valores correctos para tu configuración. Ese bloque de código JSON dará a la función Lambda la capacidad de acceder al secreto BRIGHT_DATA desde el Gestor de Secretos.

A continuación, haz clic en el botón “Siguiente” y, por último, en “Guardar cambios”. Como resultado, deberías ver que tu función Lambda también tiene permisos de acceso al Gestor de Secretos:

Note the “Secrets Manager” option

¡Fantástico! Su función Lambda ahora está configurada correctamente y puede ser invocada por su agente de IA de AWS Bedrock con acceso a las credenciales de Bright Data almacenadas en Secrets Manager.

Paso 8: Finalice su agente de IA

Vuelva a la sección “Agent builder” y haga clic en “Save” una última vez para aplicar todos los cambios realizados anteriormente:

Saving the changes in your agent

A continuación, haga clic en “Preparar” para preparar su agente para las pruebas con la última configuración.

Pressing the “Prepare” button

Deberías recibir un mensaje de confirmación como “Agente: web_search_agent fue preparado con éxito“.

¡Misión completada! Su agente de IA potenciado por la API SERP de Bright Data ya está completamente implementado y listo para funcionar.

Paso 9: Probar su agente de IA

Su agente de IA de AWS Bedrock tiene acceso a la función de grupo serp_api, implementada por la función lambda_handler Lambda que definió en el paso 6. En términos más sencillos, su agente puede realizar búsquedas web en tiempo real en Google (y potencialmente en otros motores de búsqueda) a través de la API SERP de Bright Data, recuperando y procesando contenido online fresco de forma dinámica.

Para probar esta capacidad, supongamos que desea obtener las últimas noticias sobre el huracán Melissa. Intente preguntar a su agente

"Dame los 3 artículos más recientes sobre el huracán Melissa".

(Recuerde: Esto es sólo un ejemplo, y puede probar cualquier otra petición que implique resultados de búsqueda web en tiempo real).

Ejecute este mensaje en la sección “Agente de pruebas” de su agente y verá un resultado similar al siguiente:

The agent execution on the given prompt

Entre bastidores, el agente invoca la API SERP Lambda, recupera los últimos resultados de búsqueda de Google para “Huracán Melissa” y extrae las noticias más relevantes con sus URL. Esto es algo que ningún LLM convencional, incluido Nova Lite, puede conseguir por sí solo.

Esta es la respuesta de texto específica generada por el agente (con las URL omitidas):

Aquí están las 3 noticias más recientes sobre el huracán Melissa:
1. Jamaica se prepara para el huracán Melissa, la tormenta más fuerte de 2025 - BBC, hace 6 horas
2. El huracán Melissa, en directo - Jamaica se enfrenta a un impacto "catastrófico" - Newsweek, hace 7 horas
3. El huracán Melissa se cierne sobre Jamaica y amenaza con convertirse en la tormenta más fuerte registrada en la isla - AP News, 10 hours ago
Por favor, visite las fuentes originales para ver los artículos completos.

Estos resultados no son alucinaciones. Al contrario, coinciden con lo que se encontraría en Google al buscar manualmente “Huracán Melissa” (en la fecha en que se probó el agente):

The SERP for “melissa hurricane news"

Ahora bien, si alguna vez ha intentado raspar los resultados de búsqueda de Google, sabrá lo difícil que puede resultar debido a la detección de bots, las prohibiciones de IP, la renderización de JavaScript y muchos otros retos.

La API SERP de Bright Data resuelve todo esto de manera eficiente, y su capacidad para devolver SERPs raspados en formato Markdown optimizado para IA(que es especialmente valioso para la ingestión LLM).

Para confirmar que su agente ha llamado realmente a la API SERP Lambda, haga clic en “Show trace”:

Following the “Show trace” link

En la sección “Trace step 1”, desplácese hasta la sección de registro de invocación de grupo para ver la salida de la llamada a la función:

The output of the SERP API Lambda function

Esto confirma que la función Lambda se ejecutó correctamente y que el agente interactuó con la API SERP según lo previsto. De forma similar, verifícalo comprobando los logs de AWS CloudWatch para tu Lambda.

Ahora, ¡a forzar aún más a tu agente! Pruebe con solicitudes relacionadas con la comprobación de hechos, la monitorización de marcas, el análisis de tendencias de mercado u otros escenarios. Comprueba cómo se comporta tu agente en diferentes casos de uso.

¡Et voilà! Acaba de crear un agente de IA de AWS Bedrock integrado con la API SERP de Bright Data, capaz de recuperar datos de búsqueda web actualizados, fiables y contextuales bajo demanda.

[Extra] Crear un agente de Amazon Bedrock con búsqueda web mediante AWS CDK

En la sección anterior, aprendió a definir e implementar un agente de IA que se integra con la API SERP directamente a través de la consola de Amazon Bedrock.

Si prefiere un enfoque basado en el código, puede lograr el mismo resultado utilizando el kit de desarrollo en la nube de AWS (AWS CDK). Este método sigue los mismos pasos generales pero gestiona todo localmente dentro de un proyecto de AWS CDK.

Para obtener información detallada, consulte la guía oficial de AWS. También deberías echar un vistazo al repositorio de GitHub que da soporte a ese tutorial. Esta base de código se puede adaptar fácilmente para trabajar con la API SERP de Bright Data.

Conclusión

En esta entrada de blog, ha visto cómo integrar la API SERP de Bright Data en un agente de IA de AWS Bedrock. Este flujo de trabajo es ideal para cualquiera que desee crear agentes de IA más potentes y conscientes del contexto en AWS.

Para crear flujos de trabajo de IA aún más avanzados, explore la infraestructura de Bright Data para IA. Encontrará un conjunto de herramientas para recuperar, validar y transformar datos web en directo.

Regístrese hoy mismo para obtener una cuenta gratuita de Bright Data y comience a experimentar con nuestras soluciones de datos web preparadas para IA.