无服务器框架不会在 Lambda 之前使用队列触发器创建 SQS 队列

Serverless Framework does not create SQS queue before Lambda with queue trigger

使用无服务器框架,如何使我的 Lambda 函数依赖于 resources 部分中的 SQS 队列,因为它是函数本身的触发器?

在我的 serverless.yaml 中,我正在定义一个新队列和 Lambda 函数。

然后,我想将队列用作我的 Lambda 函数的事件源(触发器)。

我通过手动创建队列 ARN 来做到这一点:

functions:
  consumer:
    handler: App\Service\Consumer
    events:
      - sqs:
          arn:
            Fn::Join:
              - ':'
              - arn:aws:sqs
              - Ref: AWS::Region
              - Ref: AWS::AccountId
              - ${opt:stage}-skill-assigner

并在资源中创建队列:

resources:
  Resources:
    SkillAssignerQueue:
      Type: AWS::SQS::Queue
      Properties:
        QueueName: ${opt:stage}-skill-assigner

如果我在将其用作函数触发器之前在部署中创建队列,这会很好地工作。

但是如果我尝试同时部署它们,它会在尝试创建事件源映射时失败并显示此错误:

Invalid request provided: Error occurred while ReceiveMessage. SQS Error Code: AWS.SimpleQueueService.NonExistentQueue. SQS Error Message: The specified queue does not exist for this wsdl version.

Fn::Join 启用字符串连接,它不会通知无服务器框架 (SF) 关于函数对队列的依赖性。

我们视觉上可以看到,但需要声明性地

要使这个 link 对 SF 显而易见,请改用 Fn::GetAtt:

它将通知 Serverless Framework Lambda 函数对 SQS 队列的依赖性。

这应该有效:

functions:
  consumer:
    handler: App\Service\Consumer
    events:
      - sqs:
          arn:
            Fn::GetAtt:
              - SkillAssignerQueue
              - Arn
resources:
  Resources:
    SkillAssignerQueue:
      Type: AWS::SQS::Queue
      Properties:
        QueueName: ${opt:stage}-skill-assigner

无服务器框架可以自动为您创建队列。无需在资源中定义它