代码之家  ›  专栏  ›  技术社区  ›  Mehran

如何在无服务器框架中实现步骤函数的别名

  •  0
  • Mehran  · 技术社区  · 6 年前

    在我的项目中,我使用 serverless-aws-alias 沿着 serverless 把我的代码和所有东西部署到AWS。我有lambda函数,它的别名是 dev prod 版本。每次进行更改时,我都首先使用无服务器命令提示工具来部署 DEV 在使用相同的工具部署 产品 版本。

    这一切都很好(或多或少)但是当我试图在我的 serverless.yml 文件,我面临着一个限制。虽然lambda函数在AWS中可以有版本和别名,但是步骤函数没有这样的功能。到目前为止,我已经测试过(这是一个失败):

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

    虽然这确实创建了一个类似 MyStepFunction-dev 但问题是一旦我创建了 普罗德 版本,它将删除 DEV 版本(Serverless假定我正在重命名step函数)。更糟糕的是,如果我创造了 DEV 版本,它将删除 普罗德 当然是不可接受的版本。

    有人知道我怎么能有两个步骤的功能吗,一个用于 DEV 一个 普罗德 ,在我的 Servel.YML ?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Jared Short    6 年前

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

    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 dev sls deploy --stage prod . 这将使用两个不同的堆栈,您不会遇到被删除的东西,因为它认为您重命名了它!

        2
  •  0
  •   Mehran    6 年前

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

    我把我的心分开 serverless.yml 归档成两个文件。我将lambda函数定义保存在一个文件中,然后将步骤函数定义移动到单独的文件中。当然,无服务器框架不允许您重命名 Servel.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 应该实例化step函数的一个实例 MyStepFunction 这就是为什么它需要步骤函数的arn。