使用无服务器框架,我如何使我的Lambda函数依赖于来自resources
节的SQS队列,因为它是函数本身的触发器?
在我的serverless.yaml
中,我定义了一个新的队列和Lambda函数。
然后,我想使用队列作为Lambda函数的事件源(触发器)。
我通过手动创建队列ARN来实现:
functions:
consumer:
handler: AppServiceConsumer
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
如果在将队列用作函数触发器之前在部署中创建队列,则可以正常工作。
但是如果我尝试部署它们两个,当它试图创建事件源映射时,它会失败并出现以下错误:
无效请求提供:接收消息时发生错误。SQS错误代码:AWS.SimpleQueueService.NonExistentQueue。SQS错误消息:指定的队列不存在此wsdl版本。
Fn::Join
启用字符串连接,这不会通知无服务器框架(SF)关于该函数对队列的依赖。
我们视觉可以看到,但它需要以声明的方式完成。
为了使这个链接对SF明显,使用Fn::GetAtt:
代替。
它将通知Serverless Framework关于Lambda函数对SQS队列的依赖。
这个应该可以工作:
functions:
consumer:
handler: AppServiceConsumer
events:
- sqs:
arn:
Fn::GetAtt:
- SkillAssignerQueue
- Arn
resources:
Resources:
SkillAssignerQueue:
Type: AWS::SQS::Queue
Properties:
QueueName: ${opt:stage}-skill-assigner
无服务器框架可以自动为您创建队列。不需要在resources
中定义它