Thực thi và gọi hàm Lambda

Chương này sẽ giải thích chi tiết về quá trình thực thi và gọi hàm Lambda và các bước liên quan đến nó.

Mô hình thực thi AWS Lambda

Việc thực thi AWS phụ thuộc vào chi tiết cấu hình được thêm vào Hàm AWS Lambda. Khi hàm được tạo, có mộtmemorytime allotted, được sử dụng để thực thi hàm AWS Lambda.

Với sự trợ giúp của chi tiết cấu hình, AWS Lambda tạo bối cảnh thực thi. Bối cảnh thực thi là môi trường thời gian chạy tạm thời được tạo sẵn sàng với bất kỳ phụ thuộc bên ngoài nào như kết nối cơ sở dữ liệu, điểm cuối http, thư viện bên thứ ba, v.v., nếu có.

Khi hàm AWS Lambda được gọi lần đầu tiên hoặc nếu hàm lambda được cập nhật, sẽ có rất ít độ trễ được thêm vào do thiết lập ngữ cảnh thực thi. Tuy nhiên, các cuộc gọi tiếp theo nhanh hơn so với cuộc gọi đầu tiên. AWS Lambda cố gắng sử dụng lại ngữ cảnh thực thi một lần nữa nếu hàm Lambda được gọi mất ít thời gian hơn.

Việc sử dụng lại ngữ cảnh thực thi có những tác động sau:

  • Nếu có bất kỳ kết nối cơ sở dữ liệu nào được thực hiện để thực thi Lambda, kết nối sẽ được duy trì để sử dụng lại. Vì vậy, mã Lambda phải sao cho kết nối phải được kiểm tra trước - nếu tồn tại và sử dụng lại; nếu không, chúng tôi sẽ phải tạo kết nối mới mới.

  • Ngữ cảnh thực thi duy trì một không gian đĩa 500MB trong /tmpdanh mục. Dữ liệu cần thiết được lưu trong thư mục này. Bạn có thể kiểm tra thêm mã để xem dữ liệu có tồn tại hay không.

  • Nếu các lệnh gọi lại hoặc một số quy trình nền không hoàn tất khi hàm Lambda được gọi, thì quá trình thực thi sẽ bắt đầu khi hàm lambda được gọi lại. Trong trường hợp bạn không cần điều đó xảy ra, hãy đảm bảo rằng tất cả các quy trình của bạn được kết thúc đúng cách, khi việc thực thi chức năng hoàn tất.

Bạn nên sử dụng ngữ cảnh thực thi và dữ liệu được lưu trữ trong thư mục tmp. Bạn sẽ phải thêm các kiểm tra cần thiết trong mã để xem liệu dữ liệu bắt buộc có tồn tại hay không trước khi tạo dữ liệu mới. Điều này sẽ tiết kiệm thời gian trong quá trình thực hiện và làm cho nó nhanh hơn.

Gọi hàm AWS Lambda

Chúng tôi có thể gọi AWS theo cách thủ công bằng cách sử dụng aws cli. Chúng ta đã biết cách tạo và triển khai AWS Lambda bằng cách sử dụngcli. Ở đây, trước tiên chúng ta sẽ tạo một hàm bằng cách sử dụngaws cli và gọi tương tự.

Tạo Hàm AWS Lambda bằng AWS CLI

Bạn có thể sử dụng các lệnh sau để tạo hàm AWS Lambda bằng 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"

Đầu ra như hình dưới đây -

Hàm được tạo trong bảng điều khiển AWS như được hiển thị bên dưới:

Bây giờ, bạn có thể gọi hàm bằng lệnh:invoke

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

Options

--function-name − Chỉ định tên của hàm bạn muốn gọi.

--invocation-type(string) − theo mặc định, kiểu gọi là requestresponse. Các giá trị có sẵn để sử dụng với kiểu gọi làRequestResponse, EventDryRun.

  • Kiểu gọi sự kiện sẽ được sử dụng cho phản hồi không đồng bộ.

  • DryRun sẽ được sử dụng khi bạn muốn xác minh hàm Lambda mà không cần thực thi nó.

--log-type − Nó sẽ là Tailnếu kiểu gọi là RequestResponse. Nó cung cấp dữ liệu nhật ký được mã hóa 4KB base64 cuối cùng. Giá trị có thể làTailNone.

--client-context −Bạn có thể chuyển các chi tiết cụ thể của ứng dụng khách cho hàm Lambda. Clientcontext phải ở định dạng json và được mã hóa base64. Kích thước tệp tối đa là 3583 byte.

--payload − đầu vào định dạng json cho bạn hàm lambda.

--qualifier −Bạn có thể chỉ định phiên bản hàm Lambda hoặc tên bí danh. Nếu bạn chuyển phiên bản hàm hơn api sẽ sử dụng hàm arn đủ điều kiện để gọi hàm Lambda. Nếu bạn chỉ định tên bí danh, api sử dụng bí danh ARN để gọi hàm Lambda.

outfile − Đây là tên tệp nơi nội dung sẽ được lưu.

Command with values

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

Bạn có thể sử dụng tùy chọn payload để gửi sự kiện giả đến hàm lambda ở định dạng json như hình dưới đây.

Mã AWS Lambda liên quan như sau:

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

Quan sát rằng trong mã, chúng ta có bảng điều khiển event.nameevent.addr. Bây giờ, chúng ta hãy sử dụng tùy chọn tải trọng trong aws cli để gửi sự kiện với tên và địa chỉ như sau:

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

Thenpayload nhận đầu vào là một đường dẫn tệp có đầu vào json như được hiển thị -

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

Đầu ra tương ứng như hình dưới đây -

Đầu ra được lưu trữ trong tệp C:\clioutput\outputfile.txt như sau -

"Hello Roy Singh and address is Mumbai"

Sự kiện mẫu

Bạn có thể kiểm tra chức năng AWS Lambda bằng cách chuyển một sự kiện mẫu. Phần này cung cấp một số sự kiện mẫu cho Dịch vụ AWS. Bạn có thể dùnginvokelệnh để kiểm tra đầu ra khi được kích hoạt với bất kỳ dịch vụ nào. Quan sát các mã được cung cấp cho các sự kiện mẫu tương ứng bên dưới -

Sự kiện mẫu đặt trên 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"
   }]
}

Để có được details of the file from the s3 put event, bạn có thể sử dụng lệnh sau:

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

Đến get the bucket name, bạn có thể sử dụng lệnh sau:

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

Đến see the EventName, bạn có thể sử dụng lệnh sau:

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

Sự kiện mẫu xóa trên 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 có thể là một sự kiện trên AWS Lambda khi các thay đổi được thực hiện trên bảng DynamoDB. Chúng ta có thể thực hiện thao tác như thêm mục nhập, cập nhật và xóa bản ghi khỏi bảng DynamodDB.

Một sự kiện mẫu cho sự kiện thêm, chèn và xóa DynamoDB được hiển thị ở đây -

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

Dịch vụ thông báo đơn giản của Amazon

AWS Lambda có thể hữu ích để xử lý thông báo được tạo trong Simple Notification Service (SNS). Bất cứ khi nào có thông báo được xuất bản trong SNS, hàm Lambda có thể được kích hoạt với sự kiện SNS, có thông tin chi tiết về thông báo. Thông báo này có thể được xử lý bên trong hàm Lambda và có thể được gửi thêm tới các dịch vụ khác theo yêu cầu.

Sau khi thông báo được nhập, SNS sẽ kích hoạt chức năng Lambda. Nếu có bất kỳ lỗi nào cố gắng gọi hàm Lambda, SNS sẽ thử gọi lại hàm lambda tối đa ba lần.

Sự kiện mẫu SNS của Amazon

Một sự kiện mẫu có tất cả các chi tiết có sẵn trong hàm AWS Lambda để thực hiện quy trình tiếp theo được hiển thị bên dưới:

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

Dịch vụ thư đơn giản của Amazon

Amazon Simple Mail Service có thể được sử dụng để gửi tin nhắn và cả để nhận tin nhắn. Chức năng AWS Lambda có thể được gọi trên Dịch vụ Thư đơn giản khi nhận được thư.

Sự kiện mẫu nhận email của Amazon SES

Chi tiết về sự kiện SES khi được sử dụng bên trong AWS Lambda được hiển thị bên dưới:

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

AWS Lambda có thể được kích hoạt từ Amazon CloudWatch Logs bằng cách sử dụng CloudWatch Logs Subscriptions. Đăng ký CloudWatch Logs có dữ liệu theo thời gian thực về các nhật ký có thể được xử lý và phân tích bên trong AWS Lambda hoặc có thể được sử dụng để tải lên các hệ thống khác.

Sự kiện mẫu nhật ký Amazon CloudWatch

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

Cổng API Amazon

Hàm AWS Lambda có thể được gọi trên httpsurl. CNTT có thể được thực hiện trênGET, POST, PUT. Khi url https được gọi, hàm AWS Lambda cũng được kích hoạt và dữ liệu được chuyển đến https bằng get / post có thể được cung cấp bên trong AWS Lambda để được sử dụng để chèn trong DynamoDB hoặc để gửi thư, v.v.

Sự kiện yêu cầu proxy cổng 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"
   }
}

Sự kiện phản hồi proxy cổng 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"
}