Verwendung AWS Lambda mit Amazon Aurora DSQL - Amazon Aurora DSQL

Amazon Aurora DSQL wird als Vorschau-Service bereitgestellt. Weitere Informationen finden Sie in den Servicebedingungen unter Betas und AWS Vorschauen.

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Verwendung AWS Lambda mit Amazon Aurora DSQL

In den folgenden Abschnitten wird beschrieben, wie Lambda mit Aurora DSQL verwendet wird.

Voraussetzungen

  • Autorisierung zur Erstellung von Lambda-Funktionen. Weitere Informationen finden Sie unter Erste Schritte mit Lambda.

  • Autorisierung zum Erstellen oder Ändern der von Lambda erstellten IAM-Richtlinie. Sie benötigen zwei Berechtigungen iam:CreatePolicy und. iam:AttachRolePolicy Weitere Informationen finden Sie unter Aktionen, Ressourcen und Bedingungsschlüssel für IAM.

  • Sie müssen npm v8.5.3 oder höher installiert haben.

  • Sie müssen Zip v3.0 oder höher installiert haben.

Erstellen Sie eine neue Funktion in AWS Lambda.
  1. Melden Sie sich bei der an AWS Management Console und öffnen Sie die AWS Lambda Konsole unter https://console.aws.amazon.com/lambda/.

  2. Wählen Sie Funktion erstellen.

  3. Geben Sie einen Namen ein, z. dsql-sample B.

  4. Bearbeiten Sie die Standardeinstellungen nicht, um sicherzustellen, dass Lambda eine neue Rolle mit grundlegenden Lambda-Berechtigungen erstellt.

  5. Wählen Sie Funktion erstellen.

Autorisieren Sie Ihre Lambda-Ausführungsrolle, um eine Verbindung zu Ihrem Cluster herzustellen
  1. Wählen Sie in Ihrer Lambda-Funktion Konfiguration > Berechtigungen.

  2. Wählen Sie den Rollennamen, um die Ausführungsrolle in der IAM-Konsole zu öffnen.

  3. Wählen Sie „Berechtigungen hinzufügen“ > „Inline-Richtlinie erstellen“ und verwenden Sie den JSON-Editor.

  4. Fügen Sie in Aktion die folgende Aktion ein, um Ihre IAM-Identität zu autorisieren, mithilfe der Admin-Datenbankrolle eine Verbindung herzustellen.

    "Action": ["dsql:DbConnectAdmin"],
    Anmerkung

    Wir verwenden eine Administratorrolle, um die Anzahl der erforderlichen Schritte für den Einstieg zu minimieren. Sie sollten keine Administrator-Datenbankrolle für Ihre Produktionsanwendungen verwenden. Unter erfahren Datenbankrollen mit IAM-Rollen verwenden Sie, wie Sie benutzerdefinierte Datenbankrollen mit der Autorisierung erstellen, die über die wenigsten Berechtigungen für Ihre Datenbank verfügt.

  5. Fügen Sie unter Ressource den Amazon-Ressourcennamen (ARN) Ihres Clusters hinzu. Sie können auch einen Platzhalter verwenden.

    "Resource": ["*"]
  6. Wählen Sie Weiter aus.

  7. Geben Sie einen Namen für die Richtlinie ein, z. B. dsql-sample-dbconnect

  8. Wählen Sie Richtlinie erstellen aus.

Erstellen Sie ein Paket, das auf Lambda hochgeladen werden soll.
  1. Erstellen Sie einen Ordner mit dem Namenmyfunction.

  2. Erstellen Sie in dem Ordner eine neue Datei package.json mit dem folgenden Inhalt.

    { "dependencies": { "@aws-sdk/core": "^3.587.0", "@aws-sdk/credential-providers": "^3.587.0", "@smithy/protocol-http": "^4.0.0", "@smithy/signature-v4": "^3.0.0", "pg": "^8.11.5" } }
  3. Erstellen Sie in dem Ordner eine Datei mit dem Namen index.mjs in dem Verzeichnis mit dem folgenden Inhalt.

    import { formatUrl } from "@aws-sdk/util-format-url"; import { HttpRequest } from "@smithy/protocol-http"; import { SignatureV4 } from "@smithy/signature-v4"; import { fromNodeProviderChain } from "@aws-sdk/credential-providers"; import { NODE_REGION_CONFIG_FILE_OPTIONS, NODE_REGION_CONFIG_OPTIONS } from "@smithy/config-resolver"; import { Hash } from "@smithy/hash-node"; import { loadConfig } from "@smithy/node-config-provider"; import pg from "pg"; const { Client } = pg; export const getRuntimeConfig = (config) => { return { runtime: "node", sha256: config?.sha256 ?? Hash.bind(null, "sha256"), credentials: config?.credentials ?? fromNodeProviderChain(), region: config?.region ?? loadConfig(NODE_REGION_CONFIG_OPTIONS, NODE_REGION_CONFIG_FILE_OPTIONS), ...config, }; }; // Aurora DSQL requires IAM authentication // This class generates auth tokens signed using AWS Signature Version 4 export class Signer { constructor(hostname) { const runtimeConfiguration = getRuntimeConfig({}); this.credentials = runtimeConfiguration.credentials; this.hostname = hostname; this.region = runtimeConfiguration.region; this.sha256 = runtimeConfiguration.sha256; this.service = "dsql"; this.protocol = "https:"; } async getAuthToken() { const signer = new SignatureV4({ service: this.service, region: this.region, credentials: this.credentials, sha256: this.sha256, }); // To connect with a custom database role, set Action as "DbConnect" const request = new HttpRequest({ method: "GET", protocol: this.protocol, hostname: this.hostname, query: { Action: "DbConnectAdmin", }, headers: { host: this.hostname, }, }); const presigned = await signer.presign(request, { expiresIn: 3600, }); // RDS requires the scheme to be removed // https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.Connecting.html return formatUrl(presigned).replace(`${this.protocol}//`, ""); } } // To connect with a custom database role, set user as the database role name async function dsql_sample(token, endpoint) { const client = new Client({ user: "admin", database: "postgres", host: endpoint, password: token, ssl: { rejectUnauthorized: false }, }); await client.connect(); console.log("[dsql_sample] connected to Aurora DSQL!"); try { console.log("[dsql_sample] attempting transaction."); await client.query("BEGIN; SELECT txid_current_if_assigned(); COMMIT;"); return 200; } catch (err) { console.log("[dsql_sample] transaction attempt failed!"); console.error(err); return 500; } finally { await client.end(); } } // https://docs.aws.amazon.com/lambda/latest/dg/nodejs-handler.html export const handler = async (event) => { const endpoint = event.endpoint; const s = new Signer(endpoint); const token = await s.getAuthToken(); const responseCode = await dsql_sample(token, endpoint); const response = { statusCode: responseCode, endpoint: endpoint, }; return response; };
  4. Verwenden Sie die folgenden Befehle, um ein Paket zu erstellen.

    npm install zip -r pkg.zip .
Laden Sie das Codepaket hoch und testen Sie Ihre Lambda-Funktion
  1. Wählen Sie auf der Registerkarte Code Ihrer Lambda-Funktion die Option Upload from > .zip-Datei

  2. Laden Sie die von pkg.zip Ihnen erstellte Datei hoch. Weitere Informationen finden Sie unter Bereitstellen von Lambda-Funktionen von Node.js mit ZIP-Dateiarchiven.

  3. Fügen Sie auf der Registerkarte Test Ihrer Lambda-Funktion die folgende JSON-Payload ein und ändern Sie sie so, dass sie Ihre Cluster-ID verwendet.

  4. Verwenden Sie auf der Registerkarte Test Ihrer Lambda-Funktion den folgenden Event-JSON, der geändert wurde, um den Endpunkt Ihres Clusters anzugeben.

    {"endpoint": "replace_with_your_cluster_endpoint"}
  5. Geben Sie einen Namen für das Ereignis ein, z. B. dsql-sample-test Wählen Sie Speichern.

  6. Wählen Sie Test aus.

  7. Wählen Sie Details, um die Ausführungsantwort und die Protokollausgabe zu erweitern.

  8. Wenn dies erfolgreich war, sollte die Antwort auf die Ausführung der Lambda-Funktion einen Statuscode 200 zurückgeben:

    {statusCode": 200, "endpoint": "your_cluster_endpoint"}

    Wenn die Datenbank einen Fehler zurückgibt oder wenn die Verbindung zur Datenbank fehlschlägt, gibt die Antwort auf die Ausführung der Lambda-Funktion den Statuscode 500 zurück.

    {"statusCode": 500,"endpoint": "your_cluster_endpoint"}