深潜:调用 AWS Lambda 函数的 3 种方法
[](https://res.cloudinary.com/practicaldev/image/fetch/s--uIYs0RXM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3。 amazonaws.com/i/4rvkh4i3c1rq79td0gqk.png) AWS Lambda
[](https://res.cloudinary.com/practicaldev/image/fetch/s--uIYs0RXM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3。 amazonaws.com/i/4rvkh4i3c1rq79td0gqk.png)
AWS Lambda
功能无处不在。我们将它用于各种用例。有时我们想调用超过HTTP
个 Lambda 函数,而其他时候trigger
个基于一些外部事件的函数。了解调用 Lambda 函数的不同方式非常有用。以下是我们可以调用 AWS Lambda 函数的 3 种不同方式:
同步调用
这是最简单的 lambda 调用模型。当我们执行 Lambda 调用 API 调用时,我们等待函数处理事件并返回响应或超时。响应包括函数响应和附加数据。
要执行同步调用,我们可以使用 CLI 或任何受支持的 SDK。
使用 CLI 进行同步调用的示例:
aws lambda invoke —function-name MyLambdaFunction —invocation-type RequestResponse —payload '{ "key": "value" }'
使用 Node.js SDK 的同步调用示例:
const AWS = require("aws-sdk");
const lambda = new AWS.Lambda();
const params = {
FunctionName: "MyLambdaFunction",
InvocationType: "RequestResponse",
Payload: JSON.stringify({ key: "value" })
};
await lambda.invoke(params).promise();
当我们将
Invocation-type
标志或InvocationType
参数值指定为RequestResponse
时,它指示 AWS 执行我们的函数并等待函数完成。同步调用的缺点之一是我们负责检查响应并确定它是否是错误的,我们应该重试调用。
有许多 AWS 服务可以同步触发 lambda 函数。这里是其中的一些:
-
ELB(应用负载均衡器)
-
认知
-
莱克斯
-
亚历克斯
-
API网关
-
CloudFront (Lambda@Edge)
-
Kinesis Data Firehose
异步调用
当我们异步调用函数时,Lambda 将事件发送到队列并返回成功响应,而无需额外信息。一个单独的进程从队列中读取事件并运行我们的函数。要异步调用函数,我们必须将调用类型参数设置为 Event。
使用 CLI 的异步调用示例:
aws lambda invoke —function-name MyLambdaFunction —invocation-type Event —payload '{ "key": "value" }'
使用 Node.js SDK 的异步调用示例:
const AWS = require("aws-sdk");
const lambda = new AWS.Lambda();
const params = {
FunctionName: "MyLambdaFunction",
InvokeArgs: JSON.stringify({
Records: [
{
eventVersion: "2.0",
eventSource: "aws:s3",
awsRegion: "us-west-2",
eventTime: "1970-01-01T00:00:00.000Z",
eventName: "ObjectCreated:Put",
userIdentity: {
principalId: "AIDAJDPLRKLG7UEXAMPLE"
},
requestParameters: {
sourceIPAddress: "127.0.0.1"
},
responseElements: {
"x-amz-request-id": "C3D13FE58DE4C810",
"x-amz-id-2":
"FMyUVURIY8/IgAtTv8xRjskZQpcIZ9KG4V5Wp6S7S/JRWeUWerMUE5JgHvANOjpD"
},
s3: {
s3SchemaVersion: "1.0",
configurationId: "testConfigRule",
bucket: {
name: "sourcebucket",
ownerIdentity: {
principalId: "A3NL1KOZZKExample"
},
arn: "arn:aws:s3:::sourcebucket"
},
object: {
key: "HappyFace.jpg",
size: 1024,
eTag: "d41d8cd98f00b204e9800998ecf8427e",
versionId: "096fKKXTRTtl3on89fVO.nfljtsv6qko"
}
}
}
]
})
};
await lambda.invokeAsync(params).promise();
You can use the above code snippet to write integration tests for your lambda function that gets trigger based on the s3 event.
当我们将
Invocation-type
标志或InvocationType
参数值指定为Event
时,如果函数失败,AWS 将自动重试调用两次。
以下是异步调用 Lambda 函数的服务列表:
-
尺码
-
社交网络
-
SES
-
CloudFormation
-
CloudWatch 日志
-
个 CloudWatch 事件
-
代码提交
基于池的调用
基于池的调用模型允许我们与基于 AWS 流和队列的服务集成。 Lambda 将从服务 (Kinesis, SQS, DynamoDB Streams
) 中轮询记录并调用我们的函数。 AWS Lambda 事件源映射管理轮询器并执行我们函数的同步调用。
以下是函数 (MyLambdaFunction
) 到批处理大小为 500 的 Kinesis 流 (arn:aws:kinesis:us-east-2:123456789012:stream/lambda-stream
) 的示例映射:
$ aws lambda create-event-source-mapping --function-name MyLambdaFunction \
--batch-size 500 --starting-position AT_TIMESTAMP --starting-position-timestamp 1541139109 \
--event-source-arn arn:aws:kinesis:us-east-2:123456789012:stream/lambda-stream
{
"UUID": "2b733gdc-8ac3-cdf5-af3a-1827b3b11284",
"BatchSize": 500,
"MaximumBatchingWindowInSeconds": 0,
"ParallelizationFactor": 1,
"EventSourceArn": "arn:aws:kinesis:us-east-2:123456789012:stream/lambda-stream",
"FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:MyLambdaFunction",
"LastModified": 1541139209.351,
"LastProcessingResult": "No records processed",
"State": "Creating",
"StateTransitionReason": "User action",
"DestinationConfig": {},
"MaximumRecordAgeInSeconds": 604800,
"BisectBatchOnFunctionError": false,
"MaximumRetryAttempts": 10000
}
以下是接收 Kinesis 事件输入并处理消息的示例 lambda 函数:
exports.handler = async event => {
event.Records.forEach(record => {
// Kinesis data is base64 encoded so decode here
const payload = Buffer.from(record.kinesis.data, 'base64').toString('ascii');
console.log('Decoded payload:', payload);
});
};
不同调用模型的重试行为
调用模型
重试行为
同步
没有任何
异步
两次
基于池
根据数据过期重试
现在您知道了调用 Lambda 函数的 3 种不同方法。如果您有任何问题或建议,请随时在评论中告诉我。
更多推荐
所有评论(0)