Ejecución e invocación de la función Lambda

Este capítulo explicará en detalle sobre el proceso de ejecución e invocación de la función Lambda y los pasos involucrados en él.

Modelo de ejecución de AWS Lambda

La ejecución de AWS depende de los detalles de configuración agregados para la función AWS Lambda. Cuando se crea la función, hay unmemory y time allotted, que se utiliza para la ejecución de la función AWS Lambda.

Con la ayuda de los detalles de configuración, AWS Lambda crea un contexto de ejecución. El contexto de ejecución es un entorno de ejecución temporal que se prepara con cualquier dependencia externa, como conexión de base de datos, puntos finales http, bibliotecas de terceros, etc., si las hubiera.

Cuando se invoca la función AWS Lambda por primera vez o si se actualiza la función lambda, se agrega poca latencia debido a la configuración del contexto de ejecución. Sin embargo, las llamadas posteriores son más rápidas en comparación con la primera. AWS Lambda intenta reutilizar el contexto de ejecución nuevamente si se invoca la función Lambda en menos tiempo.

La reutilización del contexto de ejecución tiene las siguientes implicaciones:

  • Si se realiza alguna conexión a la base de datos para la ejecución de Lambda, la conexión se mantiene para su reutilización. Por lo tanto, el código Lambda debe ser tal que primero se debe verificar la conexión, si existe y reutilizarla; de lo contrario, tendremos que hacer una nueva conexión.

  • El contexto de ejecución mantiene un espacio en disco de 500 MB en /tmpdirectorio. Los datos necesarios se almacenan en caché en este directorio. Puede tener una verificación adicional en el código para ver si existen los datos.

  • Si las devoluciones de llamada o algunos procesos en segundo plano no están completos cuando se invocó la función Lambda, la ejecución comenzará cuando se vuelva a invocar la función lambda. En caso de que no necesite que esto suceda, asegúrese de que todos sus procesos finalicen correctamente, cuando se complete la ejecución de la función.

Debe utilizar el contexto de ejecución y los datos almacenados en el directorio tmp. Tendrá que agregar las comprobaciones necesarias en el código para ver si existen los datos requeridos antes de crear nuevos nuevos. Esto ahorrará tiempo durante la ejecución y la hará más rápida.

Invocación de la función AWS Lambda

Podemos invocar AWS manualmente usando aws cli. Ya hemos visto cómo crear e implementar AWS Lambda utilizandocli. Aquí, primero crearemos una función usandoaws cli e invocar el mismo.

Creación de la función AWS Lambda mediante la AWS CLI

Puede utilizar los siguientes comandos para crear la función AWS Lambda utilizando 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"

La salida es la que se muestra a continuación:

La función creada en la consola de AWS es la que se muestra a continuación:

Ahora, puede invocar la función usando el comando:invoke

--function-name <value>
[--invocation-type <value>]
[--log-type <value>]
[--client-context <value>]
[--payload <value>]
[--qualifier <value>]
outfile <value>

Options

--function-name − Especifique el nombre de la función que desea invocar.

--invocation-type(string) − por defecto, el tipo de invocación es requestresponse. Los valores disponibles para usar con el tipo de invocación sonRequestResponse, Event y DryRun.

  • El tipo de invocación de evento se utilizará para la respuesta asíncrona.

  • DryRun se debe utilizar cuando desee verificar la función Lambda sin necesidad de ejecutarla.

--log-type − Será Tailsi el tipo de invocación es RequestResponse. Proporciona los últimos datos de registro codificados en base64 de 4 KB. Los valores posibles sonTail y None.

--client-context −Puede pasar detalles específicos del cliente a la función Lambda. El contexto del cliente debe estar en formato json y codificado en base64. El tamaño máximo del archivo es 3583 bytes.

--payload − Entrada de formato json a su función lambda.

--qualifier −Puede especificar la versión de la función Lambda o el nombre de alias. Si pasa la versión de la función, la api usará la función calificada arn para invocar la función Lambda. Si especifica un nombre de alias, la API usa el ARN de alias para invocar la función Lambda.

outfile − Este es el nombre del archivo donde se guardará el contenido.

Command with values

aws lambda invoke --function-name "lambdainvoke" --log-type 
Tail C:\nodeproject\outputfile.txt

Puede usar la opción de carga útil para enviar un evento ficticio a la función lambda en formato json como se muestra a continuación.

El código de AWS Lambda relacionado es el siguiente:

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);
};

Observa que en el código tenemos consola event.name y event.addr. Ahora, usemos la opción de carga útil en aws cli para enviar el evento con el nombre y la dirección de la siguiente manera:

aws lambda invoke --function-name "lambdainvoke" --log-type 
Tail --payload file://C:\clioutput\input.txt C:\clioutput\outputfile.txt

Thenpayload toma la entrada como una ruta de archivo que tiene una entrada json como se muestra:

{"name":"Roy Singh", "addr":"Mumbai"}

La salida correspondiente es la que se muestra a continuación:

La salida se almacena en el archivo C:\clioutput\outputfile.txt como sigue -

"Hello Roy Singh and address is Mumbai"

Eventos de muestra

Puede probar la función de AWS Lambda pasando un evento de muestra. Esta sección proporciona algunos eventos de muestra para los servicios de AWS. Puedes usar elinvokecomando para probar la salida cuando se activa con cualquiera de los servicios. Observe los códigos dados para los eventos de muestra correspondientes a continuación:

Evento de muestra de envío de Amazon S3

{
  "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 obtener el details of the file from the s3 put event, puede usar el siguiente comando:

event.Records[0].s3.object.key   //will display the name of the file

A get the bucket name, puede usar el siguiente comando:

event.Records[0].s3.bucket.name  //will give the name of the bucket.

A see the EventName, puede usar el siguiente comando:

event.Records[0].eventName    // will display the eventname

Evento de muestra de eliminación de Amazon S3

{
   "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

Amazon DynamoDB puede ser un evento en AWS Lambda cuando se realizan cambios en la tabla de DynamoDB. Podemos realizar operaciones como agregar entrada, actualizar y eliminar registros de la tabla DynamodDB.

Aquí se muestra un evento de muestra para agregar, insertar y eliminar eventos de DynamoDB:

{
  "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"    
   }]
}

Servicio de notificación simple de Amazon

AWS Lambda puede resultar útil para procesar la notificación creada en Simple Notification Service (SNS). Siempre que haya un mensaje publicado en SNS, la función Lambda se puede activar con un evento SNS, que tiene detalles de los mensajes. Estos mensajes se pueden procesar dentro de la función Lambda y se pueden enviar a otros servicios según el requisito.

Una vez que se ingresa el mensaje, SNS activará la función Lambda. Si algún error intenta invocar la función Lambda, SNS volverá a intentar llamar a la función lambda hasta tres veces.

Evento de muestra de Amazon SNS

A continuación, se muestra un evento de muestra que tiene todos los detalles disponibles en la función AWS Lambda para llevar a cabo el proceso adicional:

{
  "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"
      }
   }]
}

Servicio de correo simple de Amazon

Amazon Simple Mail Service se puede utilizar para enviar mensajes y también para recibir mensajes. Se puede llamar a la función AWS Lambda en Simple Mail Service cuando se recibe el mensaje.

Evento de muestra de recepción de correo electrónico de Amazon SES

Los detalles del evento SES cuando se usa dentro de AWS Lambda se muestran a continuación:

{
  "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"
   }]
}

Registros de Amazon Cloudwatch

AWS Lambda se puede activar desde Amazon CloudWatch Logs mediante el CloudWatch Logs Subscriptions. Las suscripciones de CloudWatch Logs tienen datos en tiempo real sobre los registros que se pueden procesar y analizar dentro de AWS Lambda o se pueden usar para cargar en otros sistemas.

Evento de muestra de Amazon CloudWatch Logs

{
   "awslogs": {
      "data": "H4sIAAAAAAAAAHWPwQqCQBCGX0Xm7EFtK+smZBEUgXoLCdMhFtKV3akI8d0bLYmibvPPN3wz00CJxmQnTO41whwW
      QRIctmEcB6sQbFC3CjW3XW8kxpOpP+OC22d1Wml1qZkQGtoMsScxaczKN3plG8zlaHIta5KqWsozoTYw3/djzwhpL
      wivWFGHGpAFe7DL68JlBUk+l7KSN7tCOEJ4M3/qOI49vMHj+zCKdlFqLaU2ZHV2a4Ct/an0/ivdX8oYc1UVX860fQ
      DQiMdxRQEAAA=="
   }
}

Amazon API Gateway

La función AWS Lambda se puede invocar en httpsurl. Se puede hacer enGET, POST, PUT. Cuando se invoca la URL https, también se activa la función AWS Lambda y los datos pasados ​​a https mediante get / post pueden estar disponibles dentro de AWS Lambda para usarse para insertar en DynamoDB o enviar correo, etc.

Evento de solicitud de proxy de API Gateway

{
   "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 respuesta de proxy de API Gateway

{
   "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"
}