¿Cómo creo una función de AWS Lambda que ejecute consultas en Amazon Redshift?

3 minutos de lectura
0

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.


OFICIAL DE AWS
OFICIAL DE AWSActualizada hace 4 meses