¿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. Añada la VPC y la subred que acaba de crear.

3.    Cree un clúster privado de Amazon Redshift. Seleccione la VPC y el grupo de subredes que acaba de crear.

4.    Cree un nuevo secreto para Amazon Redshift con AWS Secrets Manager. Asigne el nombre redshift al secreto.

Crear una función de Lambda

Para crear una función de Lambda que consulte su clúster de Amazon Redshift, siga estos pasos:

1.    Abra la consola de Lambda.

2.    Elija Crear función.

3.    Elija la opción Crear desde cero.

4.    Actualice los siguientes campos:
Nombre de la función: Introduzca un nombre personalizado.
Tiempo de ejecución: Introduzca su entorno de código. (Los ejemplos de esta resolución son compatibles con Python 3.9)
Arquitectura: Introduzca la arquitectura de su sistema. (Los ejemplos de esta resolución son compatibles con x86_64.)
Permisos: Elija Crear un nuevo rol con permisos básicos de Lambda.

5.    Elija Crear función.

Establecer los permisos correctos para la función de Lambda

1.    En la consola de Lambda, seleccione Configuración.

2.    Seleccione Permisos.

3.    Elija el rol creado para la función de Lambda.

4.    Elija Agregar permisos.

5.    Elija Adjuntar políticas.

6.    Añada las políticas AmazonRedshiftDataFullAccess y SecretsManagerReadWrite a su rol de ejecución de Lambda.

Nota: Se recomienda conceder el privilegio mínimo únicamente para los permisos necesarios para realizar una tarea. Para obtener más información, consulte Aplicar permisos de privilegio mínimo.

Agregar código Python a una función de Lambda

1.    En la consola de Lambda, elija Código.

2.    Pegue el siguiente código en el cuadro Código:

Importante:

  • Reemplace «dev» por el nombre de su base de datos.
  • Añada una variable de entorno en la sección de configuración de la función de Lambda para los valores de SecretId y secret_name de la clave.
import os
import json
import boto3
import botocore
import botocore.session as bc
from botocore.client import Config

print('Loading function')

secret_name=os.environ['SecretId'] # getting SecretId from Environment varibales
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 reestablishing the connection")
        return str(result)

    except Exception as e:
        raise Exception(e)

    return str(result)

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 un año