Como faço para criar uma função do AWS Lambda que execute consultas no Amazon Redshift?
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.
Conteúdo relevante
- AWS OFICIALAtualizada há 2 anos
- AWS OFICIALAtualizada há 2 anos
- Como soluciono os erros "ClassNotFoundException" e "NoSuchMethodError" de uma função Java do Lambda?AWS OFICIALAtualizada há 3 anos