教程:将 Lambda 与 Amazon SQS 结合使用
在此教程中,您将创建一个会使用来自某个 Amazon Simple Queue Service(Amazon SQS)队列的消息的 Lambda 函数。
先决条件
本教程假设您对 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
创建执行角色
创建一个执行角色以向您的函数授予访问所需Amazon资源的权限。
创建执行角色
-
打开 Amazon Identity and Access Management (IAM) 控制台的 Roles page
(角色页面)。 -
选择 Create role(创建角色)。
-
创建具有以下属性的角色。
-
Trusted entity(可信任的实体)– Amazon Lambda。
-
Permissions(权限)– AWSLambdaSQSQueueExecutionRole。
-
Role name(角色名称)–
lambda-sqs-role
。
-
AWSLambdaSQSQueueExecutionRole 策略具有该函数从 Amazon SQS 中读取项目并将日志写入 Amazon CloudWatch Logs 所需的权限。
创建函数
创建一个处理您的 Amazon SQS 消息的 Lambda 函数。下列 Node.js 12 代码示例将每条消息写入 CloudWatch Logs 中的日志。
有关使用其他语言的代码示例,请参阅 示例 Amazon SQS 函数代码。
例 index.js
exports.handler = async function(event, context) { event.Records.forEach(record => { const { body } = record; console.log(body); }); return {}; }
创建函数
按照这些步骤在 Node.js 12 中创建一个函数。对于其他语言,步骤类似,但有些细节不同。
-
将代码示例保存为名为
index.js
的文件。 -
创建部署程序包。
zip function.zip index.js
-
使用
create-function
Amazon Command Line Interface (Amazon CLI) 命令创建函数。aws lambda create-function --function-name ProcessSQSRecord \ --zip-file fileb://function.zip --handler index.handler --runtime nodejs12.x \
--role arn:aws:iam::
123456789012
:role/lambda-sqs-role
测试此函数
使用 invoke
Amazon CLI 命令和一个示例 Amazon SQS 事件手动调用您的 Lambda 函数。
如果该处理程序正常返回并且没有异常,则 Lambda 认为该消息得到成功处理并开始读取队列中的新消息。成功处理消息后,Lambda 从队列中将其自动删除。如果该处理程序引发异常,则 Lambda 认为消息的批量处理并未成功进行,并且 Lambda 会用相同的批量消息调用该函数。
-
将下列 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-2:123456789012:my-queue", "awsRegion": "us-east-2" } ] }
上述 JSON 模拟 Amazon SQS 可能发送到您的 Lambda 函数的事件,其中
"body"
包含来自该队列的实际消息。 -
运行以下
invoke
Amazon CLI 命令。aws lambda invoke --function-name ProcessSQSRecord \ --payload file://input.txt outputfile.txt
如果使用 cli-binary-format 版本 2,则 Amazon CLI 选项是必需的。要将其设为默认设置,请运行
aws configure set cli-binary-format raw-in-base64-out
。有关更多信息,请参阅Amazon CLI 支持的全局命令行选项。 -
在
outputfile.txt
文件中验证输出。
创建 Amazon SQS 队列
创建一个可由 Lambda 函数用作事件源的 Amazon SQS 队列。
创建队列
-
打开 Amazon SQS 控制台
。 -
选择 Create queue(创建队列),然后配置该队列。有关详细说明,请参阅《Amazon Simple Queue Service 开发人员指南》中的创建 Amazon SQS 队列(控制台)。
-
创建队列后,记录其 Amazon Resource Name (ARN)。在下一步中将该队列与您的 Lambda 函数关联时,您将需要此类信息。
配置事件源
要在您的 Amazon SQS 队列与您的 Lambda 函数之间创建映射,请运行以下 create-event-source-mapping
Amazon CLI 命令。
aws lambda create-event-source-mapping --function-name ProcessSQSRecord --batch-size 10 \ --event-source-arn arn:aws:sqs:
us-east-2:123456789012:my-queue
要获取您的事件源映射的列表,请运行下列命令。
aws lambda list-event-source-mappings --function-name ProcessSQSRecord \ --event-source-arn arn:aws:sqs:
us-east-2:123456789012:my-queue
测试设置
现在,可以按以下方式测试设置:
-
打开 Amazon SQS 控制台
。 -
选择您稍早时创建的队列名称。
-
选择 Send and receive messages(发送和接收消息)。
-
在 Message body (消息正文) 中,输入测试消息。
-
选择 Send Message (发送消息)。
Lambda 轮询队列以获取更新。当有新消息时,Lambda 会使用该新的事件数据从队列中调用您的函数。您的函数运行并在 Amazon CloudWatch 中创建日志。您可以在 CloudWatch 控制台
清除 资源
除非您想要保留为本教程创建的资源,否则可立即将其删除。通过删除不再使用的Amazon资源,可防止您的Amazon账户产生不必要的费用。
删除执行角色
-
打开 IAM 控制台的 Roles(角色)页面
。 -
选择您创建的执行角色。
-
选择 Delete role(删除角色)。
-
选择 Yes, delete(是,删除)。
删除 Lambda 函数
-
打开 Lamba 控制台的 Functions(函数)页面
。 -
选择您创建的函数。
-
选择 Actions (操作),然后选择 Delete (删除)。
-
选择 Delete(删除)。
删除 Amazon SQS 队列
-
登录到 Amazon Web Services Management Console 并打开 Amazon SQS 控制台,网址:https://console.aws.amazon.com/vpc/
。 -
选择创建的队列。
-
选择 Delete(删除)。
-
在文本框中输入
delete
。 -
选择 Delete(删除)。