Wie erstelle ich eine AWS Lambda-Funktion, die Abfragen in Amazon Redshift ausführt?

Lesedauer: 3 Minute
0

Ich möchte eine AWS Lambda-Funktion erstellen, die Abfragen auf Amazon Redshift ausführt.

Lösung

Voraussetzungen

Bevor Sie eine Lambda-Funktion erstellen, müssen Sie die folgenden Amazon Virtual Private Cloud (Amazon VPC)-Endpunkte einrichten:

1.Erstellen Sie eine VPC mit einem privaten Subnetz.

2.Erstellen Sie eine Subnetzgruppe. Fügen Sie die VPC und das Subnetz hinzu, die Sie gerade erstellt haben.

3.Erstellen Sie einen privaten Amazon Redshift-Cluster. Wählen Sie die VPC und die Subnetzgruppe aus, die Sie gerade erstellt haben.

4.Erstellen Sie mit dem AWS Secrets Manager ein neues Geheimnis für Amazon Redshift. Benennen Sie Ihr Geheimnis redshift.

Ihre Lambda-Funktion erstellen

Gehen Sie folgendermaßen vor, um eine Lambda-Funktion zu erstellen, die Ihren Amazon Redshift-Cluster abfragt:

1.Öffnen Sie die Lambda-Konsole.

2.Wählen Sie Funktion erstellen aus.

3.Wählen Sie die Option Autor neu erstellen aus.

4.Aktualisieren Sie die folgenden Felder:
Funktionsname: Geben Sie einen benutzerdefinierten Namen ein.
Laufzeit: Geben Sie Ihre Code-Umgebung ein. (Die Beispiele in dieser Auflösung sind mit Python 3.9 kompatibel.)
Architektur: Geben Sie Ihre Systemarchitektur ein. (Die Beispiele in dieser Auflösung sind mit x86_64 kompatibel.)
Genehmigungen: Wählen Sie Neue Rolle mit grundlegenden Lambda-Berechtigungen erstellen aus.

5.Wählen Sie Funktion erstellen aus.

Die richtigen Berechtigungen für Ihre Lambda-Funktion festlegen

1.Wählen Sie in der Lambda-Konsole Konfiguration aus.

2.Wählen Sie Berechtigungen aus.

3.Wählen Sie die Rolle aus, die für Ihre Lambda-Funktion erstellt wurde.

4.Wählen Sie Berechtigungen hinzufügen aus.

5.Wählen Sie Richtlinien anhängen aus.

6.Fügen Sie Ihrer Lambda-Ausführungsrolle die Richtlinien AmazonRedshiftDataFullAccess und SecretsManagerReadWrite hinzu.

Hinweis: Es hat sich bewährt, die geringsten Berechtigungen nur für diejenigen Berechtigungen zu gewähren, die für die Ausführung einer Aufgabe erforderlich sind. Weitere Informationen finden Sie unter Berechtigungen mit den geringsten Rechten anwenden.

Ihrer Lambda-Funktion Python-Code hinzufügen

1.Wählen Sie in der Lambda-Konsole Code aus.

2.Fügen Sie den folgenden Code in das Feld Code ein:

Wichtig:

  • Ersetzen Sie „dev“ durch den Namen Ihrer Datenbank.
  • Fügen Sie im Konfigurationsbereich der Lambda-Funktion eine Umgebungsvariable für den Schlüssel SecretId und secret_name hinzu.
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)

In diesem Beispiel stellt Lambda eine Verbindung zur Amazon Redshift-Datenbank her und erstellt eine lambda_func-Tabelle im öffentlichen Schema.

AWS OFFICIAL
AWS OFFICIALAktualisiert vor einem Jahr