如何在AWS上使用无服务器框架的可选资源

时间:2018-01-09 15:05:49

标签: amazon-web-services resources aws-lambda serverless-framework serverless

问题:在基于无服务器框架的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}" ] ]  }

但它不起作用。关于什么是实现这一目标的最佳实践的任何想法?

2 个答案:

答案 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变量为例,但它可以是任何其他变量,例如地区或自定义变量。