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

ama*_*ert 2 amazon-sqs amazon-web-services aws-lambda serverless-framework

使用无服务器框架,如何使我的 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
Run Code Online (Sandbox Code Playgroud)

并在资源中创建队列:

resources:
  Resources:
    SkillAssignerQueue:
      Type: AWS::SQS::Queue
      Properties:
        QueueName: ${opt:stage}-skill-assigner
Run Code Online (Sandbox Code Playgroud)

如果我在将队列用作函数触发器之前在部署中创建队列,则效果很好。

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

提供的请求无效:接收消息时发生错误。SQS 错误代码:AWS.SimpleQueueService.NonExistentQueue。SQS 错误消息:此 wsdl 版本的指定队列不存在。

Erm*_*ary 9

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

我们可以直观地看到这一点,但需要以声明方式完成。

为了使 SF 能够明显地看到此链接,请Fn::GetAtt:改用。

它将告知无服务器框架 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
Run Code Online (Sandbox Code Playgroud)