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?