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

Dernière mise à jour : 11/03/2022

J'essaie de créer une fonction AWS Lambda qui exécute des requêtes sur Amazon Redshift. Comment procéder ?

Résolution

Prérequis

Avant de créer une fonction Lambda, vous devez configurer les points de terminaison d'un 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 que vous venez de créer.

3.    Créez un cluster Amazon Redshift privé en sélectionnant 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 secret « redshift ».

Créer votre fonction Lambda

Pour créer une fonction Lambda qui interroge votre cluster Amazon Redshift, effectuez les étapes suivantes :

1.    Ouvrez la console Lambda.

2.    Sélectionnez Créer une fonction.

3.    Choisissez l'option Author from Scratch (Créer à partir de zéro).

4.    Mettez à jour les champs suivants :
Pour Function name: (Nom de la fonction) saisissez un nom personnalisé.
Pour Runtime : (Environnement d'exécution) saisissez votre environnement de code. (Les exemples de cet article sont compatibles avec « Python 3.9 ».)
Pour Architecture : saisissez l'architecture de votre système. (Les exemples de cet article sont compatibles avec « x86_64 ».)
Pour Permissions: (Autorisations) choisissez Create a new role with basic Lambda permissions (Créer un nouveau rôle avec les autorisations Lambda de base).

5.    Choisissez Create function (Créer une fonction).

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

1.    Dans la console Lambda, choisissez Configuration.

2.    Choisissez Permissions (Autorisations).

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

4.    Choisissez Add permissions (Ajouter des autorisations).

5.    Choisissez Attach policies (Associer des politiques).

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

Ajouter du code Python à votre fonction Lambda

1.    Dans la console Lambda, choisissez Code.

2.    Collez le code suivant dans la zone Code :

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"]

Remarque : assurez-vous de remplacer secret_name par le nom de votre secret au cas où vous auriez créé un secret avec un nom différent de « redshift ».

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.


Cet article vous a-t-il été utile ?


Besoin d'aide pour une question technique ou de facturation ?