Como crio uma função do AWS Lambda que execute consultas no Amazon Redshift?

Data da última atualização: 11/03/2022

Estou tentando criar uma função do AWS Lambda que execute consultas no Amazon Redshift. Como posso fazer isso?

Resolução

Pré-requisitos

Antes de criar uma função do Lambda, você deve configurar os seguintes endpoints da VPC:

1.    Crie uma VPC com uma sub-rede privada.

2.    Crie um grupo de sub-redes. Adicione a VPC que você acabou de criar.

3.    Crie um cluster privado do Amazon Redshift selecionando a VPC e o grupo de sub-redes que você acabou de criar.

4.    Crie um novo segredo para o Amazon Redshift com o AWS Secrets Manager. Dê ao segredo o nome de “redshift”.

Criar a função Lambda

Para criar uma função do Lambda que consulte o cluster do Amazon Redshift, realize as seguintes etapas:

1.    Abra o console do Lambda.

2.    Escolha Create function (Criar função).

3.    Escolha a opção Author from Scratch (Criar do zero).

4.    Atualize os seguintes campos:
Function name (Nome da função): insira um nome personalizado.
Runtime (Tempo de execução): insira o ambiente do código. (Os exemplos deste artigo são compatíveis com o "Python 3.9".)
Architecture (Arquitetura): insira a arquitetura do sistema. (Os exemplos deste artigo são compatíveis com o "x86_64".)
Permissions (Permissões): escolha Create a new role with basic Lambda permissions (Criar uma nova função com permissões básicas do Lambda).

5.    Escolha Create function (Criar função).

Defina as permissões corretas para a função do Lambda

1.    No console do Lambda, escolha Configuration (Configuração).

2.    Escolha Permissions (Permissões).

3.    Escolha a função criada para a função do Lambda.

4.    Escolha Add Permissions (Adicionar permissões).

5.    Escolha Attach policies (Anexar políticas).

6.    Adicione as políticas “AmazonRedshiftDataFullAccess” e “SecretsManagerReadWrite” à função de execução do Lambda.

Adicionar código do Python à função do Lambda

1.    No console do Lambda, escolha Code (Código).

2.    Cole o código a seguir na caixa Code (Código):

import json
import urllib.parse
import boto3
import botocore.session as bc

print('Loading function')

s3 = boto3.client('s3')


def lambda_handler(event, context):
    print("Entered lambda_handler")

    secret_name='redshift' ## HERE add the secret name created.
    session = boto3.session.Session()
    region = session.region_name
    
    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']
    
    
    bc_session = bc.get_session()
    
    session = boto3.Session(
            botocore_session=bc_session,
            region_name=region,
        )
    
    # Setup the client
    client_redshift = session.client("redshift-data")
    print("Data API client successfully loaded")
    
    query_str = "create table public.lambda_func (id int);"
                      
    print(query_str)
    
    res = client_redshift.execute_statement(Database= 'dev', SecretArn= secret_arn, Sql= query_str, ClusterIdentifier= cluster_id)
    id=res["Id"]

Observação: certifique-se de substituir secret_name pelo nome secreto caso você tenha criado um segredo com um nome diferente de “redshift”.

Neste exemplo, o Lambda se conecta ao banco de dados do Amazon Redshift e cria uma tabela lambda_func no esquema público.


Este artigo ajudou?


Precisa de ajuda com faturamento ou suporte técnico?