Criação de eventos programados para executar funções do AWS Lambda - AWS SDK for JavaScript

O Guia de referência da API do AWS SDK for JavaScript V3 descreve em detalhes todas as operações da API para o AWS SDK for JavaScript versão 3 (V3).

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Criação de eventos programados para executar funções do AWS Lambda

Você pode criar um evento agendado que invoca uma AWS Lambda função usando um evento da Amazon CloudWatch . Você pode configurar um CloudWatch evento para usar uma expressão cron para agendar quando uma função Lambda é invocada. Por exemplo, você pode agendar um CloudWatch evento para invocar uma função Lambda todos os dias da semana.

O AWS Lambda é um serviço de computação que permite executar código sem provisionar ou gerenciar servidores. Você pode criar funções do Lambda em várias linguagens de programação. Para obter mais informações sobre o AWS Lambda, consulte O que é o AWS Lambda.

Neste tutorial, você cria uma função Lambda usando a API de tempo de execução do JavaScript Lambda. Este exemplo invoca diferentes serviços da AWS para lidar com um caso de uso específico. Por exemplo, suponha que uma organização envie uma mensagem de SMS para seus funcionários parabenizando-os pela data de um ano de tempo de casa, conforme mostrado nesta ilustração.


                Tabela DynamoDB

O tutorial levará aproximadamente 20 minutos para ser concluído.

Este tutorial mostra como usar a JavaScript lógica para criar uma solução que execute esse caso de uso. Por exemplo, você aprenderá como ler um banco de dados para determinar quais funcionários atingiram a data de um ano de tempo de casa, como processar os dados e enviar uma mensagem de texto usando uma função do Lambda. Em seguida, você aprenderá como usar uma expressão cron para invocar a função do Lambda todos os dias da semana.

Este tutorial da AWS usa uma tabela do Amazon DynamoDB chamada Funcionários que contém estes campos.

  • id - a chave primária da tabela.

  • firstName - o nome do funcionário.

  • phone - o número de telefone do funcionário.

  • startDate - a data de início do funcionário.


                Tabela do DynamoDB
Importante

Custo para concluir: os serviços da AWS incluídos neste documento estão incluídos no Nível gratuito da AWS. No entanto, certifique-se de encerrar todos os recursos depois de concluir este tutorial para garantir que você não seja cobrado.

Tarefas de pré-requisito

Para configurar e executar este exemplo, você deve primeiro concluir estas tarefas:

  • Configure o ambiente do projeto para executar esses TypeScript exemplos de Node.js e instale os módulos necessários AWS SDK for JavaScript e de terceiros. Siga as instruções em GitHub.

  • Crie um arquivo de configurações compartilhado com as credenciais de usuário. Para obter mais informações sobre como fornecer um arquivo de credenciais compartilhado, consulte Arquivos de configuração e credenciais compartilhados no Guia de referência de ferramentas e SDKs da AWS.

Criar os recursos da AWS

Este tutorial requer os seguintes recursos:

  • Uma tabela do Amazon DynamoDB chamada Funcionários com uma chave chamada Id e os campos mostrados na ilustração anterior. Certifique-se de inserir os dados corretos, incluindo um telefone celular válido com o qual você deseja testar esse caso de uso. Para obter mais informações, consulte Criar uma tabela.

  • Um perfil do IAM com permissões anexadas para executar funções do Lambda.

  • Um bucket do Amazon S3 para hospedar a função do Lambda.

Você pode criar esses recursos manualmente, mas recomendamos provisioná-los usando o AWS CloudFormation conforme descrito neste tutorial.

Criar os recursos da AWS usando o AWS CloudFormation

O AWS CloudFormation permite que você crie e provisione implantações de infraestrutura da AWS de maneira previsível e repetida. Para mais informações sobre o AWS CloudFormation, consulte o AWS CloudFormationGuia do usuário do .

Para criar a pilha AWS CloudFormation usando a AWS CLI:

  1. Instale e configure a AWS CLI seguindo as instruções do Guia do usuário da AWS CLI.

  2. Crie um arquivo chamado setup.yaml no diretório raiz da pasta do seu projeto e copie o conteúdo aqui GitHub para dentro dele.

    nota

    O AWS CloudFormation modelo foi gerado usando o AWS CDK disponível aqui em GitHub. Para obter mais informações sobre o AWS CDK, consulte o Guia do desenvolvedor do AWS Cloud Development Kit (AWS CDK).

  3. Execute o comando a seguir na linha de comando, substituindo STACK_NAME por um nome exclusivo para a pilha.

    Importante

    O nome da pilha deve ser exclusivo em uma Região da AWS e em uma conta da AWS. Você pode especificar até 128 caracteres, e números e hifens são permitidos.

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

    Para obter mais informações sobre os parâmetros do comando create-stack, consulte o Guia de referência de comandos da AWS CLI e o Guia do usuário do AWS CloudFormation.

    Veja uma lista dos recursos no console abrindo a pilha no painel AWS CloudFormation e escolhendo a guia Recursos. Você precisa desses recursos para o tutorial.

  4. Quando a pilha for criada, use o AWS SDK for JavaScript para preencher a tabela do DynamoDB, conforme descrito em Preencher a tabela do DynamoDB..

Preencher a tabela do DynamoDB.

Para preencher a tabela, primeiro crie um diretório chamado libs, nele crie um arquivo chamado dynamoClient.js e cole o conteúdo abaixo nesse arquivo.

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

Esse código está disponível aqui em GitHub.

Em seguida, crie um arquivo chamado populate-table.js no diretório raiz da pasta do seu projeto e copie o conteúdo aqui GitHub para dentro dele. Para um dos itens, substitua o valor da propriedade phone por um número de celular válido no formato E.164, e o valor de startDate pela data de hoje.

Na linha de comando, execute o seguinte comando:

node populate-table.js
const { BatchWriteItemCommand } = require( "aws-sdk/client-dynamodb" ); const {dynamoClient} = require( "./libs/dynamoClient" ); // Set the parameters. 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();

Esse código está disponível aqui em GitHub.

Criar a função do AWS Lambda

Como configurar o SDK

Primeiro, importe os módulos e comandos necessários do AWS SDK for JavaScript (v3): DynamoDBClient e DynamoDB ScanCommand, e SNSClient e Amazon SNS PublishCommand. Substitua REGION pela Região da AWS. Em seguida, calcule a data de hoje e atribua-a a um parâmetro. Em seguida, crie os parâmetros para ScanCommand.Replace TABLE_NAME com o nome da tabela que você criou na seção Criar os recursos da AWS deste exemplo.

O snippet de código a seguir mostra essa etapa. (Consulte Como empacotar a função do Lambda para ver o exemplo completo.)

"use strict"; // Load the required clients and commands. const { DynamoDBClient, ScanCommand } = require("@aws-sdk/client-dynamodb"); const { SNSClient, PublishCommand } = require("@aws-sdk/client-sns"); //Set the AWS Region. const REGION = "REGION"; //e.g. "us-east-1" // 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 the the attributes that you want. ProjectionExpression: "firstName, phone", TableName: "TABLE_NAME", };

Como escanear a tabela do DynamoDB

Primeiro, crie uma função async/await chamada sendText para publicar uma mensagem de texto usando o Amazon SNS PublishCommand. Em seguida, adicione um padrão de bloco try que verifique a tabela do DynamoDB em busca de funcionários com aniversário de tempo de casa na data de hoje e, em seguida, chame a função sendText para enviar uma mensagem de texto a esses funcionários. Se ocorrer um erro, o bloco catch será chamado.

O snippet de código a seguir mostra essa etapa. (Consulte Como empacotar a função do Lambda para ver o exemplo completo.)

exports.handler = async (event, context, callback) => { // Helper function to send message using Amazon SNS. async function sendText(textParams) { try { const data = await snsclient.send(new PublishCommand(textParams)); console.log("Message sent"); } catch (err) { console.log("Error, message not sent ", err); } } try { // Scan the table to check identify employees with work anniversary today. const data = await dbclient.send(new ScanCommand(params)); data.Items.forEach(function (element, index, array) { 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); } };

Como empacotar a função do Lambda

Este tópico descreve como empacotar a mylambdafunction.js e os módulos do AWS SDK for JavaScript necessários para este exemplo em um arquivo empacotado chamado index.js.

  1. Caso ainda não tenha feito isso, siga as instruções descritas em Tarefas de pré-requisito para este exemplo para instalar o webpack.

    nota

    Para obter informações sobre webpack, consulte Agrupe aplicativos com o webpack.

  2. Execute o seguinte na linha de comando para agrupar o deste JavaScript exemplo em um arquivo chamado<index.js>:

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

    A saída é chamada index.js. Isso ocorre porque as funções do Lambda precisam ter um manipulador index.js para funcionar.

  3. Comprima o arquivo de saída empacotado, index.js, em um arquivo ZIP chamado my-lambda-function.zip.

  4. Faça o upload de mylambdafunction.zip para o bucket Amazon S3 que você criou no tópico Criar os recursos da AWS deste tutorial.

Aqui está o código completo do script do navegador para mylambdafunction.js.

"use strict"; // Load the required clients and commands. const { DynamoDBClient, ScanCommand } = require("@aws-sdk/client-dynamodb"); const { SNSClient, PublishCommand } = require("@aws-sdk/client-sns"); //Set the AWS Region. const REGION = "REGION"; //e.g. "us-east-1" // 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 the the attributes that you want. ProjectionExpression: "firstName, phone", TableName: "TABLE_NAME", }; // Create the client service objects. const dbclient = new DynamoDBClient({ region: REGION }); const snsclient = new SNSClient({ region: REGION }); exports.handler = async (event, context, callback) => { // Helper function to send message using Amazon SNS. async function sendText(textParams) { try { const data = await snsclient.send(new PublishCommand(textParams)); console.log("Message sent"); } catch (err) { console.log("Error, message not sent ", err); } } try { // Scan the table to check identify employees with work anniversary today. const data = await dbclient.send(new ScanCommand(params)); data.Items.forEach(function (element, index, array) { 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); } };

Implante a função do Lambda.

Na raiz do projeto, crie um arquivo lambda-function-setup.js e cole o conteúdo abaixo nele.

Substitua BUCKET_NAME pelo nome do bucket Amazon S3 para o qual você fez o upload da versão ZIP da sua função do Lambda. Substitua ZIP_FILE_NAME pelo nome da versão ZIP da sua função do Lambda. Substitua IAM_ROLE_ARN pelo Número de recurso da Amazon (ARN) do perfil do IAM que você criou no tópico Criar os recursos da AWS deste tutorial. Substitua LAMBDA_FUNCTION_NAME por um nome para a função do Lambda.

// Load the required Lambda client and commands. const { CreateFunctionCommand, } = require("@aws-sdk/client-lambda"); const { lambdaClient } = require("..libs/lambdaClient.js"); // Instantiate an Lambda client service object. const lambda = new LambdaClient({ region: REGION }); // 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 the each anniversary of their start-date.", }; const run = async () => { try { const data = await lambda.send(new CreateFunctionCommand(params)); console.log("Success", data); // successful response } catch (err) { console.log("Error", err); // an error occurred } }; run();

Insira o seguinte na linha de comando para implantar a função do Lambda.

node lambda-function-setup.js

Este exemplo de código está disponível aqui em GitHub.

Configure CloudWatch para invocar as funções Lambda

Para configurar para CloudWatch invocar as funções do Lambda:

  1. Abra a página Functions (Funções) no console do Lambda.

  2. Escolha a função Lambda.

  3. Em Designer, escolha Add trigger (Adicionar trigger).

  4. Defina o tipo de gatilho como CloudWatch Events/ EventBridge.

  5. Em Regra, escolha Criar uma nova regra.

  6. Preencha o Nome da regra e a Descrição da regra.

  7. Para o tipo de regra, selecione Expressão de programação.

  8. No campo Expressão de programação, insira uma expressão cron. Por exemplo, cron(0 12 ? * MON-FRI *).

  9. Escolha Add.

    nota

    Para obter mais informações, consulte Usando o Lambda com CloudWatch eventos.

Excluir os recursos

Parabéns! Você invocou uma função Lambda por meio de eventos programados da CloudWatch Amazon usando o. AWS SDK for JavaScript Conforme informado no início deste tutorial, certifique-se de encerrar todos os recursos que criar enquanto percorre este tutorial para garantir que você não seja cobrado. Você pode fazer isso excluindo a pilha AWS CloudFormation que criou no tópico Criar os recursos da AWS deste tutorial, da seguinte forma:

  1. Abra o console de AWS CloudFormation.

  2. Na página Pilhas, selecione a pilha.

  3. Escolha Excluir.