如何在 Serverless 框架中实现步骤功能的别名

How to implement the alias for a step function in Serverless framework

在我的项目中,我使用 serverless-aws-aliasserverless 将我的代码和所有内容部署到 AWS。我有 lambda 函数,它们是 devprod 版本的别名。每次我进行更改时,我都会先使用无服务器命令提示符工具部署 dev 版本,并确保一切正常,然后再使用相同的工具部署 prod 版本。

一切正常(或多或少),但是当我试图在我的 serverless.yml 文件中包含阶跃函数定义时,我遇到了限制。虽然 lambda 函数在 AWS 中可以有版本和别名,但步骤函数没有这样的功能。到目前为止,我已经测试了这个(这是一个失败):

stepFunctions:
  stateMachines:
    MyStepFunction:
      name: MyStepFunction-${opt:alias}
      .
      .
      .

虽然这确实创建了一个类似于 MyStepFunction-dev 的阶梯函数,但问题是一旦我创建了 prod 版本,它就会删除 dev 版本( serverless 假设我正在重命名 step 函数)。更糟糕的是,如果我创建 dev 版本,它会删除 prod 版本,这当然是不可接受的。

有谁知道我如何使用我的 serverless.yml 中的一个定义来实现两个步进函数,一个用于 dev,一个用于 prod

与其使用这样的别名,我建议利用 Serverless 中的 "stages"。

provider:
  name: aws
  runtime: nodejs8.10
  stage: ${opt:stage, 'dev'} # Set the default stage used. Default is dev

然后就命名你的步骤函数而言,它会是这样的:

stepFunctions:
  stateMachines:
    MyStepFunction:
      name: MyStepFunction-${opt:stage}

然后当您部署时,它将类似于 sls deploy --stage devsls deploy --stage prod。这将使用两个不同的堆栈,并且您不会 运行 因为它认为您重命名了它而被删除的东西!

这就是我最终实现它的方式(不一定是适合所有人的最佳解决方案):

我将 serverless.yml 文件拆分为两个文件。我将 lambda 函数定义保存在一个文件中,然后将步骤函数定义移到一个单独的文件中。当然,serverless 框架是不允许重命名 serverless.yml 文件的,这意味着我刚才提到的两个文件不能同时存在于同一个文件夹中。

我的 lambda 函数 yaml 文件如下所示:

service:                      Lambda-Functions

provider:
  name:                       aws
  stage:                      ${opt:stage, 'dev'}

plugins:
- serverless-aws-alias
- serverless-pseudo-parameters

functions:
  func1:
    name:                     func1
    handler:                  src/func1.handler
    environment:
      STEP_FUNCTIONS_ARN:     arn:aws:states:#{AWS::Region}:#{AWS::AccountId}:stateMachine:MyStepFunction-${opt:alias}

我会这样部署它:

$ sls deploy --stage dev --alias dev
$ sls deploy --stage dev --alias prod

另一个 yaml 文件(用于步骤函数)如下所示:

service:                 Step-Functions

provider:
  name:                  aws
  stage:                 ${opt:stage, 'dev'}

plugins:
- serverless-step-functions
- serverless-pseudo-parameters

stepFunctions:
  stateMachines:
    MyStepFunction:
      name:              MyStepFunction-${opt:stage}
        definition:
          StartAt:       StartState
          States:
            StartState:
              Type:      Task
              Resource:  arn:aws:lambda:#{AWS::Region}:#{AWS::AccountId}:function:some-func:${opt:stage}
              Next:      SomeState

我会这样部署它:

$ sls deploy --stage dev
$ sls deploy --stage prod

我并不是说它完美无缺,但它确实有效。在上面给出的示例中,func1 应该实例化步进函数的实例 MyStepFunction 这就是为什么它需要步进函数的 ARN。