Esecuzione e richiamo della funzione Lambda
Questo capitolo spiegherà in dettaglio il processo di esecuzione e invocazione della funzione Lambda e i passaggi coinvolti in esso.
Modello di esecuzione di AWS Lambda
L'esecuzione di AWS dipende dai dettagli di configurazione aggiunti per la funzione AWS Lambda. Quando la funzione viene creata, è presente un filememory e time allotted, che viene utilizzato per l'esecuzione della funzione AWS Lambda.
Con l'aiuto dei dettagli di configurazione, AWS Lambda crea un contesto di esecuzione. Il contesto di esecuzione è un ambiente di runtime temporaneo che è predisposto con eventuali dipendenze esterne come connessione al database, endpoint http, librerie di terze parti ecc., Se presenti.
Quando la funzione AWS Lambda viene richiamata per la prima volta o se la funzione lambda viene aggiornata, viene aggiunta poca latenza a causa della configurazione del contesto di esecuzione. Tuttavia, le chiamate successive sono più veloci rispetto alla prima. AWS Lambda tenta di riutilizzare nuovamente il contesto di esecuzione se la funzione Lambda viene richiamata impiegando meno tempo.
Il riutilizzo del contesto di esecuzione ha le seguenti implicazioni:
Se è presente una connessione al database eseguita per l'esecuzione di Lambda, la connessione viene mantenuta per il riutilizzo. Quindi il codice Lambda deve essere tale che la connessione deve essere prima controllata - se esiste e riutilizzata; altrimenti dovremo creare una nuova connessione.
Il contesto di esecuzione mantiene uno spazio su disco di 500 MB in formato /tmpdirectory. I dati richiesti vengono memorizzati nella cache in questa directory. Puoi avere un controllo aggiuntivo nel codice per vedere se i dati esistono.
Se i callback o alcuni processi in background non sono completi quando è stata richiamata la funzione Lambda, l'esecuzione inizierà quando la funzione lambda verrà nuovamente richiamata. Nel caso in cui non sia necessario che ciò accada, assicurati che i tuoi processi siano tutti terminati correttamente, quando l'esecuzione della funzione è completa.
È necessario utilizzare il contesto di esecuzione e i dati memorizzati nella directory tmp. Dovrai aggiungere i controlli necessari nel codice per vedere se i dati richiesti esistono prima di crearne di nuovi. Ciò consentirà di risparmiare tempo durante l'esecuzione e di renderlo più veloce.
Richiamo della funzione AWS Lambda
Possiamo richiamare AWS manualmente utilizzando aws cli. Abbiamo già visto come creare e distribuire AWS Lambda utilizzandocli. Qui creeremo prima una funzione usandoaws cli e invoca lo stesso.
Creazione della funzione AWS Lambda utilizzando AWS CLI
Puoi utilizzare i seguenti comandi per creare la funzione AWS Lambda utilizzando 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"
L'output è come mostrato di seguito:
La funzione creata nella console AWS è come mostrato di seguito:
Ora puoi richiamare la funzione usando il comando:invoke
--function-name <value>
[--invocation-type <value>]
[--log-type <value>]
[--client-context <value>]
[--payload <value>]
[--qualifier <value>]
outfile <value>
Options
--function-name − Specificare il nome della funzione che si desidera richiamare.
--invocation-type(string) − per impostazione predefinita, il tipo di invocazione è requestresponse. I valori disponibili per essere utilizzati con invokation-type sonoRequestResponse, Event e DryRun.
Il tipo di chiamata dell'evento deve essere utilizzato per la risposta asincrona.
DryRun è da utilizzare quando si desidera verificare la funzione Lambda senza necessità di eseguirla.
--log-type − Sarà Tailse il tipo di chiamata è RequestResponse. Fornisce gli ultimi dati di registro con codifica base 64 4KB. I valori possibili sonoTail e None.
--client-context −È possibile trasmettere dettagli specifici del client alla funzione Lambda. Il clientcontext deve essere in formato json e con codifica base64. La dimensione massima del file è 3583 byte.
--payload − input in formato json alla funzione lambda.
--qualifier −È possibile specificare la versione della funzione Lambda o il nome alias. Se si passa la versione della funzione, l'API utilizzerà la funzione qualificata arn per richiamare la funzione Lambda. Se specifichi un nome alias, l'API utilizza l'alias ARN per richiamare la funzione Lambda.
outfile − Questo è il nome del file in cui verrà salvato il contenuto.
Command with values
aws lambda invoke --function-name "lambdainvoke" --log-type
Tail C:\nodeproject\outputfile.txt
È possibile utilizzare l'opzione payload per inviare un evento fittizio alla funzione lambda in formato json come mostrato di seguito.
Il codice AWS Lambda correlato è il seguente:
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);
};
Osserva che nel codice abbiamo la console event.name e event.addr. Ora, usiamo l'opzione payload in aws cli per inviare l'evento con nome e indirizzo come segue:
aws lambda invoke --function-name "lambdainvoke" --log-type
Tail --payload file://C:\clioutput\input.txt C:\clioutput\outputfile.txt
Quindi payload prende l'input come un percorso file che ha l'input json come mostrato -
{"name":"Roy Singh", "addr":"Mumbai"}
L'output corrispondente è come mostrato di seguito:
L'output viene memorizzato nel file C:\clioutput\outputfile.txt come segue -
"Hello Roy Singh and address is Mumbai"
Eventi di esempio
Puoi testare la funzione AWS Lambda passando un evento di esempio. Questa sezione fornisce alcuni eventi di esempio per i servizi AWS. Puoi usare il fileinvokecomando per testare l'output quando attivato con uno dei servizi. Osservare i codici forniti per gli eventi di esempio corrispondenti di seguito:
Evento di esempio Put di 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"
}]
}
Prendere il details of the file from the s3 put event, puoi usare il seguente comando:
event.Records[0].s3.object.key //will display the name of the file
Per get the bucket name, puoi usare il seguente comando:
event.Records[0].s3.bucket.name //will give the name of the bucket.
Per see the EventName, puoi usare il seguente comando:
event.Records[0].eventName // will display the eventname
Amazon S3 Elimina evento di esempio
{
"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 può essere un evento su AWS Lambda quando vengono apportate modifiche alla tabella DynamoDB. Possiamo eseguire operazioni come aggiungere voci, aggiornare ed eliminare record dalla tabella DynamodDB.
Un esempio di evento per l'aggiunta, l'inserimento e l'eliminazione di DynamoDB viene mostrato qui:
{
"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
AWS Lambda può essere utile per elaborare la notifica creata in Simple Notification Service (SNS). Ogni volta che c'è un messaggio pubblicato in SNS, la funzione Lambda può essere attivata con un evento SNS, che contiene i dettagli dei messaggi. Questi messaggi possono essere elaborati all'interno della funzione Lambda e possono essere inviati ulteriormente ad altri servizi secondo il requisito.
Una volta inserito il messaggio, SNS attiverà la funzione Lambda. Se un errore tenta di richiamare la funzione Lambda, SNS riproverà a chiamare la funzione lambda fino a tre volte.
Evento di esempio Amazon SNS
Di seguito è mostrato un evento di esempio che ha tutti i dettagli disponibili nella funzione AWS Lambda per eseguire l'ulteriore processo:
{
"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
Amazon Simple Mail Service può essere utilizzato per inviare messaggi e anche per ricevere messaggi. La funzione AWS Lambda può essere chiamata su Simple Mail Service quando viene ricevuto il messaggio.
Evento campione di ricezione di posta elettronica Amazon SES
I dettagli dell'evento SES quando utilizzato in AWS Lambda sono mostrati di seguito:
{
"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"
}]
}
Log di Amazon Cloudwatch
AWS Lambda può essere attivato da Amazon CloudWatch Logs utilizzando l'estensione CloudWatch Logs Subscriptions. Gli abbonamenti CloudWatch Logs contengono dati in tempo reale sui log che possono essere elaborati e analizzati all'interno di AWS Lambda o possono essere utilizzati per il caricamento su altri sistemi.
Evento di esempio di Amazon CloudWatch Logs
{
"awslogs": {
"data": "H4sIAAAAAAAAAHWPwQqCQBCGX0Xm7EFtK+smZBEUgXoLCdMhFtKV3akI8d0bLYmibvPPN3wz00CJxmQnTO41whwW
QRIctmEcB6sQbFC3CjW3XW8kxpOpP+OC22d1Wml1qZkQGtoMsScxaczKN3plG8zlaHIta5KqWsozoTYw3/djzwhpL
wivWFGHGpAFe7DL68JlBUk+l7KSN7tCOEJ4M3/qOI49vMHj+zCKdlFqLaU2ZHV2a4Ct/an0/ivdX8oYc1UVX860fQ
DQiMdxRQEAAA=="
}
}
Amazon API Gateway
La funzione AWS Lambda può essere richiamata su httpsurl. Può essere fattoGET, POST, PUT. Quando viene richiamato l'URL https, viene attivata anche la funzione AWS Lambda ei dati passati a https utilizzando get / post possono essere resi disponibili all'interno di AWS Lambda per essere utilizzati per l'inserimento in DynamoDB o per inviare posta, ecc.
Evento richiesta proxy 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 di risposta proxy 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"
}