无服务器条件函数部署

Serverless conditional function deployment

以下配置是从我的 serverless.yml

中提取的
service: test-svc

provider:
  name: aws
  ...

functions:
  apiHandler:
    handler: index.handler
    events:
      - http: ANY /
      - http: 'ANY {proxy+}'
  taskHandler:
    handler: task.handler
    events:
      - sqs:
          ...
  alexaHandler:
    handler: alexa.handler
    events:
     - alexaSmartHome: ...

我只想在 region-a

中部署 apiHandlertaskHandler 函数

并在 region-bregion-cregion-d 中部署 alexaHandler

如果我执行命令 sls deploy --region us-east-1 将部署所有三个函数,但我不需要那个。我只需要部署 2 个函数。

  1. 使用 sls deploy function 不是一个选项,因为它只交换 zip 文件。
  2. 将 alexaHandler 放入带有新 serverless.yml 的子目录中无效,因为部署仅打包子目录,不会包含父目录中的代码。 (很多代码在3个函数之间共享)

有什么处理这个要求的建议吗?

在浏览了所有无服务器插件列表后,我发现上述要求可以通过 serverless-plugin-select

实现

使用此插件,我们可以 select 根据 stageregion 值仅部署 serverless.yml 中的几个功能。在我的例子中使用区域值。

修改如下serverless.yml。添加了 plugins 部分并在每个函数中添加了 regions 键。

service: test-svc


plugins:
  - serverless-plugin-select

provider:
  name: aws
  ...

functions:
  apiHandler:
    ...
    regions:
      - us-west-2
  taskHandler:
    ...
    regions:
      - us-west-2
  alexaHandler:
    ...
    regions:
      - eu-west-1
      - us-east-1
      - us-west-2

使用上述配置,我使用以下 bash 脚本为所有区域部署。

#!/usr/bin/env bash

serverless deploy --region eu-west-1
serverless deploy --region us-east-1
serverless deploy --region us-west-2

您可以通过将条件函数存储在自定义变量中来有条件地 select serverless.yml 中的值

### serverless.yml
provider:
  name: << aws or your provider >>
  runtime: << your runtime, eg nodejs8.10 >>
  region: << your aws region >>
  stage: ${opt:stage, 'dev'}
  custom:
    extraCode:
      dev:
      testing: ${file(testing_only/testing_endpoints.yml)}
      prod:

...

## and then at the functions section of serverless.yml

functions:
  - ${file(functions/someFunctionsInAFile.yml)}
  - ${file(functions/someMoreFunctions.yml)}
  - ${self:custom.extraCode.${self:provider.stage}}

当你部署无服务器时,你应该传入命令行选项--stage=myStageName,这样当你传入--stage=dev--stage=prod时,函数部分的最后一行将为空白并且什么都不会部署。

如果您传入 --stage=testing 函数部分的最后一行将填充您的自定义变量部分中设置的文件,然后您的测试代码将被部署。