AWS Lambda
Guia do desenvolvedor

Manipulador da função do AWS Lambda no Node.js

O manipulador é o método na sua função Lambda que processa eventos. Quando você invoca uma função, o runtime (tempo de execução) executa o método do manipulador. Quando o manipulador é encerrado ou retorna uma resposta, ele se torna disponível para manipular outro evento.

O exemplo de função a seguir registra o conteúdo do objeto de evento e retorna o local dos logs.

exemplo Arquivo index.js

exports.handler = async function(event, context) { console.log("EVENT: \n" + JSON.stringify(event, null, 2)) return context.logStreamName }

Quando você configura uma função, o valor da configuração do manipulador é o nome do arquivo e o nome do módulo do manipulador exportado, separados por um ponto. O padrão no console e nos exemplos deste guia é index.handler. Ele indica o módulo handler exportado por index.js.

O tempo de execução transmite três argumentos para o método do manipulador. O primeiro argumento é o objeto event, que contém informações do chamador. O invocador passa essas informações como uma string no formato JSON ao chamar Invoke e o tempo de execução a converte em um objeto. Quando um serviço da AWS invoca a função, a estrutura do evento varia de acordo com o serviço.

O segundo argumento é o objeto de contexto, que contém informações sobre a invocação, a função e o ambiente de execução. No exemplo anterior, a função obtém o nome do stream de log do objeto de contexto e o retorna para o chamador.

O terceiro argumento, callback, é uma função que você pode chamar em funções não assíncronas para enviar uma resposta. A função de retorno de chamada usa dois argumentos: um Error e uma resposta. O objeto de resposta deve ser compatível com JSON.stringify.

Para funções assíncronas, você retorna uma resposta, um erro ou uma promessa para o tempo de execução em vez de usar callback.

Funções assíncronas

Para funções assíncronas, você pode usar return e throw para enviar uma resposta ou um erro, respectivamente. As funções devem usar a palavra-chave async para usar esses métodos a fim de retornar uma resposta ou um erro.

Se o código executar uma tarefa assíncrona, retorne uma promessa para garantir que a execução seja finalizada. Quando você resolve ou rejeita a promessa, o Lambda envia a resposta ou o erro para o chamador.

exemplo Arquivo index.js – solicitação HTTP com função e promessas assíncronas

const https = require('https') let url = "https://docs.aws.amazon.com/lambda/latest/dg/welcome.html" exports.handler = async function(event) { const promise = new Promise(function(resolve, reject) { https.get(url, (res) => { resolve(res.statusCode) }).on('error', (e) => { reject(Error(e)) }) }) return promise }

Para bibliotecas que retornam uma promessa, você pode retornar essa promessa diretamente para o tempo de execução.

exemplo Arquivo index.js – AWS SDK com funções e promessas assíncronas

const AWS = require('aws-sdk') const s3 = new AWS.S3() exports.handler = async function(event) { return s3.listBuckets().promise() }

Funções não assíncronas

O exemplo de função a seguir verifica uma URL e retorna o código de status para o chamador.

exemplo Arquivo index.js – solicitação HTTP com chamada de retorno

const https = require('https') let url = "https://docs.aws.amazon.com/lambda/latest/dg/welcome.html" exports.handler = function(event, context, callback) { https.get(url, (res) => { callback(null, res.statusCode) }).on('error', (e) => { callback(Error(e)) }) }

No caso de funções não assíncronas, a execução da função continua até que o loop de evento esteja vazio ou o tempo da função se esgote. A resposta não é enviada para o chamador até que todas as tarefas de loop de evento estejam concluídas. Se a função expirar, um erro será retornado. Você pode configurar o tempo de execução para enviar a resposta imediatamente, definindo context.callbackWaitsForEmptyEventLoop como false.

No exemplo a seguir, a resposta do Amazon S3 é retornada ao chamador assim que fica disponível. O tempo limite em execução no loop de evento é congelado e continuará sendo executado na próxima vez que a função for invocada.

exemplo Arquivo index.js – callbackWaitsForEmptyEventLoop

const AWS = require('aws-sdk') const s3 = new AWS.S3() exports.handler = function(event, context, callback) { context.callbackWaitsForEmptyEventLoop = false s3.listBuckets(null, callback) setTimeout(function () { console.log('Timeout complete.') }, 5000) }