[AWS 图表](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 种不同方法。如果您有任何问题或建议,请随时在评论中告诉我。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐