无服务器框架Step Functions中的预置并发
本文将为在AWS Step Functions中使用Lambda函数并希望保持函数热启动状态的开发者提供简短但实用的指导。配置过程并不像我最初想象的那么简单——仅仅在函数配置中调整provisionedConcurrency
值是不够的。简而言之,必须在step function配置中指定预置并发别名,状态机才能使用它。
让我们从一个最小化的step function示例开始:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
service: step-function-test
frameworkVersion: '3'
provider:
name: aws
runtime: python3.10
timeout: 60
memorySize: 512
versionFunctions: false
stage: ${opt:stage, "sbx"}
region: us-east-1
functions:
hello:
handler: handler.hello
hi:
handler: handler.hi
stepFunctions:
stateMachines:
helloStepFunc:
name: 'hello'
definition:
Comment: "A Hello World example"
StartAt: HelloWorld
States:
HelloWorld:
Type: Task
Resource: !GetAtt hello.Arn
Next: HiWorld
HiWorld:
Type: Task
Resource: !GetAtt hi.Arn
End: true
plugins:
- serverless-step-functions
|
这些Lambda函数当然没有配置预置并发,可能会遭受冷启动问题。如果我们简单地在serverless.yml中启用它,部署并再次调用step function,我们不会看到任何改进。查看日志,我们可以识别被调用的版本:
step function当前配置为调用Lambda的$LATEST
版本。关于配置预置并发的文档描述了这个问题:
预置并发不支持函数的未发布版本($LATEST
)。在配置预置并发之前,请确保您的客户端应用程序没有指向$LATEST
。
在这种情况下,客户端应用程序是状态机配置。使用无服务器框架对provisionedConcurrency
的内置支持,我们可以启用它并推断别名。Serverless生成预置并发别名的方式如下:
1
2
3
|
getLambdaProvisionedConcurrencyAliasLogicalId(functionName) {
return `${this.getNormalizedFunctionName(functionName)}ProvConcLambdaAlias`;
}
|
以下是更新后的serverless.yml:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
service: step-function-test
frameworkVersion: '3'
provider:
name: aws
runtime: python3.10
timeout: 60
memorySize: 512
versionFunctions: false
stage: ${opt:stage, "sbx"}
region: us-east-1
functions:
hello:
handler: handler.hello
provisionedConcurrency: 3
hi:
handler: handler.hi
provisionedConcurrency: 3
stepFunctions:
stateMachines:
helloStepFunc:
name: 'hello'
definition:
Comment: "A Hello World example"
StartAt: HelloWorld
States:
HelloWorld:
Type: Task
Resource: !Ref HelloProvConcLambdaAlias
Next: HiWorld
HiWorld:
Type: Task
Resource: !Ref HiProvConcLambdaAlias
End: true
plugins:
- serverless-step-functions
|
注意:当与Ref
一起使用时,AWS::Lambda::Alias
资源直接返回ARN。
现在我们可以使用sls invoke stepf -n helloStepFunc
调用step function,并在CloudWatch日志中看到版本已更新。