使用无服务器从本地收听远程 AWS SQS
Listening to remote AWS SQS from local using serverless
我想在我的 AWS 账户上的 SQS 事件上本地执行 lambda 函数。我已经定义了所需的事件,但这没有被触发。
如何实现?
我可以使用本地的 cron 事件将消息发送到同一个队列。
以下是我尝试过的一些方法...但对我没有用。
functions:
account-data-delta-test:
handler: functions/test/data/dataDeltatestGenerator.handler
name: ${self:provider.stage}-account-data-delta-test
description: account delta update - ${self:provider.stage}-account-data-delta-test
tags:
Name: ${self:provider.stage}-account-data-delta-test
# keeping 5 minute function timeout just in case large volume of data.
timeout: 300
events:
- sqs:
arn:
Fn::GetAtt: [ testGenerationQueue, Arn ]
batchSize: 10
----------
Policies:
- PolicyName: ${self:provider.stage}-test-sqs-policy
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action:
- sqs:ReceiveMessage
- sqs:DeleteMessage
- sqs:GetQueueAttributes
- sqs:ChangeMessageVisibility
- sqs:SendMessage
- sqs:GetQueueUrl
- sqs:ListQueues
Resource: "*"
---------------
---
Resources:
testGenerationQueue:
Type: AWS::SQS::Queue
Properties:
QueueName: ${self:provider.stage}-account-test-queue
VisibilityTimeout: 60
Tags:
-
Key: Name
Value: ${self:provider.stage}-account-test-queue
-------------
const sqs = new AWS.SQS({
region: process.env.REGION,
});
exports.handler = async (event) => {
console.error('------------ >>>>CRON:START: Test delta Job run.', event);
log.error('------------ >>>>CRON:START: Test delta Job run.', event);
});
您无法从远程上下文触发本地 Lambda 函数,因为它们没有任何共同点。
我想你的目标是测试 Lambda 函数的逻辑,如果是的话你有两个选择。
选项 1
一种更快的方法是使用 sam local invoke 在本地调用函数。通过这种方式,您可以为该命令提供一些参数,其中一个参数是事件源(即一旦触发,SQS 将发送给 Lambda 的事件信息)。
sam local invoke -e sqs.input.json account-data-delta-test
你的 sqs.input.json 看起来像这样(使用 sam local generate-event sqs receive-message
生成)
因此您将实际在本地测试您的 Lambda。
优点:速度快
缺点:在 AWS 上部署时,您仍然需要测试触发器
选项 2
在第二种情况下,您将牺牲队列和 Lambda 之间的绑定。您必须以固定间隔触发您的功能,并在您的代码中明确使用 ReceiveMessage。
专业版:您可以从真实队列中读取真实消息。
缺点:您必须定期调用函数,这并不方便。
我想在我的 AWS 账户上的 SQS 事件上本地执行 lambda 函数。我已经定义了所需的事件,但这没有被触发。
如何实现?
我可以使用本地的 cron 事件将消息发送到同一个队列。
以下是我尝试过的一些方法...但对我没有用。
functions:
account-data-delta-test:
handler: functions/test/data/dataDeltatestGenerator.handler
name: ${self:provider.stage}-account-data-delta-test
description: account delta update - ${self:provider.stage}-account-data-delta-test
tags:
Name: ${self:provider.stage}-account-data-delta-test
# keeping 5 minute function timeout just in case large volume of data.
timeout: 300
events:
- sqs:
arn:
Fn::GetAtt: [ testGenerationQueue, Arn ]
batchSize: 10
----------
Policies:
- PolicyName: ${self:provider.stage}-test-sqs-policy
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action:
- sqs:ReceiveMessage
- sqs:DeleteMessage
- sqs:GetQueueAttributes
- sqs:ChangeMessageVisibility
- sqs:SendMessage
- sqs:GetQueueUrl
- sqs:ListQueues
Resource: "*"
---------------
---
Resources:
testGenerationQueue:
Type: AWS::SQS::Queue
Properties:
QueueName: ${self:provider.stage}-account-test-queue
VisibilityTimeout: 60
Tags:
-
Key: Name
Value: ${self:provider.stage}-account-test-queue
-------------
const sqs = new AWS.SQS({
region: process.env.REGION,
});
exports.handler = async (event) => {
console.error('------------ >>>>CRON:START: Test delta Job run.', event);
log.error('------------ >>>>CRON:START: Test delta Job run.', event);
});
您无法从远程上下文触发本地 Lambda 函数,因为它们没有任何共同点。
我想你的目标是测试 Lambda 函数的逻辑,如果是的话你有两个选择。
选项 1
一种更快的方法是使用 sam local invoke 在本地调用函数。通过这种方式,您可以为该命令提供一些参数,其中一个参数是事件源(即一旦触发,SQS 将发送给 Lambda 的事件信息)。
sam local invoke -e sqs.input.json account-data-delta-test
你的 sqs.input.json 看起来像这样(使用 sam local generate-event sqs receive-message
生成)
因此您将实际在本地测试您的 Lambda。
优点:速度快
缺点:在 AWS 上部署时,您仍然需要测试触发器
选项 2
在第二种情况下,您将牺牲队列和 Lambda 之间的绑定。您必须以固定间隔触发您的功能,并在您的代码中明确使用 ReceiveMessage。