教程:将跨账户 Amazon SQS 队列用作事件源 - Amazon Lambda
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

教程:将跨账户 Amazon SQS 队列用作事件源

在此教程中,您将创建一个使用来自不同 Amazon 账户中 Amazon Simple Queue Service (Amazon SQS) 队列的消息的 Lambda 函数。本教程涉及两个 Amazon 账户:账户 A 指包含您的 Lambda 函数的账户,而账户 B 指包含 Amazon SQS 队列的账户。

先决条件

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

要完成以下步骤,您需要 Amazon Command Line Interface(Amazon CLI)版本 2。在单独的数据块中列出了命令和预期输出:

aws --version

您应看到以下输出:

aws-cli/2.13.27 Python/3.11.6 Linux/4.14.328-248.540.amzn2.x86_64 exe/x86_64.amzn.2

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

在 Linux 和 macOS 中,可使用您首选的 shell 和程序包管理器。

注意

在 Windows 中,操作系统的内置终端不支持您经常与 Lambda 一起使用的某些 Bash CLI 命令(例如 zip)。安装 Windows Subsystem for Linux,获取 Ubuntu 和 Bash 与 Windows 集成的版本。本指南中的示例 CLI 命令使用 Linux 格式。如果您使用的是 Windows CLI,则必须重新格式化包含内联 JSON 文档的命令。

创建执行角色(账户 A)

账户 A 中,创建一个执行角色,该角色向您的函数授予访问所需 Amazon 资源的权限。

创建执行角色
  1. 在 Amazon Identity and Access Management IAM 控制台中,打开 Roles (角色) 页面

  2. 选择创建角色

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

    • Trusted entity (可信任的实体)Amazon Lambda

    • 权限AWSLambdaSQSQueueExecutionRole

    • Role name(角色名称)– cross-account-lambda-sqs-role

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

创建函数(账户 A)

账户 A 中, 创建一个处理您的 Amazon SQS 消息的 Lambda 函数。以下 Node.js 18 代码示例将每条消息写入 CloudWatch 日志中。

注意

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

例 index.mjs
export const handler = async function(event, context) { event.Records.forEach(record => { const { body } = record; console.log(body); }); return {}; }
创建函数
注意

按照这些步骤在 Node.js 18 中创建一个函数。对于其他语言,步骤类似,但有些细节不同。

  1. 将代码示例保存为名为 index.mjs 的文件。

  2. 创建部署程序包。

    zip function.zip index.mjs
  3. 使用 create-function Amazon Command Line Interface (Amazon CLI) 命令创建函数。

    aws lambda create-function --function-name CrossAccountSQSExample \ --zip-file fileb://function.zip --handler index.handler --runtime nodejs18.x \ --role arn:aws:iam::<AccountA_ID>:role/cross-account-lambda-sqs-role

测试函数(账户 A)

账户 A 中,使用 invoke Amazon CLI 命令和示例 Amazon SQS 事件手动调用 Lambda 函数。

如果该处理程序正常返回并且没有异常,则 Lambda 认为该消息得到成功处理并开始读取队列中的新消息。成功处理消息后,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:sqs:us-east-1:111122223333:example-queue", "awsRegion": "us-east-1" } ] }

    上述 JSON 模拟 Amazon SQS 可能发送到您的 Lambda 函数的事件,其中 "body" 包含来自该队列的实际消息。

  2. 运行以下 invoke Amazon CLI 命令。

    aws lambda invoke --function-name CrossAccountSQSExample \ --cli-binary-format raw-in-base64-out \ --payload file://input.txt outputfile.txt

    如果使用 cli-binary-format 版本 2,则 Amazon CLI 选项是必需的。要将其设为默认设置,请运行 aws configure set cli-binary-format raw-in-base64-out。有关更多信息,请参阅版本 2 的 Amazon Command Line Interface 用户指南中的 Amazon CLI 支持的全局命令行选项

  3. outputfile.txt 文件中验证输出。

创建 Amazon SQS 队列(账户 B)。

账户 B 中,创建一个可由账户 A 中 Lambda 函数用作事件源的 Amazon SQS 队列。

创建队列
  1. 打开 Amazon SQS 控制台

  2. 选择创建队列

  3. 创建具有以下属性的队列。

    • 类型 - 标准

    • 姓名LambdaCrossAccountQueue

    • 配置 - 保留默认设置。

    • 访问策略 - 选择 Advanced (高级)。粘贴以下 JSON 策略:

      { "Version": "2012-10-17", "Id": "Queue1_Policy_UUID", "Statement": [{ "Sid":"Queue1_AllActions", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::<AccountA_ID>:role/cross-account-lambda-sqs-role" ] }, "Action": "sqs:*", "Resource": "arn:aws:sqs:us-east-1:<AccountB_ID>:LambdaCrossAccountQueue" } ] }

      此策略授予账户 A 中 Lambda 执行角色权限,以使用 Amazon SQS 队列中的消息。

  4. 创建队列后,记录其 Amazon Resource Name (ARN)。在下一步中将该队列与您的 Lambda 函数关联时,您将需要此类信息。

配置事件源(帐户 A)

账户 A 中,通过运行以下 create-event-source-mapping Amazon CLI 命令创建账户 B 中 Amazon SQS 队列和 Lambda 函数之间的事件源映射。

aws lambda create-event-source-mapping --function-name CrossAccountSQSExample --batch-size 10 \ --event-source-arn arn:aws:sqs:us-east-1:<AccountB_ID>:LambdaCrossAccountQueue

要获取您的事件源映射的列表,请运行下列命令。

aws lambda list-event-source-mappings --function-name CrossAccountSQSExample \ --event-source-arn arn:aws:sqs:us-east-1:<AccountB_ID>:LambdaCrossAccountQueue

测试设置

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

  1. 账户 B 中,打开Amazon SQS 控制台

  2. 选择LambdaCrossAccountQueue您之前创建的。

  3. 选择 Send and receive messages(发送和接收消息)

  4. Message body (消息正文) 中,输入测试消息。

  5. 选择 Send message(发送消息)。

您在账户 A 中的 Lambda 函数应该收到消息。Lambda 将继续轮询队列以获取更新。当有新消息时,Lambda 会使用该新的事件数据从队列中调用您的函数。您的函数在 Amazon 中运行并创建日志 CloudWatch。可以在 CloudWatch 控制台中查看日志。

清除资源

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

账户 A 中,清理您的执行角色和 Lambda 函数。

删除执行角色
  1. 打开 IAM 控制台的角色页面

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

  3. 选择删除

  4. 在文本输入字段中输入角色名称,然后选择 Delete(删除)。

删除 Lambda 函数
  1. 打开 Lamba 控制台的 Functions(函数)页面

  2. 选择您创建的函数。

  3. 依次选择操作删除

  4. 在文本输入字段中键入 delete,然后选择 Delete(删除)。

账户 B 中,清理 Amazon SQS 队列。

删除 Amazon SQS 队列
  1. 登录到 Amazon Web Services Management Console 并打开 Amazon SQS 控制台,网址:https://console.aws.amazon.com/vpc/

  2. 选择创建的队列。

  3. 选择 Delete(删除)。

  4. 在文本输入字段中输入 confirm

  5. 选择删除