12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
ADADADADAD
建站问答 时间:2024-12-24 18:56:56
作者:文/会员上传
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
本章将详细讲解 Lambda 函数的执行和调用过程及其涉及的步骤。AWS Lambda 执行模型AWS 执行取决于为 AWS Lambda 函数添​​加的配置详细信息。在创建函数时,有一
以下为本文的正文内容,内容仅供参考!本站为公益性网站,复制本文以及下载DOC文档全部免费。
本章将详细讲解 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 cli手动调用 AWS。我们已经了解了如何使用cli创建和部署 AWS Lambda。在这里,我们将首先使用aws cli创建一个函数并调用它。
您可以使用以下命令通过aws cli
创建 AWS Lambda 函数
命令
createfunction functionname <value>runtime <value>role <value>handler <value>[code <value>] [description <value>] [timeout <value>] [memorysize <value>] [environment <value>] [kmskeyarn <value>] [tags <value>] [zipfile <value>] [cliinputjson <value>]
带值的命令
aws lambda createfunction functionname "lambdainvoke" runtime "nodejs8.10" role "arn:aws:iam::625297745038:role/lambdaapipolicy" handler "index.handler" timeout 5 memorysize 256 zipfile "fileb://C:\nodeproject\index.zip"
输出如下图
AWS 控制台中创建的函数如下图所示
现在,您可以使用以下命令调用该函数:invoke
functionname <value>[invocationtype <value>][logtype <value>][clientcontext <value>][payload <value>][qualifier <value>]outfile <value>
选项
functionname指定要调用的函数的名称。
invocationtype(string)默认情况下,调用类型是requestresponse。可用于 invokationtype 的值为RequestResponse、Event和DryRun。
事件调用类型将用于异步响应。当您想验证 Lambda 函数而不需要执行它时,可以使用 DryRun。
logtype −如果调用类型是 RequestResponse,它将是Tail。它给出了最后 4KB base64 编码的日志数据。可能的值为Tail和None。
clientcontext您可以将特定于客户端的详细信息传递给 Lambda 函数。客户端上下文必须采用 json 格式和 base64 编码。最大文件大小为 3583 字节。
payloadjson 格式输入到您的 lambda 函数。
qualifier您可以指定 Lambda 函数版本或别名。如果您传递函数版本,则 api 将使用限定的函数 arn 来调用 Lambda 函数。如果您指定别名,api 将使用别名 ARN 来调用 Lambda 函数。
outfile −这是保存内容的文件名。
带值的命令
aws lambda invokefunctionname "lambdainvoke"logtype 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 invokefunctionname "lambdainvoke"logtype Tailpayload file://C:\clioutput\input.txt C:\clioutput\outputfile.txt
Thenpayload 将输入作为一个文件路径,其中有 json 输入,如图所示
{"name":"Roy Singh", "addr":"Mumbai"}
对应的输出如下图
输出存储在文件C:\clioutput\outputfile.txt中,如下所示
"Hello Roy Singh and address is Mumbai"
您可以通过传递示例事件来测试 AWS Lambda 函数。本节提供了 AWS 服务的一些示例事件。当任何服务触发时,您可以使用invoke命令来测试输出。观察下面为相应示例事件给出的代码
{ "Records": [{ "eventVersion": "2.0", "eventTime": "19700101T00: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": { "xamzid2": "EXAMPLE123/5678abcdefghijklambdaisawese/mnopqrstuvwxyzABCDEFGH", "xamzrequestid": "EXAMPLE123456789" }, "awsRegion": "useast1", "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.
要查看事件名称,您可以使用以下命令
event.Records[0].eventName // will display the eventname
{ "Records": [{ "eventVersion": "2.0", "eventTime": "19700101T00: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": { "xamzid2": "EXAMPLE123/5678abcdefghijklambdaisawese/mnopqrstuvwxyzABCDEFGH", "xamzrequestid": "EXAMPLE123456789" }, "awsRegion": "useast1", "eventName": "ObjectRemoved:Delete", "userIdentity": { "principalId": "EXAMPLE" }, "eventSource": "aws:s3" }]}
当对 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": "uswest2", "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": "uswest2", "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": "uswest2", "eventName": "REMOVE", "eventSourceARN": Sourcearn, "eventSource": "aws:dynamodb" }]}
AWS Lambda 有助于处理在简单通知服务 (SNS)中创建的通知。每当在 SNS 中发布消息时,Lambda 函数都可以通过 SNS 事件触发,其中包含消息的详细信息。这些消息可以在 Lambda 函数内部进行处理,并且可以根据需要进一步发送到其他服务。
消息输入后,SNS 会触发 Lambda 函数。如果任何错误尝试调用 Lambda 函数,SNS 将重试调用 lambda 函数最多 3 次。
具有 AWS Lambda 函数中可用的所有详细信息以执行进一步过程的示例事件如下所示
{ "Records": [{ "EventVersion": "1.0", "EventSubscriptionArn": eventsubscriptionarn, "EventSource": "aws:sns", "Sns": { "SignatureVersion": "1", "Timestamp": "19700101T00:00:00.000Z", "Signature": "EXAMPLE", "SigningCertUrl": "EXAMPLE", "MessageId": "95df01b4ee985cb999034c221d41eb5e", "Message": "Hello fr SNS!", "MessageAttributes": { "Test": { "Type": "String", "Value": "TestString" }, "TestBinary": { "Type": "Binary", "Value": "TestBinary" } }, "Type": "Notification", "UnsubscribeUrl": "EXAMPLE", "TopicArn": topicarn, "Subject": "TestInvoke" } }]}
Amazon Simple Mail Service 可用于发送消息和接收消息。收到消息后,可以在 Simple Mail Service 上调用 AWS Lambda 函数。
在 AWS Lambda 中使用 SES 事件的详细信息如下所示
{ "Records": [{ "eventVersion": "1.0", "ses": { "mail": { "cmonHeaders": { "fr": [ "Jane Doe <janedoe@example>" ], "to": [ "johndoe@Source" ], "returnPath": "janedoe@example", "messageId": "<0123456789Source>", "date": "Wed, 7 Oct 2015 12:34:560700", "subject": "Test Subject" }, "example": "janedoe@example", "timestamp": "19700101T00:00:00.000Z", "destination": [ "johndoe@example" ], "headers": [{ "name": "ReturnPath", "value": "<janedoe@example>" }, { "name": "Received", "value": "fr mailer.example (mailer.example [203.0.113.1]) by inboundsmtp.uswest2.amazonaws with SMTP id o3vrnil0e2ic for johndoe@example; Wed, 07 Oct 2015 12:34:56 +0000 (UTC)" }, { "name": "DKIMSignature", "value": "v=1; a=rsasha256; c=relaxed/relaxed; d=example; s=example; h=mimeversion:fr:date:messageid:subject:to:contenttype; bh=jX3F0bCAI7sIbkHyy3mLYO28ieDQz2R0P8HwQkklFj4=; b=sQwJ+LMe9RjkesGu+vqU56asvMhrLRRYrWCbV" }, { "name": "MIMEVersion", "value": "1.0" }, { "name": "Fr", "value": "Jane Doe <janedoe@example>" }, { "name": "Date", "value": "Wed, 7 Oct 2015 12:34:560700" }, { "name": "MessageID", "value": "<0123456789example>" }, { "name": "Subject", "value": "Test Subject" }, { "name": "To", "value": "johndoe@example" }, { "name": "ContentType", "value": "text/plain; charset=UTF8" }], "headersTruncated": false, "messageId": "o3vrnil0e2ic28tr" }, "receipt": { "recipients": [ "johndoe@example" ], "timestamp": "19700101T00:00:00.000Z", "spamVerdict": { "status": "PASS" }, "dkimVerdict": { "status": "PASS" }, "processingTimeMillis": 574, "action": { "type": "Lambda", "invocationType": "Event", "functionArn": "arn:aws:lambda:uswest2:012345678912:function:example" }, "spfVerdict": { "status": "PASS" }, "virusVerdict": { "status": "PASS" } } }, "eventexample": "aws:ses" }]}
AWS Lambda 可以使用CloudWatch Logs 订阅从 Amazon CloudWatch Logs 触发。 CloudWatch Logs 订阅具有有关日志的实时数据,这些数据可以在 AWS Lambda 内部进行处理和分析,也可以用于加载到其他系统。
{ "awslogs": { "data": "H4sIAAAAAAAAAHWPwQqCQBCGX0Xm7EFtK+smZBEUgXoLCdMhFtKV3akI8d0bLYmibvPPN3wz00CJxmQnTO41whwW QRIctmEcB6sQbFC3CjW3XW8kxpOpP+OC22d1Wml1qZkQGtoMsScxaczKN3plG8zlaHIta5KqWsozoTYw3/djzwhpL wivWFGHGpAFe7DL68JlBUk+l7KSN7tCOEJ4M3/qOI49vMHj+zCKdlFqLaU2ZHV2a4Ct/an0/ivdX8oYc1UVX860fQ DQiMdxRQEAAA==" }}
AWS Lambda 函数可以在httpsurl 上调用。它可以在GET、POST、PUT上完成。当 https url 被调用时,AWS Lambda 函数也会被触发,使用 get/post 传递给 https 的数据可以在 AWS Lambda 内部可用,用于插入 DynamoDB 或发送邮件等。
{ "path": "/test/hello", "headers": { "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", "AcceptEncoding": "gzip, deflate, lzma, sdch, br", "AcceptLanguage": "enUS,en;q=0.8", "CloudFrontForwardedProto": "https", "CloudFrontIsDesktopViewer": "true", "CloudFrontIsMobileViewer": "false", "CloudFrontIsSmartTVViewer": "false", "CloudFrontIsTabletViewer": "false", "CloudFrontViewerCountry": "US", "Host": "wt6mne2s9k.executeapi.uswest2.amazonaws", "UpgradeInsecureRequests": "1", "UserAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chre/52.0.2743.82 Safari/537.36 OPR/39.0.2256.48", "Via": "1.1 fb7cca60f0ecd82ce07790c9c5eef16cloudfront.net (CloudFront)", "XAmzCfId": "nBsWBOrSHMgnaROZJK1wGCZ9PcRcSpq_oSXZNQwQ10OTZL4cimZo3g==", "XForwardedFor": "192.168.100.1, 192.168.1.1", "XForwardedPort": "443", "XForwardedProto": "https" }, "pathParameters": { "proxy": "hello" }, "requestContext": { "accountId": "123456789012", "reexampleId": "us4z18", "stage": "test", "requestId": "41b45ea370b511e6b7bd69b5aaebc7d9", "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) Chre/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" }}
{ "statusCode": 200, "headers": { "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", "AcceptEncoding": "gzip, deflate, lzma, sdch, br", "AcceptLanguage": "enUS,en;q=0.8", "CloudFrontForwardedProto": "https", "CloudFrontIsDesktopViewer": "true", "CloudFrontIsMobileViewer": "false", "CloudFrontIsSmartTVViewer": "false", "CloudFrontIsTabletViewer": "false", "CloudFrontViewerCountry": "US", "Host": "wt6mne2s9k.executeapi.uswest2.amazonaws", "UpgradeInsecureRequests": "1", "UserAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chre/52.0.2743.82 Safari/537.36 OPR/39.0.2256.48", "Via": "1.1 fb7cca60f0ecd82ce07790c9c5eef16cloudfront.net (CloudFront)", "XAmzCfId": "nBsWBOrSHMgnaROZJK1wGCZ9PcRcSpq_oSXZNQwQ10OTZL4cimZo3g==", "XForwardedFor": "192.168.100.1, 192.168.1.1", "XForwardedPort": "443", "XForwardedProto": "https" }, "body": "Hello World"}
作为AWS顶级代理商,选择天.下.数.据的优势
1、专属客服协助注册AWS,或提供注册好的账号直接使用
2、支持收U等多币种支付代付,无额外服务费用
3、AWS多种产品类型,更高产品租赁权限
4、针对大客户,AWS专属折扣优惠
5、7x24小时专属客服,在线解答各种疑问
电话40 02023/aws
11-20
11-19
11-20
11-20
11-20
11-19
11-20
11-20
11-19
11-20
11-19
11-19
11-19
11-19
11-19
11-19