Tutorial: utilizzo di una funzione Lambda per accedere a un database Amazon RDS - Amazon Relational Database Service

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Tutorial: utilizzo di una funzione Lambda per accedere a un database Amazon RDS

In questo tutorial, viene utilizzata una funzione Lambda per scrivere dati su un database Amazon Relational Database Service (Amazon RDS) tramite RDS Proxy. La funzione Lambda legge i record da una coda Amazon Simple Queue Service (Amazon SQS) e scrive un nuovo elemento in una tabella del database ogni volta che viene aggiunto un messaggio. In questo esempio, viene utilizzata la AWS Management Console per aggiungere manualmente i messaggi alla coda. Il diagramma seguente mostra le AWS risorse che usi per completare il tutorial.

Un'istanza di AWS Management Console si connette a una coda standard Amazon SQS, che si collega a una funzione Lambda, che si connette ulteriormente a un database RDS per MySQL tramite RDS Proxy.

Con Amazon RDS, è possibile eseguire un database relazionale gestito nel cloud utilizzando prodotti database comuni come Microsoft SQL Server, MariaDB, MySQL, Oracle Database e PostgreSQL. Utilizzando Lambda per accedere al tuo database, puoi leggere e scrivere dati in risposta a eventi, come ad esempio un nuovo cliente che si registra sul tuo sito Web. La funzione, l'istanza database e il proxy vengono dimensionati automaticamente per rispondere ai periodi di forte domanda.

Per completare questo tutorial, completa le seguenti attività:

  1. Avvia un'istanza di database RDS for MySQL e un proxy nel tuo Account AWS VPC predefinito.

  2. Crea e testa una funzione Lambda che crea una nuova tabella nel tuo database e vi scrive i dati.

  3. Crea una coda Amazon SQS e configurala per richiamare la funzione Lambda ogni volta che viene aggiunto un nuovo messaggio.

  4. Verifica la configurazione completa aggiungendo messaggi alla coda utilizzando AWS Management Console e monitorando i risultati utilizzando Logs. CloudWatch

Completando questi passaggi, imparerai:

  • Come usare Amazon RDS per creare un'istanza database e un proxy e connettere una funzione Lambda al proxy.

  • Come usare Lambda per eseguire operazioni di creazione e lettura su un database Amazon RDS.

  • Come utilizzare Amazon SQS per richiamare una funzione Lambda.

Puoi completare questo tutorial usando AWS Management Console o il AWS Command Line Interface ()AWS CLI.

Prerequisiti

Prima di iniziare, completa le fasi descritte in questa sezione:

Creazione di un'istanza database Amazon RDS

Diagramma del flusso di lavoro del tutorial che mostra che ti trovi nella fase di creazione del database.

Un'istanza database Amazon RDS è un ambiente di database isolato in esecuzione nel Cloud AWS. Un'istanza può contenere uno o più database creati dall'utente. Se non diversamente specificato, Amazon RDS crea nuove istanze di database nel VPC predefinito incluso nel tuo. Account AWS Per ulteriori informazioni su Amazon VPC, consulta la Guida per l'utente di Amazon Virtual Private Cloud.

In questo tutorial, crei una nuova istanza nel tuo Account AWS VPC predefinito e crei un database denominato ExampleDB in quell'istanza. È possibile creare l'istanza DB e il database utilizzando il AWS Management Console o il AWS CLI.

Per creare un'istanza database
  1. Apri la console Amazon RDS e scegli Crea database.

  2. Lascia selezionata l'opzione Creazione standard, quindi in Opzioni del motore, scegli MySQL.

  3. Nella sezione Modelli, seleziona Piano gratuito.

  4. In Impostazioni, per Identificatore istanza database, immetti MySQLForLambda.

  5. Per impostare il nome e la password, procedi come segue:

    1. In Impostazioni delle credenziali, lascia il campo Nome utente master impostato su admin.

    2. Per Password master, inserisci una password e confermala per accedere al database.

  6. Specifica il nome del database effettuando le seguenti operazioni:

    • Lascia selezionate tutte le opzioni predefinite rimanenti e scorri verso il basso fino alla sezione Configurazione aggiuntiva.

    • Espandi questa sezione e immetti ExampleDB in Nome database iniziale.

  7. Lascia selezionate tutte le opzioni predefinite rimanenti e scegli Crea database.

Creazione di una funzione Lambda e un proxy

Diagramma del flusso di lavoro del tutorial che mostra che ci si trova fase di creazione di un ruolo di esecuzione della funzione Lambda.

È possibile utilizzare la console RDS per creare una funzione Lambda e un proxy nello stesso VPC del database.

Nota

È possibile creare queste risorse associate solo al termine della creazione del database e quando si trova nello stato Disponibile.

Per creare una funzione e un proxy associati
  1. Dalla pagina Database, controlla se il database si trova nello stato Disponibile. In questo caso, passa alla fase successiva. Altrimenti, attendi che il database sia disponibile.

  2. Seleziona il database e scegli Configurazione della connessione Lambda da Azioni.

  3. Nella pagina Configurazione della connessione Lambda, scegli Crea una nuova funzione.

    Imposta il nuovo nome della funzione Lambda su LambdaFunctionWithRDS.

  4. Nella sezione RDS Proxy, seleziona l'opzione Connetti tramite RDS Proxy. Scegli Crea nuovo proxy.

    • Per Credenziali del database, scegli nome utente e password del database.

    • Per Nome utente, specifica admin.

    • Per Password, immetti la password creata per l'istanza database.

  5. Seleziona Configurare per completare la creazione del proxy e della funzione Lambda.

La procedura guidata completa la configurazione e fornisce un collegamento alla console Lambda per esaminare la nuova funzione. Prendi nota dell'endpoint proxy prima di passare alla console Lambda.

Creazione di un ruolo di esecuzione della funzione

Diagramma del flusso di lavoro del tutorial che mostra che ci si trova fase di creazione di un ruolo di esecuzione della funzione Lambda.

Prima di creare la funzione Lambda, è necessario creare un ruolo di esecuzione per assegnare alla funzione le autorizzazioni necessarie. Per questo tutorial, Lambda richiede l'autorizzazione per gestire la connessione di rete al VPC contenente l'istanza database e per eseguire il polling dei messaggi da una coda Amazon SQS.

Per assegnare alla funzione Lambda le autorizzazioni necessarie, questo tutorial utilizza policy gestite da IAM. Si tratta di policy che concedono le autorizzazioni per molti casi d'uso e sono disponibili nel tuo Account AWS. Per ulteriori informazioni sull'uso delle policy gestite, consulta Best practice delle policy.

Creazione del ruolo di esecuzione di Lambda
  1. Apri la pagina Ruoli della console IAM, quindi scegli Crea ruolo.

  2. Per Tipo di entità attendibile, scegli il servizio AWS  e per Caso d'uso, scegli Lambda.

  3. Seleziona Successivo.

  4. Aggiungi le policy gestite da IAM effettuando le seguenti operazioni:

    1. Utilizzando la casella di ricerca delle policy, cerca AWSLambdaSQSQueueExecutionRole.

    2. Nell'elenco dei risultati, seleziona la casella di controllo accanto al ruolo, quindi scegli Cancella filtri.

    3. Utilizzando la casella di ricerca delle policy, cerca AWSLambdaVPCAccessExecutionRole.

    4. Nell'elenco dei risultati, seleziona la casella di controllo accanto al ruolo, quindi scegli Successivo.

  5. In Nome ruolo, immetti lambda-vpc-sqs-role e quindi seleziona Crea ruolo.

Più avanti nel tutorial sarà necessario il nome della risorsa Amazon (ARN) del ruolo di esecuzione appena creato.

Individuazione dell'ARN del ruolo di esecuzione
  1. Apri la pagina Ruoli della console IAM e scegli il ruolo (lambda-vpc-sqs-role).

  2. Copia l'ARN visualizzato nella sezione Riepilogo.

Creazione di un pacchetto di implementazione Lambda

Diagramma del flusso di lavoro del tutorial che mostra che ci si trova nella fase della creazione di un pacchetto di implementazione della funzione Lambda.

L'esempio seguente di codice Python utilizza il pacchetto PyMySQL per aprire una connessione al database. La prima volta che viene richiamata la funzione, crea anche una nuova tabella chiamata Customer. La tabella utilizza lo schema seguente, dove CustID è la chiave primaria:

Customer(CustID, Name)

La funzione utilizza anche PyMy SQL per aggiungere record a questa tabella. La funzione aggiunge i record utilizzando gli ID e i nomi dei clienti specificati nei messaggi che aggiungerai alla coda Amazon SQS.

Il codice crea la connessione al database al di fuori della funzione di gestione. La creazione della connessione nel codice di inizializzazione consente di riutilizzarla da chiamate della funzione successive e migliora le prestazioni. In un'applicazione di produzione, è inoltre possibile utilizzare la simultaneità fornita per inizializzare un numero richiesto di connessioni al database. Queste connessioni sono disponibili non appena viene richiamata la funzione.

import sys import logging import pymysql import json import os # rds settings user_name = os.environ['USER_NAME'] password = os.environ['PASSWORD'] rds_proxy_host = os.environ['RDS_PROXY_HOST'] db_name = os.environ['DB_NAME'] logger = logging.getLogger() logger.setLevel(logging.INFO) # create the database connection outside of the handler to allow connections to be # re-used by subsequent function invocations. try: conn = pymysql.connect(host=rds_proxy_host, user=user_name, passwd=password, db=db_name, connect_timeout=5) except pymysql.MySQLError as e: logger.error("ERROR: Unexpected error: Could not connect to MySQL instance.") logger.error(e) sys.exit(1) logger.info("SUCCESS: Connection to RDS for MySQL instance succeeded") def lambda_handler(event, context): """ This function creates a new RDS database table and writes records to it """ message = event['Records'][0]['body'] data = json.loads(message) CustID = data['CustID'] Name = data['Name'] item_count = 0 sql_string = f"insert into Customer (CustID, Name) values(%s, %s)" with conn.cursor() as cur: cur.execute("create table if not exists Customer ( CustID int NOT NULL, Name varchar(255) NOT NULL, PRIMARY KEY (CustID))") cur.execute(sql_string, (CustID, Name)) conn.commit() cur.execute("select * from Customer") logger.info("The following items have been added to the database:") for row in cur: item_count += 1 logger.info(row) conn.commit() return "Added %d items to RDS for MySQL table" %(item_count)
Nota

In questo esempio, le credenziali di accesso al database vengono archiviate come variabili di ambiente. Nelle applicazioni di produzione, si consiglia di utilizzare AWS Secrets Manager per maggiore sicurezza. Tieni presente che, se la funzione Lambda si trova in un VPC, per eseguire la connessione a Secrets Manager devi creare un endpoint VPC. Per ulteriori informazioni, consulta la pagina How to connect to Secrets Manager service within a Virtual Private Cloud.

Per includere la dipendenza PyMy SQL nel codice della funzione, create un pacchetto di distribuzione.zip. I seguenti comandi funzionano per Linux, macOS o Unix:

Creazione di un pacchetto di implementazione .zip
  1. Salva il codice di esempio come un file denominato lambda_function.py.

  2. Nella stessa directory in cui hai creato il lambda_function.py file, crea una nuova directory denominata package e installa la libreria PyMy SQL.

    mkdir package pip install --target package pymysql
  3. Create un file zip contenente il codice dell'applicazione e la libreria PyMy SQL. Su Linux o macOS, esegui i comandi della CLI riportati. Su Windows, usa il tuo strumento di compressione preferito per creare il file lambda_function.zip. Il file del codice sorgente lambda_function.py e le cartelle contenenti le dipendenze devono essere installati nella directory principale del file .zip.

    cd package zip -r ../lambda_function.zip . cd .. zip lambda_function.zip lambda_function.py

    Puoi creare il tuo pacchetto di implementazione anche utilizzando un ambiente virtuale Python. Consulta Distribuisci funzioni Lambda per Python con gli archivi di file .zip.

Aggiornamento della funzione Lambda

Utilizzando il nuovo pacchetto .zip creato, viene aggiornata una funzione Lambda tramite la console Lambda. Per consentire alla funzione di accedere al database, è inoltre necessario configurare le variabili di ambiente con le credenziali di accesso.

Per aggiornare la funzione Lambda
  1. Apri la pagina Funzioni della console Lambda e scegli la tua funzione LambdaFunctionWithRDS.

  2. Nella scheda Impostazioni di runtime, seleziona Modifica per modificare il Runtime della funzione in Python 3.10.

  3. Cambia il Gestore in lambda_function.lambda_handler.

  4. Nella scheda Codice, scegli Carica da, quindi File .zip.

  5. Seleziona il file lambda_function.zip che hai creato nella fase precedente e scegli Salva.

A questo punto, configura la funzione con il ruolo di esecuzione creato in precedenza. Ciò concede alla funzione le autorizzazioni necessarie per accedere all'istanza del database ed eseguire il polling di una coda Amazon SQS.

Per configurare il ruolo di esecuzione della funzione
  1. Nella pagina Funzioni della console Lambda, seleziona la scheda Configurazione, quindi scegli Autorizzazioni.

  2. In Ruolo di esecuzione, scegli Modifica.

  3. In Ruolo esistente, scegli il ruolo di esecuzione (lambda-vpc-sqs-role).

  4. Selezionare Salva.

Per configurare le variabili di ambiente della funzione
  1. Nella pagina Funzioni della console Lambda, seleziona la scheda Configurazione, quindi scegli Variabili di ambiente.

  2. Scegli Modifica.

  3. Per aggiungere le credenziali di accesso al database, procedi come segue:

    1. Scegli Aggiungi variabili di ambiente, quindi in Chiave inserisci USER_NAME e in Valore inserisci admin.

    2. Scegli Aggiungi variabili di ambiente, quindi in Chiave inserisci DB_NAME e in Valore inserisci ExampleDB.

    3. Scegli Aggiungi variabili di ambiente, quindi in Chiave inserisci PASSWORD e in Valore inserisci la password che hai scelto quando hai creato il database.

    4. Scegli Aggiungi variabili di ambiente, quindi per Chiave inserisci RDS_PROXY_HOST e per Valore inserisci l'endpoint di RDS Proxy di cui hai preso nota in precedenza.

    5. Selezionare Salva.

Test della funzione Lambda nella console

Diagramma del flusso di lavoro del tutorial che mostra che ci si trova nella fase di test della funzione della funzione Lambda.

A questo punto è possibile utilizzare la console Lambda per testare la funzione. Viene creato un evento di test che imita i dati che verranno ricevuti dalla tua funzione quando questa viene richiamata utilizzando Amazon SQS nella fase finale del tutorial. L'evento di test contiene un oggetto JSON che specifica un ID cliente e un nome del cliente da aggiungere alla tabella Customer creata dalla funzione.

Verifica della funzione Lambda
  1. Apri la pagina Funzioni della console Lambda e scegli la tua funzione.

  2. Scegli la sezione Test.

  3. Scegli Crea nuovo evento e immetti myTestEvent per il nome dell'evento.

  4. Copia il seguente codice in JSON dell'evento e scegli Salva.

    { "Records": [ { "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d", "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...", "body": "{\n \"CustID\": 1021,\n \"Name\": \"Martha Rivera\"\n}", "attributes": { "ApproximateReceiveCount": "1", "SentTimestamp": "1545082649183", "SenderId": "AIDAIENQZJOLO23YVJ4VO", "ApproximateFirstReceiveTimestamp": "1545082649185" }, "messageAttributes": {}, "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3", "eventSource": "aws:sqs", "eventSourceARN": "arn:aws:sqs:us-west-2:123456789012:my-queue", "awsRegion": "us-west-2" } ] }
  5. Scegli Test (Esegui test).

Nella scheda Risultati di esecuzione, si dovrebbero ottenere risultati simili ai seguenti visualizzati nei log della funzione:

[INFO] 2023-02-14T19:31:35.149Z bdd06682-00c7-4d6f-9abb-89f4bbb4a27f The following items have been added to the database: [INFO] 2023-02-14T19:31:35.149Z bdd06682-00c7-4d6f-9abb-89f4bbb4a27f (1021, 'Martha Rivera')

Creazione di una coda Amazon SQS

Diagramma del flusso di lavoro del tutorial che mostra che ci si trova nella fase di creazione della coda della coda di messaggi.

Hai testato con successo l'integrazione della tua funzione Lambda e dell'istanza del database Amazon RDS. Adesso creerai la coda Amazon SQS che verrà utilizzata per richiamare la funzione Lambda nella fase finale del tutorial.

Creazione della coda Amazon SQS (console)
  1. Apri la pagina Code della console Amazon SQS e seleziona Crea coda.

  2. Lascia il campo Tipo impostato su Standard e inserisci LambdaRDSQueue per il nome della coda.

  3. Lascia selezionate tutte le opzioni predefinite e scegli Crea coda.

Creazione di uno strumento di mappatura dell'origine degli eventi per richiamare la funzione Lambda

Diagramma del flusso di lavoro del tutorial che mostra che ci si trova nella fase di creazione di uno strumento di mappatura dell'origine degli eventi della coda di messaggi.

Uno strumento di mappatura dell'origine degli eventi è una risorsa Lambda che legge gli elementi da un flusso o da una coda e chiama una funzione Lambda. Quando si configura uno strumento di mappatura dell'origine degli eventi, puoi specificare una dimensione batch in modo che i record del flusso o della coda vengano raggruppati in un unico payload. In questo esempio, la dimensione del batch viene impostata su 1 in modo che la funzione Lambda venga richiamata ogni volta che viene inviato un messaggio alla coda. È possibile configurare la mappatura delle sorgenti degli eventi utilizzando la console AWS CLI o Lambda.

Creazione di uno strumento di mappatura dell'origine degli eventi (console)
  1. Apri la pagina Funzioni della console Lambda e scegli la tua funzione (LambdaFunctionWithRDS).

  2. Nella sezione Panoramica della funzione, scegli Aggiungi trigger.

  3. Per l'origine, seleziona Amazon SQS, quindi seleziona il nome della coda (LambdaRDSQueue).

  4. Per Dimensioni del batch, immetti 1.

  5. Lascia tutte le altre opzioni impostate sui valori predefiniti e scegli Aggiungi.

A questo punto, è possibile testare la configurazione completa aggiungendo un messaggio alla coda Amazon SQS.

Test e monitoraggio della configurazione

Diagramma del flusso di lavoro del tutorial che mostra che ci si trova nella fase di test e monitoraggio.

Per testare la configurazione completa, aggiungi i messaggi alla coda Amazon SQS utilizzando la console. Utilizzate quindi CloudWatch Logs per confermare che la funzione Lambda sta scrivendo record nel database come previsto.

Test e monitoraggio della configurazione
  1. Apri la pagina Code della console Amazon SQS e seleziona la coda (LambdaRDSQueue).

  2. Scegli Invio e ricezione di messaggi e incolla il seguente JSON nel Corpo del messaggio nella sezione Invia messaggio.

    { "CustID": 1054, "Name": "Richard Roe" }
  3. Scegliere Invia messaggio.

    L'invio del messaggio alla coda farà sì che Lambda richiami la funzione tramite lo strumento di mappatura dell'origine degli eventi. Per confermare che Lambda abbia richiamato la funzione come previsto, usa CloudWatch Logs per verificare che la funzione abbia scritto il nome e l'ID del cliente nella tabella del database.

  4. Apri la pagina Log groups della CloudWatch console e seleziona il gruppo di log per la tua funzione (). /aws/lambda/LambdaFunctionWithRDS

  5. Nella sezione Flussi di log, scegli il flusso di log più recente.

    La tabella deve contenere due record relativi ai clienti, uno per ogni chiamata della funzione. Nel flusso di log, si dovrebbero visualizzare messaggi simili ai seguenti:

    [INFO] 2023-02-14T19:06:43.873Z 45368126-3eee-47f7-88ca-3086ae6d3a77 The following items have been added to the database: [INFO] 2023-02-14T19:06:43.873Z 45368126-3eee-47f7-88ca-3086ae6d3a77 (1021, 'Martha Rivera') [INFO] 2023-02-14T19:06:43.873Z 45368126-3eee-47f7-88ca-3086ae6d3a77 (1054, 'Richard Roe')

Pulizia delle risorse

Ora è possibile eliminare le risorse create per questo tutorial, a meno che non si voglia conservarle. Eliminando AWS le risorse che non utilizzi più, eviti addebiti inutili sul tuo AWS account.

Per eliminare la funzione Lambda
  1. Aprire la pagina Functions (Funzioni) della console Lambda.

  2. Selezionare la funzione creata.

  3. Scegliere Actions (Operazioni), Delete (Elimina).

  4. Scegliere Delete (Elimina).

Per eliminare il ruolo di esecuzione
  1. Aprire la pagina Ruoli della console IAM.

  2. Selezionare il ruolo di esecuzione creato.

  3. Scegliere Delete role (Elimina ruolo).

  4. Scegliere Yes, delete (Sì, elimina).

Per eliminare l'istanza database MySQL
  1. Aprire la pagina Database della console Amazon RDS.

  2. Selezionare il database creato.

  3. Scegli Operazioni > Elimina.

  4. Deselezionare la casella per Create final snapshot (Crea snapshot finale).

  5. Immettere delete me nella casella di testo.

  6. Scegliere Delete (Elimina).

Per eliminare la coda Amazon SQS
  1. Accedi AWS Management Console e apri la console Amazon SQS all'indirizzo https://console.aws.amazon.com/sqs/.

  2. Selezionare la coda creata.

  3. Scegliere Delete (Elimina).

  4. Immettere delete nella casella di testo.

  5. Scegli Delete (Elimina).