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

abi*_*rto 5 resources amazon-web-services aws-lambda serverless-framework serverless

问题:在基于无服务器框架的 Lambda 上拥有可选资源的最佳方式是什么?

我想让 Serverless 关心 Lambda 在较低环境(开发、测试、暂存)上需要的资源,并为更高的环境(如生产)提供独立的资源。

我正在考虑使用类似的东西

resources: 
    Resources: ${file(../${self:provider.stage}-resources.yml)}
Run Code Online (Sandbox Code Playgroud)

我的资源 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}" ] ]  }
Run Code Online (Sandbox Code Playgroud)

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

Dan*_* C. 5

问题中的描述侧重于在单个资源文件中获取所有资源,并在每个阶段使用不同的此类文件。这可行,但有一个限制,即您必须在每个阶段至少放置一个资源。并且还迫使您将资源组合在一起。

包含我使用的可选资源的另一种方法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), ''}

Run Code Online (Sandbox Code Playgroud)

然后,您只需创建optional-resource.prod.yml以保存仅限生产的资源。在为 dev 阶段生成模板时,无服务器将可选引用解析为空元素,因为该文件不存在,然后将其忽略。

注意我仅将阶段变量用作示例,但它可以是任何其他变量,例如区域或自定义变量。