Executando e Invocando a Função Lambda
Este capítulo irá explicar em detalhes sobre o processo de execução e invocação da função Lambda e as etapas envolvidas nele.
Modelo de execução AWS Lambda
A execução da AWS depende dos detalhes de configuração adicionados para a função AWS Lambda. Quando a função é criada, há ummemory e time allotted, que é usado para a execução da função AWS Lambda.
Com a ajuda dos detalhes de configuração, o AWS Lambda cria um contexto de execução. O contexto de execução é um ambiente de execução temporário que é preparado com quaisquer dependências externas, como conexão de banco de dados, terminais http, bibliotecas de terceiros, etc., se houver.
Quando a função AWS Lambda é chamada pela primeira vez ou se a função lambda é atualizada, há pouca latência adicionada devido à configuração do contexto de execução. No entanto, as chamadas subsequentes são mais rápidas em comparação com a primeira. O AWS Lambda tenta reutilizar o contexto de execução novamente se a função Lambda for invocada levando menos tempo.
A reutilização do contexto de execução tem as seguintes implicações -
Se houver alguma conexão de banco de dados feita para a execução do Lambda, a conexão é mantida para reutilização. Portanto, o código Lambda deve ser tal que a conexão deve ser verificada primeiro - se existe e reutilizada; caso contrário, teremos que fazer uma nova conexão.
O contexto de execução mantém um espaço em disco de 500 MB em /tmpdiretório. Os dados necessários são armazenados em cache neste diretório. Você pode ter uma verificação adicional no código para ver se os dados existem.
Se os retornos de chamada ou alguns processos de segundo plano não forem concluídos quando a função Lambda for chamada, a execução será iniciada quando a função lambda for chamada novamente. Caso você não precise que tal coisa aconteça certifique-se de que seus processos estejam todos finalizados corretamente, quando a execução da função for concluída.
Você deve usar o contexto de execução e os dados armazenados no diretório tmp. Você terá que adicionar as verificações necessárias no código para ver se os dados necessários existem antes de criar novos. Isso economizará tempo durante a execução e a tornará mais rápida.
Invocar a função AWS Lambda
Podemos invocar AWS manualmente usando aws cli. Já vimos como criar e implantar AWS Lambda usandocli. Aqui, vamos primeiro criar uma função usandoaws cli e invocar o mesmo.
Criação da função AWS Lambda usando AWS CLI
Você pode usar os seguintes comandos para criar a função AWS Lambda usando aws cli -
Commands
create-function
--function-name <value>
--runtime <value>
--role <value>
--handler <value>
[--code <value>]
[--description <value>]
[--timeout <value>]
[--memory-size <value>]
[--environment <value>]
[--kms-key-arn <value>]
[--tags <value>]
[--zip-file <value>]
[--cli-input-json <value>]
Command with values
aws lambda create-function
--function-name "lambdainvoke"
--runtime "nodejs8.10"
--role "arn:aws:iam::625297745038:role/lambdaapipolicy"
--handler "index.handler"
--timeout 5
--memory-size 256
--zip-file "fileb://C:\nodeproject\index.zip"
O resultado é mostrado abaixo -
A função criada no console AWS é mostrada abaixo -
Agora, você pode invocar a função usando o comando:invoke
--function-name <value>
[--invocation-type <value>]
[--log-type <value>]
[--client-context <value>]
[--payload <value>]
[--qualifier <value>]
outfile <value>
Options
--function-name − Especifique o nome da função que você deseja chamar.
--invocation-type(string) − por padrão, o tipo de invocação é requestresponse. Os valores disponíveis para serem usados com o tipo de invocação sãoRequestResponse, Event e DryRun.
O tipo de invocação de evento deve ser usado para resposta assíncrona.
DryRun deve ser usado quando você deseja verificar a função Lambda sem a necessidade de executá-la.
--log-type − Será Tailse o tipo de chamada for RequestResponse. Ele fornece os últimos dados de registro codificados em base 64 de 4 KB. Os valores possíveis sãoTail e None.
--client-context −Você pode passar detalhes específicos do cliente para a função Lambda. O clientcontext deve estar no formato json e codificado em base64. O tamanho máximo do arquivo é de 3583 bytes.
--payload − entrada de formato json para sua função lambda.
--qualifier −Você pode especificar a versão da função Lambda ou o nome do alias. Se você passar a versão da função, a api usará a função qualificada arn para invocar a função Lambda. Se você especificar o nome do alias, a api usa o alias ARN para invocar a função Lambda.
outfile − Este é o nome do arquivo onde o conteúdo será salvo.
Command with values
aws lambda invoke --function-name "lambdainvoke" --log-type
Tail C:\nodeproject\outputfile.txt
Você pode usar a opção de carga útil para enviar evento fictício para a função lambda no formato json, conforme mostrado abaixo.
O código AWS Lambda relacionado é o seguinte -
exports.handler = async (event, callback) => {
console.log("Hello => "+ event.name);
console.log("Address =>"+ event.addr);
callback(null, 'Hello '+event.name +" and address is "+ event.addr);
};
Observe que no código, temos console event.name e event.addr. Agora, vamos usar a opção de carga útil em aws cli para enviar o evento com nome e endereço da seguinte forma -
aws lambda invoke --function-name "lambdainvoke" --log-type
Tail --payload file://C:\clioutput\input.txt C:\clioutput\outputfile.txt
Thenpayload leva entrada como um caminho de arquivo que tem entrada json como mostrado -
{"name":"Roy Singh", "addr":"Mumbai"}
A saída correspondente é mostrada abaixo -
A saída é armazenada no arquivo C:\clioutput\outputfile.txt como segue -
"Hello Roy Singh and address is Mumbai"
Eventos de amostra
Você pode testar a função do AWS Lambda passando um evento de amostra. Esta seção fornece alguns exemplos de eventos para serviços da AWS. Você pode usar oinvokecomando para testar a saída quando acionado com qualquer um dos serviços. Observe os códigos fornecidos para os eventos de amostra correspondentes abaixo -
Amazon S3 Put Sample Event
{
"Records": [{
"eventVersion": "2.0",
"eventTime": "1970-01-01T00:00:00.000Z",
"requestParameters": {
"SourceIPAddress": "127.0.0.1"
},
"s3": {
"configurationId": "testConfigRule",
"object": {
"eTag": "0123456789abcdef0123456789abcdef",
"sequencer": "0A1B2C3D4E5F678901",
"key": "HappyFace.jpg",
"size": 1024
},
"bucket": {
"arn": bucketarn,
"name": "Sourcebucket",
"ownerIdentity": {
"principalId": "EXAMPLE"
}
},
"s3SchemaVersion": "1.0"
},
"responseElements": {
"x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH",
"x-amz-request-id": "EXAMPLE123456789"
},
"awsRegion": "us-east-1",
"eventName": "ObjectCreated:Put",
"userIdentity": {
"principalId": "EXAMPLE"
},
"eventSource": "aws:s3"
}]
}
Para obter o details of the file from the s3 put event, você pode usar o seguinte comando -
event.Records[0].s3.object.key //will display the name of the file
Para get the bucket name, você pode usar o seguinte comando -
event.Records[0].s3.bucket.name //will give the name of the bucket.
Para see the EventName, você pode usar o seguinte comando -
event.Records[0].eventName // will display the eventname
Amazon S3 Delete Sample Event
{
"Records": [{
"eventVersion": "2.0",
"eventTime": "1970-01-01T00:00:00.000Z",
"requestParameters": {
"SourceIPAddress": "127.0.0.1"
},
"s3": {
"configurationId": "testConfigRule",
"object": {
"sequencer": "0A1B2C3D4E5F678901",
"key": "HappyFace.jpg"
},
"bucket": {
"arn": bucketarn,
"name": "Sourcebucket",
"ownerIdentity": {
"principalId": "EXAMPLE"
}
},
"s3SchemaVersion": "1.0"
},
"responseElements": {
"x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH",
"x-amz-request-id": "EXAMPLE123456789"
},
"awsRegion": "us-east-1",
"eventName": "ObjectRemoved:Delete",
"userIdentity": {
"principalId": "EXAMPLE"
},
"eventSource": "aws:s3"
}]
}
Amazon DynamoDB
O Amazon DynamoDB pode ser um evento no AWS Lambda quando alterações são feitas na tabela do DynamoDB. Podemos realizar operações como adicionar entrada, atualizar e excluir registros da tabela DynamodDB.
Um exemplo de evento para adicionar, inserir e excluir eventos do DynamoDB é mostrado aqui -
{
"Records": [{
"eventID": "1",
"eventVersion": "1.0",
"dynamodb": {
"Keys": {
"Id": {
"N": "101"
}
},
"NewImage": {
"Message": {
"S": "New item!"
},
"Id": {
"N": "101"
}
},
"StreamViewType": "NEW_AND_OLD_IMAGES",
"SequenceNumber": "111",
"SizeBytes": 26
},
"awsRegion": "us-west-2",
"eventName": "INSERT",
"eventSourceARN": eventSourcearn,
"eventSource": "aws:dynamodb"
},
{
"eventID": "2",
"eventVersion": "1.0",
"dynamodb": {
"OldImage": {
"Message": {
"S": "New item!"
},
"Id": {
"N": "101"
}
},
"SequenceNumber": "222",
"Keys": {
"Id": {
"N": "101"
}
},
"SizeBytes": 59,
"NewImage": {
"Message": {
"S": "This item has changed"
},
"Id": {
"N": "101"
}
},
"StreamViewType": "NEW_AND_OLD_IMAGES"
},
"awsRegion": "us-west-2",
"eventName": "MODIFY",
"eventSourceARN": Sourcearn,
"eventSource": "aws:dynamodb"
},
{
"eventID": "3",
"eventVersion": "1.0",
"dynamodb": {
"Keys": {
"Id": {
"N": "101"
}
},
"SizeBytes": 38,
"SequenceNumber": "333",
"OldImage": {
"Message": {
"S": "This item has changed"
},
"Id": {
"N": "101"
}
},
"StreamViewType": "NEW_AND_OLD_IMAGES"
}, "awsRegion": "us-west-2",
"eventName": "REMOVE",
"eventSourceARN": Sourcearn,
"eventSource": "aws:dynamodb"
}]
}
Amazon Simple Notification Service
O AWS Lambda pode ser útil para processar a notificação criada em Simple Notification Service (SNS). Sempre que houver mensagem publicada no SNS, a função Lambda pode ser acionada com um evento SNS, que contém os detalhes das mensagens. Essas mensagens podem ser processadas dentro da função Lambda e podem ser enviadas posteriormente para outros serviços de acordo com a necessidade.
Assim que a mensagem for inserida, o SNS acionará a função Lambda. Se algum erro tentar chamar a função Lambda, o SNS tentará novamente chamar a função lambda até três vezes.
Evento de amostra do Amazon SNS
Um exemplo de evento que tem todos os detalhes disponíveis na função AWS Lambda para realizar o processo adicional é mostrado abaixo -
{
"Records": [{
"EventVersion": "1.0",
"EventSubscriptionArn": eventsubscriptionarn,
"EventSource": "aws:sns",
"Sns": {
"SignatureVersion": "1",
"Timestamp": "1970-01-01T00:00:00.000Z",
"Signature": "EXAMPLE",
"SigningCertUrl": "EXAMPLE",
"MessageId": "95df01b4-ee98-5cb9-9903-4c221d41eb5e",
"Message": "Hello from SNS!",
"MessageAttributes": {
"Test": {
"Type": "String",
"Value": "TestString"
},
"TestBinary": {
"Type": "Binary",
"Value": "TestBinary"
}
},
"Type": "Notification",
"UnsubscribeUrl": "EXAMPLE",
"TopicArn": topicarn,
"Subject": "TestInvoke"
}
}]
}
Amazon Simple Mail Service
O Amazon Simple Mail Service pode ser usado para enviar e receber mensagens. A função AWS Lambda pode ser chamada no Simple Mail Service quando a mensagem é recebida.
Exemplo de evento de recebimento de e-mail do Amazon SES
Os detalhes do evento SES quando usado dentro do AWS Lambda são mostrados abaixo -
{
"Records": [{
"eventVersion": "1.0",
"ses": {
"mail": {
"commonHeaders": {
"from": [
"Jane Doe <[email protected]>"
],
"to": [
"[email protected]"
],
"returnPath": "[email protected]",
"messageId": "<0123456789Source.com>",
"date": "Wed, 7 Oct 2015 12:34:56 -0700",
"subject": "Test Subject"
},
"example": "[email protected]",
"timestamp": "1970-01-01T00:00:00.000Z",
"destination": [
"[email protected]"
],
"headers": [{
"name": "Return-Path",
"value": "<[email protected]>"
},
{
"name": "Received",
"value": "from mailer.example.com (mailer.example.com [203.0.113.1]) by inbound-smtp.us-west-2.amazonaws.com with SMTP id o3vrnil0e2ic for [email protected]; Wed, 07 Oct 2015 12:34:56 +0000 (UTC)"
},
{
"name": "DKIM-Signature",
"value": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=example.com; s=example; h=mime-version:from:date:message-id:subject:to:content-type; bh=jX3F0bCAI7sIbkHyy3mLYO28ieDQz2R0P8HwQkklFj4=; b=sQwJ+LMe9RjkesGu+vqU56asvMhrLRRYrWCbV"
},
{
"name": "MIME-Version",
"value": "1.0"
},
{
"name": "From",
"value": "Jane Doe <[email protected]>"
},
{
"name": "Date",
"value": "Wed, 7 Oct 2015 12:34:56 -0700"
},
{
"name": "Message-ID",
"value": "<0123456789example.com>"
},
{
"name": "Subject",
"value": "Test Subject"
},
{
"name": "To",
"value": "[email protected]"
},
{
"name": "Content-Type",
"value": "text/plain; charset=UTF-8"
}],
"headersTruncated": false,
"messageId": "o3vrnil0e2ic28tr"
},
"receipt": {
"recipients": [
"[email protected]"
],
"timestamp": "1970-01-01T00:00:00.000Z",
"spamVerdict": {
"status": "PASS"
},
"dkimVerdict": {
"status": "PASS"
},
"processingTimeMillis": 574,
"action": {
"type": "Lambda",
"invocationType": "Event",
"functionArn": "arn:aws:lambda:us-west-2:012345678912:function:example"
},
"spfVerdict": {
"status": "PASS"
},
"virusVerdict": {
"status": "PASS"
}
}
},
"eventexample": "aws:ses"
}]
}
Amazon Cloudwatch Logs
O AWS Lambda pode ser acionado a partir do Amazon CloudWatch Logs usando o CloudWatch Logs Subscriptions. As assinaturas do CloudWatch Logs têm dados em tempo real sobre os logs que podem ser processados e analisados dentro do AWS Lambda ou podem ser usados para carregar em outros sistemas.
Amazon CloudWatch Logs Sample Event
{
"awslogs": {
"data": "H4sIAAAAAAAAAHWPwQqCQBCGX0Xm7EFtK+smZBEUgXoLCdMhFtKV3akI8d0bLYmibvPPN3wz00CJxmQnTO41whwW
QRIctmEcB6sQbFC3CjW3XW8kxpOpP+OC22d1Wml1qZkQGtoMsScxaczKN3plG8zlaHIta5KqWsozoTYw3/djzwhpL
wivWFGHGpAFe7DL68JlBUk+l7KSN7tCOEJ4M3/qOI49vMHj+zCKdlFqLaU2ZHV2a4Ct/an0/ivdX8oYc1UVX860fQ
DQiMdxRQEAAA=="
}
}
Amazon API Gateway
A função AWS Lambda pode ser invocada em httpsurl. TI pode ser feito emGET, POST, PUT. Quando o URL https é invocado, a função AWS Lambda também é acionada e os dados passados para https usando get / post podem ser disponibilizados dentro do AWS Lambda para serem usados para inserir no DynamoDB ou enviar e-mail, etc.
Evento de solicitação de proxy de gateway de API
{
"path": "/test/hello",
"headers": {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Accept-Encoding": "gzip, deflate, lzma, sdch, br",
"Accept-Language": "en-US,en;q=0.8",
"CloudFront-Forwarded-Proto": "https",
"CloudFront-Is-Desktop-Viewer": "true",
"CloudFront-Is-Mobile-Viewer": "false",
"CloudFront-Is-SmartTV-Viewer": "false",
"CloudFront-Is-Tablet-Viewer": "false",
"CloudFront-Viewer-Country": "US",
"Host": "wt6mne2s9k.execute-api.us-west-2.amazonaws.com",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36 OPR/39.0.2256.48",
"Via": "1.1 fb7cca60f0ecd82ce07790c9c5eef16c.cloudfront.net (CloudFront)",
"X-Amz-Cf-Id": "nBsWBOrSHMgnaROZJK1wGCZ9PcRcSpq_oSXZNQwQ10OTZL4cimZo3g==",
"X-Forwarded-For": "192.168.100.1, 192.168.1.1",
"X-Forwarded-Port": "443",
"X-Forwarded-Proto": "https"
},
"pathParameters": {
"proxy": "hello"
},
"requestContext": {
"accountId": "123456789012",
"reexampleId": "us4z18",
"stage": "test",
"requestId": "41b45ea3-70b5-11e6-b7bd-69b5aaebc7d9",
"identity": {
"cognitoIdentityPoolId": "",
"accountId": "",
"cognitoIdentityId": "",
"caller": "",
"apiKey": "",
"exampleIp": "192.168.100.1",
"cognitoAuthenticationType": "",
"cognitoAuthenticationProvider": "",
"userArn": "",
"userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36 OPR/39.0.2256.48",
"user": ""
},
"reexamplePath": "/{proxy+}",
"httpMethod": "GET",
"apiId": "wt6mne2s9k"
},
"reexample": "/{proxy+}",
"httpMethod": "GET",
"queryStringParameters": {
"name": "me"
},
"stageVariables": {
"stageVarName": "stageVarValue"
}
}
Evento de resposta de proxy de gateway de API
{
"statusCode": 200,
"headers": {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Accept-Encoding": "gzip, deflate, lzma, sdch, br",
"Accept-Language": "en-US,en;q=0.8",
"CloudFront-Forwarded-Proto": "https",
"CloudFront-Is-Desktop-Viewer": "true",
"CloudFront-Is-Mobile-Viewer": "false",
"CloudFront-Is-SmartTV-Viewer": "false",
"CloudFront-Is-Tablet-Viewer": "false",
"CloudFront-Viewer-Country": "US",
"Host": "wt6mne2s9k.execute-api.us-west-2.amazonaws.com",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36 OPR/39.0.2256.48",
"Via": "1.1 fb7cca60f0ecd82ce07790c9c5eef16c.cloudfront.net (CloudFront)",
"X-Amz-Cf-Id": "nBsWBOrSHMgnaROZJK1wGCZ9PcRcSpq_oSXZNQwQ10OTZL4cimZo3g==",
"X-Forwarded-For": "192.168.100.1, 192.168.1.1",
"X-Forwarded-Port": "443",
"X-Forwarded-Proto": "https"
},
"body": "Hello World"
}