Comment créer une fonction AWS Lambda qui exécute des requêtes dans Amazon Redshift ?

Lecture de 3 minute(s)
0

Je souhaite créer une fonction AWS Lambda qui exécute des requêtes sur Amazon Redshift.

Résolution

Prérequis

Avant de créer une fonction Lambda, vous devez configurer les points de terminaison Amazon Virtual Private Cloud (Amazon VPC) suivants :

1.    Créez un VPC avec un sous-réseau privé.

2.    Créez un groupe de sous-réseaux. Ajoutez le VPC et le sous-réseau que vous venez de créer.

3.    Créez un cluster Amazon Redshift privé. Sélectionnez le VPC et le groupe de sous-réseaux que vous venez de créer.

4.    Créez un nouveau secret pour Amazon Redshift avec AWS Secrets Manager. Nommez votre redshift secret.

Créez votre fonction Lambda

Pour créer une fonction Lambda qui interroge votre cluster Amazon Redshift, procédez comme suit :

1.    Ouvrez la console Lambda.

2.    Sélectionnez Créer une fonction.

3.    Choisissez l'option Auteur à partir de zéro.

4.    Mettez à jour les champs suivants :
Nom de la fonction : Entrez un nom personnalisé.
Durée : Entrez votre environnement de code. (Les exemples de cette résolution sont compatibles avec Python 3.9.)
Architecture : Entrez l'architecture de votre système. (Les exemples de cette résolution sont compatibles avec x86_64.)
Autorisations : Choisissez Créer un nouveau rôle avec des autorisations Lambda de base.

5.    Sélectionnez Créer une fonction.

Définissez les autorisations appropriées pour votre fonction Lambda

1.    Dans la console Lambda, choisissez Configuration.

2.    Choisissez Autorisations.

3.    Choisissez le rôle créé pour votre fonction Lambda.

4.    Choisissez Ajouter des autorisations.

5.    Choisissez Joindre des politiques.

6.    Ajoutez les politiques AmazonRedshiftDataFullAccess et SecretsManagerReadWrite à votre rôle d'exécution Lambda.

Remarque : Il est recommandé d'accorder le moindre privilège uniquement aux autorisations requises pour effectuer une tâche. Pour plus d'informations, consultez la section Appliquer des autorisations de moindre privilège.

Ajoutez du code Python à votre fonction Lambda

1.    Dans la console Lambda, choisissez Code.

2.    Collez le code suivant dans la zone Code :

Important :

  • Remplacez « dev » par le nom de votre base de données.
  • Ajoutez une variable d'environnement dans la section de configuration de la fonction Lambda pour les clés **SecretId ** et 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)

Dans cet exemple, Lambda se connecte à la base de données Amazon Redshift et crée une table lambda_func dans le schéma public.

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a un an