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

3 minuto de leitura
0

Quero criar uma função do AWS Lambda que execute consultas no Amazon Redshift.

Resolução

Pré-requisitos

Antes de criar uma função do Lambda, você deve configurar os seguintes endpoints da Amazon Virtual Private Cloud (Amazon VPC):

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

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

3.    Crie um cluster privado do Amazon Redshift. Selecione 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ê um nome ao seu redshift secreto.

Criar sua função do Lambda

Para criar uma função do Lambda que consulte seu cluster do Amazon Redshift, siga estas etapas:

1.    Abra o console do Lambda.

2.    Escolha Criar função.

3.    Escolha a opção Autor do zero.

4.    Atualize os seguintes campos:
Nome da função: Insira um nome personalizado.
Runtime: Insira seu ambiente de código. (Os exemplos nesta resolução são compatíveis com o Python 3.9.)
Arquitetura: Insira a arquitetura do seu sistema. (Os exemplos nesta resolução são compatíveis com x86_64.)
Permissões: Escolha Criar um novo perfil com permissões básicas do Lambda.

5.    Escolha Criar função.

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

1.    No console Lambda, escolha Configuração.

2.    Escolha Permissões.

3.    Escolha o perfil criado para sua função do Lambda.

4.    Escolha Adicionar permissões.

5.    Escolha Anexar políticas.

6.    Adicione as políticas AmazonRedshiftDatafullAccess e SecretsManagerReadWrite ao seu perfil de execução do Lambda.

Observação: é uma prática recomendada conceder o mínimo de privilégios apenas às permissões necessárias para realizar uma tarefa. Para obter mais informações, consulte Aplicar permissões de privilégio mínimo.

Adicione código Python à sua função Lambda

1.    No console Lambda, escolha Código.

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

Importante:

  • Substitua “dev” pelo nome do seu banco de dados.
  • Adicione uma variável de ambiente na seção de configuração da função do Lambda para a chave SecretID e secret_name.
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)

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

AWS OFICIAL
AWS OFICIALAtualizada há um ano