- AWS Lambda 教程
- AWS Lambda - 首頁
- AWS Lambda - 概述
- AWS Lambda - 環境設定
- AWS Lambda - 簡介
- 構建 Lambda 函式
- NODEJS 中的函式
- Java 中的函式
- Python 中的函式
- Go 中的函式
- C# 中的函式
- 配置 Lambda 函式
- 使用 AWS 控制檯建立和部署
- 使用 AWS CLI 建立和部署
- 使用 Serverless Framework 建立和部署
- AWS 執行和呼叫 Lambda 函式
- 刪除 Lambda 函式
- 使用 Amazon API Gateway
- 帶有 Amazon S3 的 Lambda 函式
- 帶有 Amazon DynamoDB 的 Lambda 函式
- 帶有計劃事件的 Lambda 函式
- 帶有 Amazon SNS 的 Lambda 函式
- 帶有 CloudTrail 的 Lambda 函式
- 帶有 Amazon Kinesis 的 Lambda 函式
- 帶有自定義使用者應用程式的 Lambda 函式
- AWS Lambda@Edge 與 CloudFront
- 使用 Cloudwatch 進行監控和故障排除
- AWS Lambda - 其他示例
- AWS Lambda 有用資源
- AWS Lambda - 快速指南
- AWS Lambda - 有用資源
- AWS Lambda - 討論
執行和呼叫 Lambda 函式
本章將詳細解釋執行和呼叫 Lambda 函式的過程以及其中涉及的步驟。
AWS Lambda 執行模型
AWS 執行取決於為 AWS Lambda 函式新增的配置詳細資訊。建立函式時,會分配記憶體和時間,用於執行 AWS Lambda 函式。
藉助配置詳細資訊,AWS Lambda 建立一個執行上下文。執行上下文是一個臨時的執行時環境,如果存在任何外部依賴項(例如資料庫連線、http 端點、第三方庫等),則會準備好這些依賴項。
當 AWS Lambda 函式第一次被呼叫或 Lambda 函式被更新時,由於執行上下文的設定,會增加一點延遲。但是,後續呼叫與第一個呼叫相比更快。如果呼叫 Lambda 函式所需時間較短,AWS Lambda 會嘗試再次重用執行上下文。
執行上下文的重用具有以下含義:
如果為 Lambda 的執行建立了任何資料庫連線,則會維護該連線以供重用。因此,Lambda 程式碼必須能夠首先檢查連線是否存在並進行重用;否則,我們將必須建立新的連線。
執行上下文在/tmp目錄中維護 500MB 的磁碟空間。所需資料快取在此目錄中。您可以在程式碼中新增其他檢查以檢視資料是否存在。
如果在呼叫 Lambda 函式時回撥或某些後臺程序尚未完成,則當再次呼叫 lambda 函式時,執行將開始。如果您不需要發生這種情況,請確保在函式執行完成後所有程序都已正確結束。
您應該使用執行上下文和儲存在 tmp 目錄中的資料。您將必須在程式碼中新增必要的檢查,以檢視所需資料是否存在,然後再建立新的資料。這將節省執行時間並使其更快。
呼叫 AWS Lambda 函式
我們可以使用aws cli手動呼叫 AWS。我們已經瞭解瞭如何使用cli建立和部署 AWS Lambda。在這裡,我們將首先使用aws cli建立一個函式並呼叫它。
使用 AWS CLI 建立 AWS Lambda 函式
您可以使用以下命令使用aws cli建立 AWS Lambda 函式:
命令
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>]
帶有值的命令
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"
輸出如下所示:
在 AWS 控制檯中建立的函式如下所示:
現在,您可以使用命令:invoke呼叫該函式。
--function-name <value> [--invocation-type <value>] [--log-type <value>] [--client-context <value>] [--payload <value>] [--qualifier <value>] outfile <value>
選項
--function-name −指定要呼叫的函式的名稱。
--invocation-type(string) −預設情況下,invokation-type 為requestresponse。可用於invokation-type的值為RequestResponse、Event和DryRun。
Event 呼叫型別用於非同步響應。
DryRun 用於在無需執行 Lambda 函式的情況下驗證它。
--log-type −如果呼叫型別為 RequestResponse,則它將為Tail。它提供最後 4KB 的 base64 編碼日誌資料。可能的值為Tail和None。
--client-context −您可以將特定於客戶端的詳細資訊傳遞給 Lambda 函式。clientcontext 必須採用 json 格式並進行 base64 編碼。最大檔案大小為 3583 位元組。
--payload −您 lambda 函式的 json 格式輸入。
--qualifier −您可以指定 Lambda 函式版本或別名名稱。如果您傳遞函式版本,則 api 將使用限定的函式 arn 呼叫 Lambda 函式。如果您指定別名名稱,則 api 使用別名 ARN 呼叫 Lambda 函式。
outfile −這是內容將儲存到的檔名。
帶有值的命令
aws lambda invoke --function-name "lambdainvoke" --log-type Tail C:\nodeproject\outputfile.txt
您可以使用 payload 選項以 json 格式向 lambda 函式傳送虛擬事件,如下所示。
相關的 AWS Lambda 程式碼如下:
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);
};
觀察程式碼中,我們有控制檯event.name和event.addr。現在,讓我們在 aws cli 中使用 payload 選項傳送帶有名稱和地址的事件,如下所示:
aws lambda invoke --function-name "lambdainvoke" --log-type Tail --payload file://C:\clioutput\input.txt C:\clioutput\outputfile.txt
然後payload 以檔案路徑作為輸入,該檔案路徑具有如下所示的 json 輸入:
{"name":"Roy Singh", "addr":"Mumbai"}
相應的輸出如下所示:
輸出儲存在檔案C:\clioutput\outputfile.txt中,如下所示:
"Hello Roy Singh and address is Mumbai"
示例事件
您可以透過傳遞示例事件來測試 AWS Lambda 函式。本節提供了一些 AWS 服務的示例事件。您可以使用invoke命令在使用任何服務觸發時測試輸出。請觀察下面為相應示例事件提供的程式碼:
Amazon S3 Put 示例事件
{
"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"
}]
}
要獲取來自 s3 put 事件的檔案詳細資訊,您可以使用以下命令:
event.Records[0].s3.object.key //will display the name of the file
要獲取儲存桶名稱,您可以使用以下命令:
event.Records[0].s3.bucket.name //will give the name of the bucket.
要檢視 EventName,您可以使用以下命令:
event.Records[0].eventName // will display the eventname
Amazon S3 Delete 示例事件
{
"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
當對 DynamoDB 表進行更改時,Amazon DynamoDB 可以成為 AWS Lambda 上的事件。我們可以執行諸如新增條目、更新和從 DynamodDB 表中刪除記錄等操作。
此處顯示了 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"
}]
}
Amazon Simple Notification Service
AWS Lambda 可以幫助處理在Simple Notification Service (SNS)中建立的通知。每當在 SNS 中釋出訊息時,都會使用包含訊息詳細資訊的 SNS 事件觸發 Lambda 函式。這些訊息可以在 Lambda 函式內部進行處理,並根據需要進一步傳送到其他服務。
輸入訊息後,SNS 將觸發 Lambda 函式。如果任何錯誤嘗試呼叫 Lambda 函式,SNS 將最多重試三次以呼叫 lambda 函式。
Amazon SNS 示例事件
下面顯示了一個示例事件,其中包含 AWS Lambda 函式中可用的所有詳細資訊,以執行進一步的處理:
{
"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 可用於傳送訊息和接收訊息。當收到訊息時,可以呼叫 AWS Lambda 函式在 Simple Mail Service 上。
Amazon SES 電子郵件接收示例事件
下面顯示了在 AWS Lambda 內部使用 SES 事件的詳細資訊:
{
"Records": [{
"eventVersion": "1.0",
"ses": {
"mail": {
"commonHeaders": {
"from": [
"Jane Doe <janedoe@example.com>"
],
"to": [
"johndoe@Source.com"
],
"returnPath": "janedoe@example.com",
"messageId": "<0123456789Source.com>",
"date": "Wed, 7 Oct 2015 12:34:56 -0700",
"subject": "Test Subject"
},
"example": "janedoe@example.com",
"timestamp": "1970-01-01T00:00:00.000Z",
"destination": [
"johndoe@example.com"
],
"headers": [{
"name": "Return-Path",
"value": "<janedoe@example.com>"
},
{
"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 johndoe@example.com; 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 <janedoe@example.com>"
},
{
"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": "johndoe@example.com"
},
{
"name": "Content-Type",
"value": "text/plain; charset=UTF-8"
}],
"headersTruncated": false,
"messageId": "o3vrnil0e2ic28tr"
},
"receipt": {
"recipients": [
"johndoe@example.com"
],
"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
AWS Lambda 可以使用CloudWatch Logs Subscriptions從 Amazon CloudWatch Logs 觸發。CloudWatch Logs 訂閱具有有關日誌的即時資料,這些資料可以在 AWS Lambda 內部進行處理和分析,或者可以用於載入到其他系統。
Amazon CloudWatch Logs 示例事件
{
"awslogs": {
"data": "H4sIAAAAAAAAAHWPwQqCQBCGX0Xm7EFtK+smZBEUgXoLCdMhFtKV3akI8d0bLYmibvPPN3wz00CJxmQnTO41whwW
QRIctmEcB6sQbFC3CjW3XW8kxpOpP+OC22d1Wml1qZkQGtoMsScxaczKN3plG8zlaHIta5KqWsozoTYw3/djzwhpL
wivWFGHGpAFe7DL68JlBUk+l7KSN7tCOEJ4M3/qOI49vMHj+zCKdlFqLaU2ZHV2a4Ct/an0/ivdX8oYc1UVX860fQ
DQiMdxRQEAAA=="
}
}
Amazon API Gateway
AWS Lambda 函式可以在https url 上呼叫。它可以在GET、POST、PUT上完成。當呼叫 https url 時,AWS Lambda 函式也會被觸發,並且透過 get/post 傳遞到 https 的資料可以在 AWS Lambda 內部使用,以用於插入 DynamoDB 或傳送郵件等。
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"
}
}
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"
}