¿Cómo creo una función de AWS Lambda que ejecute consultas en Amazon Redshift?
Quiero crear una función de AWS Lambda que ejecute consultas en Amazon Redshift.
Resolución
Requisitos previos
Antes de crear una función de Lambda, debe configurar los siguientes puntos de conexión de Amazon Virtual Private Cloud (Amazon VPC):
1. Cree una VPC con una subred privada.
2. Cree un grupo de subredes. Agregue la VPC que acaba de crear.
3. Cree un clúster privado de Amazon Redshift. Selecciona la VPC y el grupo de subredes que acaba de crear.
4. Cree un nuevo secreto para Amazon Redshift con AWS Secrets Manager. Nombre a su secreto redshift.
Cree su función de Lambda
Para crear una función de Lambda que consulte el clúster de Amazon Redshift, lleve a cabo los siguientes pasos:
1. Abra la consola de Lambda.
2. Elija Create function (Crear función).
3. Elija la opción Author from Scratch (Crear desde cero).
4. Actualice los siguientes campos:
Function name (Nombre de la función): introduzca un nombre personalizado.
Runtime (Tiempo de ejecución): ingrese su entorno de código. (Los ejemplos de esta resolución son compatibles con Python 3.9).
Architecture (Arquitectura): ingrese la arquitectura de su sistema. (Los ejemplos de esta resolución son compatibles con x86_64).
Permissions (Permisos): elija Create a new role with basic Lambda permissions (Crear un nuevo rol con permisos básicos de Lambda).
5. Elija Create function (Crear función).
Establezca los permisos correctos para la función de Lambda
1. En la consola de Lambda, elija Configuration (Configuración).
2. Elija Permissions (Permisos).
3. Elija el rol creado para la función de Lambda.
4. Elija Add Permissions (Agregar permisos).
5. Elija Attach policies (Adjuntar políticas).
6. Agregue las políticas AmazonRedshiftDataFullAccess y AmazonRedshiftDataFullAccess a su rol de ejecución de Lambda.
Agregue código Python a su función de Lambda
1. En la consola de Lambda, elija Code (Código).
2. Pegue el siguiente código en el cuadro Code (Código):
import os import json import boto3 import botocore.session as bc from botocore.client import Config print('Loading function') # Fetching SecretId from Environment variables secret_name=os.environ['SecretId'] session = boto3.session.Session() region = session.region_name # Initializing Secret Manager's client client = session.client( service_name='secretsmanager', region_name=region ) get_secret_value_response = client.get_secret_value( SecretId=secret_name ) secret_arn=get_secret_value_response['ARN'] secret = get_secret_value_response['SecretString'] secret_json = json.loads(secret) cluster_id=secret_json['dbClusterIdentifier'] # Initializing Botocore client bc_session = bc.get_session() session = boto3.Session( botocore_session=bc_session, region_name=region ) # Initializing Redshift's client config = Config(connect_timeout=5, read_timeout=5) client_redshift = session.client("redshift-data", config = config) def lambda_handler(event, context): print("Entered lambda_handler") query_str = "create table public.lambda_func (id int);" try: result = client_redshift.execute_statement(Database= 'dev', SecretArn= secret_arn, Sql= query_str, ClusterIdentifier= cluster_id) print("API successfully executed") except botocore.exceptions.ConnectionError as e: client_redshift_1 = session.client("redshift-data", config = config) result = client_redshift_1.execute_statement(Database= 'dev', SecretArn= secret_arn, Sql= query_str, ClusterIdentifier= cluster_id) print("API executed after restablshing the connection") return str(result) except Exception as e: raise Exception(e) return str(result)
Nota: Asegúrese de agregar una variable de entorno en la sección de configuración de la función de Lambda para las claves secretId y secret_name.
En este ejemplo, Lambda se conecta a la base de datos de Amazon Redshift y crea una tabla lambda_func en el esquema público.

Contenido relevante
- OFICIAL DE AWSActualizada hace 3 meses
- OFICIAL DE AWSActualizada hace un año
- OFICIAL DE AWSActualizada hace un año
- OFICIAL DE AWSActualizada hace 4 meses