Richiamare Lambda con API Gateway - AWS SDK for JavaScript

La Guida di riferimento dell'API AWS SDK for JavaScript V3 descrive in dettaglio tutte le operazioni API per la AWS SDK for JavaScript versione 3 (V3).

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à.

Richiamare Lambda con API Gateway

Puoi richiamare una funzione Lambda utilizzando Amazon API Gateway, AWS un servizio per la creazione, la pubblicazione, la manutenzione, il monitoraggio e la protezione di REST, WebSocket HTTP e API su larga scala. Gli sviluppatori di API possono creare API in grado di accedere ad AWS o ad altri servizi Web, nonché ai dati archiviati in AWS Cloud. In qualità di sviluppatore di API Gateway, puoi creare API da utilizzare nelle tue applicazioni client. Per ulteriori informazioni, consulta Cos'è Amazon API Gateway.

AWS Lambdaè un servizio di elaborazione che consente di eseguire codice senza fornire o gestire server. È possibile creare funzioni Lambda in diversi linguaggi di programmazione. Per ulteriori informazioni su AWS Lambda, consulta Che cos'è AWS Lambda.

In questo esempio, crei una funzione Lambda utilizzando l'API JavaScript Lambda runtime. Questo esempio richiama diversi servizi AWS per eseguire un caso d'uso specifico. Ad esempio, supponiamo che un'organizzazione invii un messaggio di testo mobile ai propri dipendenti per congratularsi con loro per la data del primo anniversario, come illustrato in questa illustrazione.

DynamoDB tabella

Il completamento dell'esempio dovrebbe richiedere circa 20 minuti.

Questo esempio mostra come utilizzare la JavaScript logica per creare una soluzione che esegua questo caso d'uso. Ad esempio, imparerai a leggere un database per determinare quali dipendenti hanno raggiunto la data del primo anniversario, come elaborare i dati e inviare un messaggio di testo, il tutto utilizzando una funzione Lambda. Quindi imparerai come utilizzare API Gateway per richiamare questa AWS Lambda funzione utilizzando un endpoint Rest. Ad esempio, puoi richiamare la funzione Lambda utilizzando questo comando curl:

curl -XGET "https://xxxxqjko1o3.execute-api.us-east-1.amazonaws.com/cronstage/employee"

Questo AWS tutorial utilizza una tabella Amazon DynamoDB denominata Employee che contiene questi campi.

  • id: la chiave primaria per la tabella.

  • firstName: nome del dipendente.

  • telefono: numero di telefono del dipendente.

  • StartDate: data di inizio del dipendente.

DynamoDB tabella
Importante

Costo di completamento: i AWS servizi inclusi in questo documento sono inclusi nel piano AWS gratuito. Tuttavia, assicurati di terminare tutte le risorse dopo aver completato questo esempio per assicurarti che non ti venga addebitato alcun costo.

Attività prerequisite

Per configurare ed eseguire questo esempio, è necessario completare queste attività:

  • Configura l'ambiente di progetto per eseguire questi TypeScript esempi di Node e installa i moduli richiesti AWS SDK for JavaScript e di terze parti. Segui le istruzioni su GitHub.

  • Creazione di un file di configurazione condiviso con le credenziali utente. Per ulteriori informazioni sulla fornitura di un file di credenziali condiviso, consulta File di configurazione e credenziali condivisi nella Guida di riferimento agli AWSSDK e agli strumenti.

Crea le risorse AWS

Questo tutorial richiede le seguenti risorse:

  • Una tabella Amazon DynamoDB Employee denominata con una chiave Id denominata e i campi mostrati nell'illustrazione precedente. Assicurati di inserire i dati corretti, incluso un telefono cellulare valido con cui desideri testare questo caso d'uso. Per ulteriori informazioni, consulta Creare una tabella.

  • Un ruolo IAM con autorizzazioni allegate per eseguire funzioni Lambda.

  • Un bucket Amazon S3 per ospitare la funzione Lambda.

Puoi creare queste risorse manualmente, ma ti consigliamo di effettuare il provisioning di queste risorse usando AWS CloudFormation come descritto in questo tutorial.

Crea le AWS risorse utilizzando AWS CloudFormation

AWS CloudFormation consente di creare ed effettuare il provisioning delle distribuzioni dell'infrastruttura AWS in modo ripetuto e prevedibile. Per ulteriori informazioni su AWS CloudFormation, consulta la AWS CloudFormationGuida per l'utente di .

Per creare lo AWS CloudFormation stack usando: AWS CLI

  1. Installa e configura le AWS CLI seguenti istruzioni contenute nella Guida per l'AWS CLIutente.

  2. Create un file denominato setup.yaml nella directory principale della cartella del progetto e copiatene il contenuto. GitHub

    Nota

    Il AWS CloudFormation modello è stato generato utilizzando quello AWS CDK disponibile qui GitHub. Per ulteriori informazioni su AWS CDK, consulta la Guida per gli sviluppatori di AWS Cloud Development Kit (AWS CDK).

  3. Esegui il seguente comando dalla riga di comando, sostituendo STACK_NAME con un nome univoco per lo stack.

    Importante

    Il nome dello stack deve essere univoco all'interno di una regione e di un account. AWS AWS È possibile specificare fino a 128 caratteri e sono consentiti numeri e trattini.

    aws cloudformation create-stack --stack-name STACK_NAME --template-body file://setup.yaml --capabilities CAPABILITY_IAM

    Per ulteriori informazioni sui parametri dei create-stack comandi, consultate la guida di riferimento ai AWS CLI comandi e la Guida per l'AWS CloudFormationutente.

  4. Successivamente, compila la tabella seguendo la proceduraCompilazione della tabella.

Compilazione della tabella

Per compilare la tabella, create innanzitutto una directory denominatalibs, in essa create un file denominato dynamoClient.js e incollate il contenuto sottostante.

const { DynamoDBClient } = require ( "@aws-sdk/client-dynamodb" ); // Set the AWS Region. const REGION = "REGION"; // e.g. "us-east-1" // Create an Amazon Lambda service client object. const dynamoClient = new DynamoDBClient({region:REGION}); module.exports = { dynamoClient };

Questo codice è disponibile qui su. GitHub

Quindi, crea un file denominato populate-table.js nella directory principale della cartella del tuo progetto e copia il contenuto qui GitHub dentro. Per uno degli elementi, sostituisci il valore della phone proprietà con un numero di cellulare valido nel formato E.164 e il valore della startDate con la data odierna.

Esegui il comando seguente dalla riga di comando.

node populate-table.js
const { BatchWriteItemCommand } = require ( "aws-sdk/client-dynamodb" ); const {dynamoClient} = require ( "./libs/dynamoClient" ); // Set the parameters. export const params = { RequestItems: { Employees: [ { PutRequest: { Item: { id: { N: "1" }, firstName: { S: "Bob" }, phone: { N: "155555555555654" }, startDate: { S: "2019-12-20" }, }, }, }, { PutRequest: { Item: { id: { N: "2" }, firstName: { S: "Xing" }, phone: { N: "155555555555653" }, startDate: { S: "2019-12-17" }, }, }, }, { PutRequest: { Item: { id: { N: "55" }, firstName: { S: "Harriette" }, phone: { N: "155555555555652" }, startDate: { S: "2019-12-19" }, }, }, }, ], }, }; export const run = async () => { try { const data = await dbclient.send(new BatchWriteItemCommand(params)); console.log("Success", data); } catch (err) { console.log("Error", err); } }; run();

Questo codice è disponibile qui GitHub.

Creazione della funzione AWS Lambda

Configurazione dell'SDK

Nella libs directory, crea file denominati snsClient.js and e lambdaClient.js incolla il contenuto seguente in questi file, rispettivamente.

const { SNSClient } = require ( "@aws-sdk/client-sns" ); // Set the AWS Region. const REGION = "REGION"; //e.g. "us-east-1" // Create an Amazon SNS service client object. const snsClient = new SNSClient({ region: REGION }); module.exports = { snsClient };

Sostituisci REGION con AWS Region. Questo codice è disponibile qui GitHub.

const { LambdaClient } = require ( "@aws-sdk/client-lambda" ); // Set the AWS Region. const REGION = "REGION"; //e.g. "us-east-1" // Create an Amazon Lambda service client object. const lambdaClient = new LambdaClient({ region: REGION }); module.exports = { lambdaClient };

Sostituisci REGION con la AWS Region. Questo codice è disponibile qui GitHub.

Innanzitutto, importa i moduli e i comandi richiesti AWS SDK for JavaScript (v3). Quindi calcola la data odierna e assegnala a un parametro. Terzo, crea i parametri per. ScanCommand Sostituite TABLE_NAME con il nome della tabella creata nella Crea le risorse AWS sezione di questo esempio.

Il seguente frammento di codice mostra questa fase. (Per l'esempio completo, consulta Raggruppamento della funzione Lambda.)

"use strict"; const { ScanCommand } = require("@aws-sdk/client-dynamodb"); const { PublishCommand } = require("@aws-sdk/client-sns"); const {snsClient} = require ( "./libs/snsClient" ); const {dynamoClient} = require ( "./libs/dynamoClient" ); // Get today's date. const today = new Date(); const dd = String(today.getDate()).padStart(2, "0"); const mm = String(today.getMonth() + 1).padStart(2, "0"); //January is 0! const yyyy = today.getFullYear(); const date = yyyy + "-" + mm + "-" + dd; // Set the parameters for the ScanCommand method. const params = { // Specify which items in the results are returned. FilterExpression: "startDate = :topic", // Define the expression attribute value, which are substitutes for the values you want to compare. ExpressionAttributeValues: { ":topic": { S: date }, }, // Set the projection expression, which are the attributes that you want. ProjectionExpression: "firstName, phone", TableName: "Employees", };

Scansione della tabella DynamoDB

Innanzitutto, crea una funzione async/await chiamata sendText per pubblicare un messaggio di testo utilizzando Amazon SNS. PublishCommand Quindi, aggiungi uno schema a try blocchi che analizza la tabella DynamoDB alla ricerca dei dipendenti che festeggiano oggi il loro anniversario di lavoro, quindi richiama sendText la funzione per inviare a questi dipendenti un messaggio di testo. Se si verifica un errore, viene richiamato il catch blocco.

Il seguente frammento di codice mostra questa fase. (Per l'esempio completo, consulta Raggruppamento della funzione Lambda.)

// Helper function to send message using Amazon SNS. exports.handler = async () => { // Helper function to send message using Amazon SNS. async function sendText(textParams) { try { await snsClient.send(new PublishCommand(textParams)); console.log("Message sent"); } catch (err) { console.log("Error, message not sent ", err); } } try { // Scan the table to identify employees with work anniversary today. const data = await dynamoClient.send(new ScanCommand(params)); data.Items.forEach(function (element) { const textParams = { PhoneNumber: element.phone.N, Message: "Hi " + element.firstName.S + "; congratulations on your work anniversary!", }; // Send message using Amazon SNS. sendText(textParams); }); } catch (err) { console.log("Error, could not scan table ", err); } };

Raggruppamento della funzione Lambda

Questo argomento descrive come raggruppare i mylambdafunction.ts AWS SDK for JavaScript moduli richiesti per questo esempio in un file in bundle chiamato. index.js

  1. Se non l'hai già fatto, segui questo esempio Attività prerequisite per installare webpack.

    Nota

    Per informazioni sul webpack, consulta. Raggruppa le applicazioni con webpack

  2. Esegui quanto segue nella riga di comando per raggruppare il file di questo JavaScript esempio in un file chiamato: <index.js>

    webpack mylambdafunction.ts --mode development --target node --devtool false --output-library-target umd -o index.js
    Importante

    Notate che l'output ha un nomeindex.js. Questo perché le funzioni Lambda devono avere un index.js gestore per funzionare.

  3. Comprimi il file di output in bundle,index.js, in un file ZIP denominato. mylambdafunction.zip

  4. Carica mylambdafunction.zip nel bucket Amazon S3 che hai creato nell'Crea le risorse AWSargomento di questo tutorial.

Distribuire la funzione Lambda

Nella radice del progetto, crea un lambda-function-setup.ts file e incolla il contenuto seguente al suo interno.

Sostituisci BUCKET_NAME con il nome del bucket Amazon S3 in cui hai caricato la versione ZIP della tua funzione Lambda. Sostituisci ZIP_FILE_NAME con il nome o il nome della versione ZIP della tua funzione Lambda. Sostituisci ROLE con l'Amazon Resource Number (ARN) del ruolo IAM che hai creato nell'Crea le risorse AWSargomento di questo tutorial. Sostituisci LAMBDA_FUNCTION_NAME con un nome per la funzione Lambda.

// Load the required Lambda client and commands. const { CreateFunctionCommand } = require ( "@aws-sdk/client-lambda" ); const { lambdaClient} = require ( "./libs/lambdaClient.js ); // Set the parameters. const params = { Code: { S3Bucket: "BUCKET_NAME", // BUCKET_NAME S3Key: "ZIP_FILE_NAME", // ZIP_FILE_NAME }, FunctionName: "LAMBDA_FUNCTION_NAME", Handler: "index.handler", Role: "IAM_ROLE_ARN", // IAM_ROLE_ARN; e.g., arn:aws:iam::650138640062:role/v3-lambda-tutorial-lambda-role Runtime: "nodejs12.x", Description: "Scans a DynamoDB table of employee details and using Amazon Simple Notification Services (Amazon SNS) to " + "send employees an email on each anniversary of their start-date.", }; const run = async () => { try { const data = await lambdaClient.send(new CreateFunctionCommand(params)); console.log("Success", data); // successful response } catch (err) { console.log("Error", err); // an error occurred } }; run();

Immettere quanto segue nella riga di comando per distribuire la funzione Lambda.

node lambda-function-setup.ts

Questo esempio di codice è disponibile qui. GitHub

Configurare API Gateway per richiamare la funzione Lambda

Crea la restante API

Puoi utilizzare la console API Gateway per creare un endpoint REST per la funzione Lambda. Una volta terminata, è possibile richiamare la funzione Lambda utilizzando una chiamata restful.

  1. Accedi alla console Amazon API Gateway.

  2. In Rest API, scegli Build.

  3. Seleziona Nuova API.

    DynamoDB tabella
  4. Specificate Employee come nome dell'API e fornite una descrizione.

    DynamoDB tabella
  5. Seleziona Create API (Crea API).

  6. Scegli Risorse nella sezione Dipendenti.

    DynamoDB tabella
  7. Nel campo del nome, specifica i dipendenti.

  8. Selezionare Create Resources (Crea risorse).

  9. Dal menu a discesa Azioni, scegli Crea risorse.

    DynamoDB tabella
  10. Scegli /employees, seleziona Crea metodo dal menu Azioni, quindi seleziona GET dal menu a discesa sotto /employees. Selezionare l'icona del segno di spunta.

    DynamoDB tabella
  11. Scegliete la funzione Lambda e immettete mylambdafunction come nome della funzione Lambda. Selezionare Salva.

Prova il metodo API Gateway

A questo punto del tutorial, puoi testare il metodo API Gateway che richiama la funzione Lambda mylambdafunction. Per testare il metodo, scegliete Test, come illustrato nella figura seguente.

DynamoDB tabella

Una volta richiamata la funzione Lambda, è possibile visualizzare il file di registro per visualizzare un messaggio di successo.

Implementa il metodo API Gateway

Una volta completato il test, puoi implementare il metodo dalla console di Amazon API Gateway.

  1. Scegli Get.

    DynamoDB tabella
  2. Dal menu a discesa Azioni, seleziona Deploy API.

    DynamoDB tabella
  3. Compila il modulo Deploy API e scegli Deploy.

    DynamoDB tabella
  4. Seleziona Salva modifiche.

  5. Scegli Get again e nota che l'URL cambia. Questo è l'URL di chiamata che puoi usare per richiamare la funzione Lambda.

    DynamoDB tabella

Eliminare le risorse

Complimenti! Hai richiamato una funzione Lambda tramite Amazon API Gateway utilizzando il. AWS SDK for JavaScript Come indicato all'inizio di questo tutorial, assicurati di terminare tutte le risorse che crei durante la lettura di questo tutorial per assicurarti che non ti vengano addebitati costi. Puoi farlo eliminando lo AWS CloudFormation stack che hai creato nell'Crea le risorse AWSargomento di questo tutorial, come segue:

  1. Apri il file AWS CloudFormationnella console di AWS gestione.

  2. Apri la pagina Stacks e seleziona lo stack.

  3. Scegli Delete (Elimina).