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 版本的指定队列不存在。
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)
| 归档时间: |
|
| 查看次数: |
1442 次 |
| 最近记录: |