问题:在基于无服务器框架的Lambda上拥有可选资源的最佳方法是什么?
我想让无服务器关心Lambda在较低环境(开发,测试,登台)上所需的资源,并为更高环境(如生产)提供独立资源。
我正在考虑使用像
这样的东西resources:
Resources: ${file(../${self:provider.stage}-resources.yml)}
我的资源yml如下所示:
SQSQueue:
Type: AWS::SQS::Queue
Properties:
QueueName: ${self:service}-${self:provider.stage}-queue
SNSTopic:
Type: AWS::SNS::Topic
Properties:
DisplayName: TEST SNS Topic
TopicName: ${self:service}-${self:provider.stage}-topic
SNSSubscription:
Type: AWS::SNS::Subscription
Properties:
Endpoint: mail@email.com
Protocol: email
TopicArn: { "Fn::Join" : ["", ["arn:aws:sns:${self:provider.region}:", { "Ref" : "AWS::AccountId" }, ":${self:resources.Resources.SNSTopic.Properties.TopicName}" ] ] }
但它不起作用。关于什么是实现这一目标的最佳实践的任何想法?
答案 0 :(得分:2)
取而代之:
TopicArn: { "Fn::Join" : ["", ["arn:aws:sns:${self:provider.region}:", { "Ref" : "AWS::AccountId" }, ":${self:resources.Resources.SNSTopic.Properties.TopicName}" ] ]
用这个:
TopicArn: {"Ref" : "SNSTopic"}
解决了我的问题。
答案 1 :(得分:0)
问题中的描述着重于将所有资源都放在一个资源文件中,并且每个阶段使用不同的此类文件。此方法有效,但有一个限制,您必须在每个阶段中至少放置一个资源。而且还迫使您将资源分组在一起。
另一种包含我在[{prehab: 2}, {skillTechnique: 2}, {strengthPrimary: 2}, {strengthSecondary: 1}, {strengthIsolation: 3}, {mobility: 1}]
中使用的可选资源的方法如下:
serverless.yml
然后,您仅创建provider:
name: aws
stage: ${opt:stage, 'dev'}
resources:
- ${file(./sls-resources/mandatory-resource.yml)}
- ${file(./sls-resources/optional-resource.${self:provider.stage}.yml), ''}
来保存仅生产资源。在为dev阶段生成模板时,lessless会将可选引用解析为一个空元素,因为该文件不存在,然后将其忽略。
请注意,我仅以stage变量为例,但它可以是任何其他变量,例如地区或自定义变量。