Wykonywanie i wywoływanie funkcji Lambda
W tym rozdziale wyjaśniono szczegółowo proces wykonywania i wywoływania funkcji Lambda oraz kroki z tym związane.
Model wykonania AWS Lambda
Wykonanie AWS zależy od szczegółów konfiguracji dodanych dla funkcji AWS Lambda. Po utworzeniu funkcji istnieje plikmemory i time allotted, który jest używany do wykonywania funkcji AWS Lambda.
Za pomocą szczegółów konfiguracji AWS Lambda tworzy kontekst wykonania. Kontekst wykonania to tymczasowe środowisko uruchomieniowe, które jest przygotowane z wszelkimi zewnętrznymi zależnościami, takimi jak połączenie z bazą danych, punkty końcowe http, biblioteki stron trzecich itp., Jeśli takie istnieją.
Gdy funkcja AWS Lambda jest wywoływana po raz pierwszy lub jeśli funkcja lambda jest aktualizowana, dodaje się niewielkie opóźnienie ze względu na konfigurację kontekstu wykonania. Jednak kolejne wywołania są szybsze w porównaniu do pierwszego. AWS Lambda próbuje ponownie użyć kontekstu wykonania, jeśli funkcja Lambda jest wywoływana w krótszym czasie.
Ponowne użycie kontekstu wykonania ma następujące konsekwencje -
Jeśli istnieje połączenie z bazą danych w celu wykonania Lambda, połączenie jest utrzymywane do ponownego wykorzystania. Zatem kod Lambda musi być taki, że połączenie musi być najpierw sprawdzone - jeśli istnieje i zostanie ponownie użyte; w przeciwnym razie będziemy musieli nawiązać nowe połączenie.
Kontekst wykonania zachowuje miejsce na dysku 500 MB w formacie /tmpinformator. Wymagane dane są przechowywane w tym katalogu. Możesz dodatkowo sprawdzić kod, aby sprawdzić, czy dane istnieją.
Jeśli wywołania zwrotne lub niektóre procesy w tle nie są kompletne w momencie wywołania funkcji Lambda, wykonanie rozpocznie się po ponownym wywołaniu funkcji lambda. Jeśli nie potrzebujesz, aby coś takiego się wydarzyło, upewnij się, że wszystkie procesy zostały poprawnie zakończone po zakończeniu wykonywania funkcji.
Powinieneś użyć kontekstu wykonania i danych przechowywanych w katalogu tmp. Będziesz musiał dodać niezbędne sprawdzenia w kodzie, aby sprawdzić, czy wymagane dane istnieją przed utworzeniem nowych nowych. Pozwoli to zaoszczędzić czas podczas wykonywania i przyspieszyć.
Wywołanie funkcji AWS Lambda
Możemy wywołać AWS ręcznie za pomocą aws cli. Widzieliśmy już, jak tworzyć i wdrażać AWS Lambda przy użyciucli. Tutaj najpierw utworzymy funkcję za pomocąaws cli i przywołaj to samo.
Tworzenie funkcji AWS Lambda przy użyciu interfejsu AWS CLI
Możesz użyć następujących poleceń do tworzenia funkcji AWS Lambda za pomocą 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"
Wyjście jest jak pokazano poniżej -
Funkcja utworzona w konsoli AWS jest pokazana poniżej -
Teraz możesz wywołać funkcję za pomocą polecenia:invoke
--function-name <value>
[--invocation-type <value>]
[--log-type <value>]
[--client-context <value>]
[--payload <value>]
[--qualifier <value>]
outfile <value>
Options
--function-name − Podaj nazwę funkcji, którą chcesz wywołać.
--invocation-type(string) − domyślnie typem wywołania jest requestresponse. Dostępne wartości do użycia z typem wywołania toRequestResponse, Event i DryRun.
Typ wywołania zdarzenia ma być używany do odpowiedzi asynchronicznej.
DryRun jest używany, gdy chcesz zweryfikować funkcję Lambda bez konieczności jej wykonywania.
--log-type − To będzie Tailjeśli typ wywołania to RequestResponse. Daje ostatnie dane dziennika zakodowane w formacie base64 4KB. Możliwe wartości toTail i None.
--client-context −Możesz przekazać dane klienta do funkcji Lambda. Kontekst klienta musi być w formacie json i zakodowany w formacie base64. Maksymalny rozmiar pliku to 3583 bajty.
--payload − JSON do funkcji lambda.
--qualifier −Możesz określić wersję funkcji Lambda lub nazwę aliasu. Jeśli przekażesz wersję funkcji, api użyje kwalifikowanej funkcji arn do wywołania funkcji Lambda. Jeśli określisz nazwę aliasu, interfejs API użyje aliasu ARN do wywołania funkcji Lambda.
outfile − To jest nazwa pliku, w którym zawartość zostanie zapisana.
Command with values
aws lambda invoke --function-name "lambdainvoke" --log-type
Tail C:\nodeproject\outputfile.txt
Możesz użyć opcji ładunku, aby wysłać fikcyjne zdarzenie do funkcji lambda w formacie json, jak pokazano poniżej.
Powiązany kod AWS Lambda jest następujący -
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);
};
Zwróć uwagę, że w kodzie mamy konsolę event.name i event.addr. Teraz użyjmy opcji ładunku w aws cli, aby wysłać zdarzenie z nazwą i adresem w następujący sposób -
aws lambda invoke --function-name "lambdainvoke" --log-type
Tail --payload file://C:\clioutput\input.txt C:\clioutput\outputfile.txt
Thenpayload przyjmuje dane wejściowe jako ścieżkę pliku, która ma dane wejściowe json, jak pokazano -
{"name":"Roy Singh", "addr":"Mumbai"}
Odpowiednie wyjście jest pokazane poniżej -
Dane wyjściowe są przechowywane w pliku C:\clioutput\outputfile.txt w następujący sposób -
"Hello Roy Singh and address is Mumbai"
Przykładowe wydarzenia
Możesz przetestować funkcję AWS Lambda, przekazując przykładowe zdarzenie. Ta sekcja zawiera przykładowe zdarzenia dla usług AWS. Możesz użyćinvokepolecenie, aby przetestować dane wyjściowe po uruchomieniu za pomocą dowolnej usługi. Przestrzegaj kodów podanych poniżej dla odpowiednich przykładowych zdarzeń -
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"
}]
}
Aby uzyskać details of the file from the s3 put event, możesz użyć następującego polecenia -
event.Records[0].s3.object.key //will display the name of the file
Do get the bucket name, możesz użyć następującego polecenia -
event.Records[0].s3.bucket.name //will give the name of the bucket.
Do see the EventName, możesz użyć następującego polecenia -
event.Records[0].eventName // will display the eventname
Amazon S3 Usuń przykładowe zdarzenie
{
"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 może być zdarzeniem w AWS Lambda, gdy zmiany są dokonywane w tabeli DynamoDB. Możemy wykonywać operacje takie jak dodawanie, aktualizowanie i usuwanie rekordów z tabeli DynamodDB.
Przykładowe zdarzenie dodawania, wstawiania i usuwania zdarzenia DynamoDB jest pokazane tutaj -
{
"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 może być pomocna w przetwarzaniu powiadomienia utworzonego w Simple Notification Service (SNS). Zawsze, gdy w SNS pojawia się wiadomość, funkcja Lambda może zostać wyzwolona zdarzeniem SNS, które zawiera szczegóły wiadomości. Te komunikaty mogą być przetwarzane wewnątrz funkcji Lambda i mogą być wysyłane dalej do innych usług zgodnie z wymaganiami.
Po wpisaniu wiadomości SNS uruchomi funkcję Lambda. Jeśli jakikolwiek błąd spróbuje wywołać funkcję Lambda, SNS ponowi próbę wywołania funkcji lambda maksymalnie trzy razy.
Przykładowe wydarzenie Amazon SNS
Przykładowe zdarzenie, które ma wszystkie szczegóły dostępne w funkcji AWS Lambda do przeprowadzenia dalszego procesu, pokazano poniżej -
{
"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
Usługa Amazon Simple Mail Service może służyć do wysyłania i odbierania wiadomości. Funkcję AWS Lambda można wywołać w Simple Mail Service po odebraniu wiadomości.
Przykładowe zdarzenie dotyczące odbierania wiadomości e-mail Amazon SES
Szczegóły zdarzenia SES podczas używania wewnątrz AWS Lambda pokazano poniżej -
{
"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"
}]
}
Dzienniki Amazon Cloudwatch
AWS Lambda można wyzwolić z dzienników Amazon CloudWatch przy użyciu rozszerzenia CloudWatch Logs Subscriptions. Subskrypcje CloudWatch Logs zawierają dane w czasie rzeczywistym o logach, które mogą być przetwarzane i analizowane w AWS Lambda lub mogą być użyte do załadowania do innych systemów.
Przykładowe zdarzenie Amazon CloudWatch Logs
{
"awslogs": {
"data": "H4sIAAAAAAAAAHWPwQqCQBCGX0Xm7EFtK+smZBEUgXoLCdMhFtKV3akI8d0bLYmibvPPN3wz00CJxmQnTO41whwW
QRIctmEcB6sQbFC3CjW3XW8kxpOpP+OC22d1Wml1qZkQGtoMsScxaczKN3plG8zlaHIta5KqWsozoTYw3/djzwhpL
wivWFGHGpAFe7DL68JlBUk+l7KSN7tCOEJ4M3/qOI49vMHj+zCKdlFqLaU2ZHV2a4Ct/an0/ivdX8oYc1UVX860fQ
DQiMdxRQEAAA=="
}
}
Amazon API Gateway
Funkcję AWS Lambda można wywołać na httpsurl. Można to zrobić dalejGET, POST, PUT. Kiedy adres URL https jest wywoływany, uruchamiana jest również funkcja AWS Lambda, a dane przekazywane do https za pomocą get / post mogą być udostępniane wewnątrz AWS Lambda w celu ich wstawienia do DynamoDB lub wysłania poczty itp.
Zdarzenie żądania API Gateway Proxy
{
"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"
}
}
Zdarzenie odpowiedzi serwera proxy bramy interfejsu 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"
}