Skip to content

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.

Behebung

Voraussetzung: Bevor du eine Lambda-Funktion erstellst, musst du die folgenden Amazon Virtual Private Cloud (Amazon VPC)-Endpunkte einrichten:

  1. Erstelle eine VPC mit einem privaten Subnetz.
  2. Erstelle eine Subnetzgruppe. Füge die VPC und das Subnetz hinzu, die du gerade erstellt hast.
  3. Erstelle einen privaten Amazon Redshift-Cluster. Wähle die VPC und die Subnetzgruppe aus, die du gerade erstellt hast.
  4. Erstelle mit dem AWS Secrets Manager ein neues Secret für Amazon Redshift. Benenne dein Secret redshift.

Deine Lambda-Funktion erstellen

Gehe folgendermaßen vor, um eine Lambda-Funktion zu erstellen, die den Amazon Redshift-Cluster abfragt:

  1. Öffne die Lambda-Konsole.

  2. Wähle Funktion erstellen aus.

  3. Wähle die Option Ohne Vorgabe erstellen aus.

  4. Aktualisiere die folgenden Felder:

    Funktionsname: Gib einen benutzerdefinierten Namen ein.
    Laufzeit: Gib deine Code-Umgebung ein. (Die Beispiele in dieser Auflösung sind mit Python 3.9 kompatibel.)
    Architektur: Gib deine Systemarchitektur ein. (Die Beispiele in dieser Auflösung sind mit x86_64 kompatibel.)
    Genehmigungen: Wähle Create a new role with basic Lambda permissions (Neue Rolle mit grundlegenden Lambda-Berechtigungen erstellen) aus.

  5. Wähle Funktion erstellen aus.

Die richtigen Berechtigungen für die Lambda-Funktion festlegen

Wähle in der Lambda-Konsole Konfiguration aus.

  1. Wähle Berechtigungen aus.
  2. Wähle die Rolle aus, die für die Lambda-Funktion erstellt wurde.
  3. Wähle Berechtigungen hinzufügen aus.
  4. Wähle Attach policies (Richtlinien anfügen) aus.
  5. Füge der Lambda-Ausführungsrolle die Richtlinien AmazonRedshiftDataFullAccess und SecretsManagerReadWrite hinzu.

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

Der Lambda-Funktion Python-Code hinzufügen

  1. Wähle in der Lambda-Konsole Code aus.
  2. Füge den folgenden Code in das Feld Code ein:

Wichtig:

  • Ersetze „dev“ durch den Namen deiner Datenbank.
  • Füge 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 OFFICIALAktualisiert vor 7 Monaten