如何在 Serverless 框架中实现步骤功能的别名
How to implement the alias for a step function in Serverless framework
在我的项目中,我使用 serverless-aws-alias
和 serverless
将我的代码和所有内容部署到 AWS。我有 lambda 函数,它们是 dev
和 prod
版本的别名。每次我进行更改时,我都会先使用无服务器命令提示符工具部署 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 dev
或 sls 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。
在我的项目中,我使用 serverless-aws-alias
和 serverless
将我的代码和所有内容部署到 AWS。我有 lambda 函数,它们是 dev
和 prod
版本的别名。每次我进行更改时,我都会先使用无服务器命令提示符工具部署 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 dev
或 sls 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。