【问题标题】:How to implement the alias for a step function in Serverless framework如何在无服务器框架中实现步进函数的别名
【发布时间】:2018-12-13 22:41:34
【问题描述】:

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

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

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

虽然这确实创建了一个像MyStepFunction-dev 这样的步进函数,但它的问题是,一旦我创建了prod 版本,它就会删除dev 版本(无服务器假设我正在重命名该步骤功能)。更糟糕的是,如果我创建dev 版本,它会删除prod 版本,这当然是不可接受的。

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

【问题讨论】:

  • 这并不能回答您的实际问题,而且我不完全理解您在做什么的上下文,但如果它有用——您可以让一个单步函数运行不同的 Lambda别名。它似乎没有很好的记录,但在docs.aws.amazon.com/step-functions/latest/dg/… 中有描述。您配置"Resource": "arn:aws:states:::lambda:invoke",然后在Parameters 中传递Qualifier。例如,您可以给Qualifier 一个来自阶跃函数输入有效负载的值。 HTH

标签: serverless-framework aws-step-functions


【解决方案1】:

我建议不要使用这样的别名,而是利用无服务器中的“阶段”。

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。这将利用两个不同的堆栈,并且您不会遇到被删除的内容,因为它认为您重命名了它!

【讨论】:

  • 谢谢。虽然您的输入确实有助于我理解阶段和别名之间的区别,但在这种情况下它不起作用。我确实需要在一个阶段中有两个别名。就 lambda 函数而言,两个阶段不能作为两个别名工作。换句话说,如果我使用你提到的阶段,我将面临 lambda 函数的另一个问题。
  • 明白了。我不完全掌握你想要完成的事情。只要在状态机下使用 MyStepFunction2 之类的键,名称为 MyStepFunction-prod 并且还硬编码名为 one 的开发人员,您就应该能够添加第二步函数。它会在每种情况下都部署,但我不知道如何解决这个问题。如果您告诉我更多关于您的案例的信息,我可以尝试更详细地提供帮助,如果您愿意,也很乐意在此配对。
  • 这很简单,我正在尝试为步进函数实现相同的“别名”概念。假设一个 step 函数有两个版本,dev 和 prod。如果你运行开发版,它会调用所有开发版的 lambda 函数。如果您调用它的 prod 版本,则会调用 lambda 函数的 prod 版本。但是由于步进函数不支持别名,所以我必须创建两个步进函数。当然,这两个阶梯函数应该共存。
  • 我可以通过创建两个 setp 函数来手动实现这一点(没有无服务器),但我正在尝试为我的 CI 使用无服务器。
  • 我认为github.com/HyperBrain/serverless-aws-alias/blob/master/… 包含您的答案。但目前实际框架不支持。
【解决方案2】:

这就是我最终实现它的方式(不一定是每个人的最佳解决方案):

我将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 的原因。

【讨论】:

    猜你喜欢
    • 2021-03-10
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    • 2020-08-06
    • 2020-02-25
    • 1970-01-01
    • 2017-05-19
    • 1970-01-01
    相关资源
    最近更新 更多