首页 > 解决方案 > 使用无服务器从本地监听远程 AWS SQS

问题描述

我想在我的 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);
}); 


标签: aws-lambdaevent-handlingyamlamazon-sqsaws-serverless

解决方案


您无法从远程上下文触发本地 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

优点:您可以从真实队列中读取真实消息。

缺点:您必须定期调用函数,这并不方便。


推荐阅读