教程:将 Amazon Lambda 与 Amazon Simple Queue Service 结合使用 - Amazon Lambda
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

教程:将 Amazon Lambda 与 Amazon Simple Queue Service 结合使用

在本教程中,您将创建一个 Lambda 函数来处理来自 Amazon SQS 队列的消息。

先决条件

本教程假设您对基本 Lambda 操作和 Lambda 控制台有一定了解。如果您尚不了解,请按照开始使用 Lambda中的说明创建您的第一个 Lambda 函数。

要完成以下步骤,您需要命令行终端或 Shell 以运行命令。命令和预期输出在单独的数据块中列出:

aws --version

您应看到以下输出:

aws-cli/2.0.57 Python/3.7.4 Darwin/19.6.0 exe/x86_64

对于长命令,使用转义字符 (\) 将命令拆分到多行中。

在 Linux 和 macOS 中,可使用您首选的外壳程序和程序包管理器。在 Windows 10 中,您可以 安装 Windows Subsystem for Linux,获取 Ubuntu 和 Bash 与 Windows 集成的版本。

创建执行角色

创建执行角色,向您的函数授予访问 Amazon 资源的权限。

创建执行角色

  1. 打开 IAM 控制台中的“角色”页面

  2. 选择 Create role (创建角色)

  3. 创建具有以下属性的角色。

    • 可信任的实体Amazon Lambda

    • 权限AWSLambdaSQSQueueExecutionRole

    • 角色名称 (角色名称)lambda-sqs-role

AWSLambdaSQSQueueExecutionRole 策略具有该函数从 Amazon SQS 中读取项目并将日志写入 CloudWatch Logs 所需的权限。

创建函数

以下示例说明如何处理事件输入中的每条 Amazon SQS 消息。有关包含多条消息的事件示例,请参阅将 Amazon Lambda 与 Amazon SQS 结合使用。在该示例中,代码将每条消息写入 CloudWatch Logs 中的日志。

注意

有关使用其他语言的示例代码,请参阅 示例 Amazon SQS 函数代码

例 index.js

exports.handler = async function(event, context) { event.Records.forEach(record => { const { body } = record; console.log(body); }); return {}; }

创建函数

  1. 将示例代码复制到名为 index.js 的文件中。

  2. 创建部署程序包。

    zip function.zip index.js
  3. 使用 create-function 命令创建 Lambda 函数。

    aws lambda create-function --function-name ProcessSQSRecord \ --zip-file fileb://function.zip --handler index.handler --runtime nodejs12.x \ --role arn:aws-cn:iam::123456789012:role/lambda-sqs-role

测试此函数

使用 invoke Amazon Lambda CLI 命令和示例 Amazon Simple Queue Service 事件手动调用 Lambda 函数。

如果该处理程序正常返回并且没有异常,则 Lambda 认为该消息得到成功处理并开始读取队列中的新消息。在成功处理消息后,它会立即从队列中删除。如果该处理程序引发异常,则 Lambda 认为消息的输入未得到处理,并用相同的批量消息调用该函数。

  1. 将以下 JSON 复制到文件中并将其保存为 input.txt

    { "Records": [ { "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d", "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...", "body": "test", "attributes": { "ApproximateReceiveCount": "1", "SentTimestamp": "1545082649183", "SenderId": "AIDAIENQZJOLO23YVJ4VO", "ApproximateFirstReceiveTimestamp": "1545082649185" }, "messageAttributes": {}, "md5OfBody": "098f6bcd4621d373cade4e832627b4f6", "eventSource": "aws:sqs", "eventSourceARN": "arn:aws-cn:sqs:us-east-2:123456789012:my-queue", "awsRegion": "us-east-2" } ] }
  2. 运行以下 invoke 命令:

    aws lambda invoke --function-name ProcessSQSRecord \ --payload file://input.txt outputfile.txt
    注意

    如果您使用的是 Amazon CLI 版本 2,请添加以下命令参数:

    --cli-binary-format raw-in-base64-out
  3. outputfile.txt 文件中验证输出。

创建 Amazon SQS 队列

创建一个可由 Lambda 函数用作事件源的 Amazon SQS 队列。

创建队列

  1. 登录 Amazon Web Services Management Console并通过以下网址打开 Amazon SQS 控制台:https://console.amazonaws.cn/sqs/

  2. 在 Amazon SQS 控制台中,创建一个队列。

  3. 记下或以其他方式记录标识的队列 ARN(Amazon 资源名称)。在下一步中将该队列与您的 Lambda 函数关联时,您将需要此类信息。

在 Amazon Lambda 中创建事件源映射。此事件源映射将 Amazon SQS 队列与您的 Lambda 函数关联。创建此事件源映射后,Amazon Lambda 即开始轮询该队列。

测试端到端体验。在您执行队列更新时,Amazon Simple Queue Service 会将消息写入队列。Amazon Lambda 将轮询该队列,检测新记录并通过向该函数传递事件(在本示例中为 Amazon SQS 消息)来代表您调用 Lambda 函数。

配置事件源

要创建指定的 Amazon SQS 队列与 Lambda 函数之间的映射,请运行以下 Amazon CLI create-event-source-mapping 命令。在此命令运行后,记下或以其他方式记录 UUID。在任何其他命令中,如选择删除事件源映射时,您都需要该 UUID 来引用事件源映射。

aws lambda create-event-source-mapping --function-name ProcessSQSRecord --batch-size 10 \ --event-source-arn arn:aws-cn:sqs:us-east-2:123456789012:my-queue

您可以通过运行以下命令获取事件源映射的列表。

aws lambda list-event-source-mappings --function-name ProcessSQSRecord \ --event-source-arn arn:aws-cn:sqs:us-east-2:123456789012:my-queue

该列表返回您创建的所有事件源映射,而对于每个映射,它都显示 LastProcessingResult 等信息。该字段用于在出现任何问题时提供信息性消息。No records processed(指示 Amazon Lambda 未开始轮询或队列中没有任何记录)和 OK(指示 Amazon Lambda 已成功读取队列中的记录并调用了您的 Lambda 函数)等值表示未出现任何问题。如果出现问题,您将收到一条错误消息。

测试设置

现在,可以按以下方式测试设置:

  1. 在 Amazon SQS 控制台中,将消息发送到队列。Amazon SQS 会将这些操作记录写入队列。

  2. Amazon Lambda 轮询该队列,当检测到有更新时,它会通过传递在队列中发现的事件数据来调用您的 Lambda 函数。

  3. 您的函数运行并在 Amazon CloudWatch 中创建日志。您可以验证 Amazon CloudWatch 控制台中报告的日志。

清除资源

如果您不想保留为本教程创建的资源,可以立即将其删除。通过删除您不再使用的 Amazon 资源,可防止您的 Amazon 账户产生不必要的费用。

删除执行角色

  1. 打开 IAM 控制台的“角色”页面

  2. 选择您创建的执行角色。

  3. 选择删除角色

  4. 选择 Yes, delete (是,删除)

删除 Lambda 函数

  1. 打开 Lambda 控制台的“函数”页面

  2. 选择您创建的函数。

  3. 依次选择 ActionsDelete

  4. 选择删除

删除 Amazon SQS 队列

  1. 登录 Amazon Web Services Management Console并通过以下网址打开 Amazon SQS 控制台:https://console.amazonaws.cn/sqs/

  2. 选择您创建的队列。

  3. 选择 Delete

  4. 在文本框中输入 delete

  5. 选择 Delete