目录
问题
依赖组件
调用流程
代码设置
1、安装依赖插件:
2、serverless.yml配置,我这里只提供stepfunction依赖的配置
3、业务代码中使用本地stepdunction
4、启动serverless offline
5、docker 安装启动stepfunction
⚠️注意
1、docker访问宿主机
2、访问offline-lambda的地址
3、启动serverless要使用sls offline start
呼... 盲区太多,折磨了我好久终于搞通了,输出一篇经验贴帮大家填坑
问题
在我的业务中使用了aws stepFunction,每个节点都是一个lambda,每当工作流结点涉及有修改时,都必须要部署到aws云上才能测试,比较浪费时间,又因为我现在开发环境只有一套测试环境,如果有bug,就会影响测试的主流程,测试非常不便捷
然后我就发现了这个插件:serverless-step-functions-local,能够实现本地启动工作流,工作流的lambda节点也是访问我本机启动的lambda,完全支持本地自测
依赖组件
npm给的指导依赖是:
aws 文档也给出了两种方案在本地测试状态机 - AWS Step Functions
1、使用docker,在docker中安装amazon/aws-stepfunctions-local,相当于之前在aws云上启动的工作流,变为在docker中运行
2、使用stepfunction的JAR文件,这个是在本机上安装了stepfunction的可执行文件,看文档说明应该是要和aws cli结合使用的,没有细研究
我的场景是在代码中调用api启动stepfunction,团队中每个人都会用到,所以我采取了第一种方案,使用的docker,再结合脚本文件自动检查安装和启动stepfunction,实现0成本启动
调用流程
所以我实现的调用流程如图所示:
代码设置
1、安装依赖插件:
- serverless-step-functions
- serverless-step-functions-local
- serverless-offline-lambda
- serverless-offline
2、serverless.yml配置,我这里只提供stepfunction依赖的配置
custom:
serverless-offline:
httpPort: 3010
useInProcess: true
host: 0.0.0.0 这个一定要设置,不设置默认是localshot,表示只能localhost能访问,我一开始没设置导致docker中容器一直无法访问我的lambda
stepFunctionsLocal:
accountId: 101010101010
region: us-east-1
TaskResourceMapping: #stepfunction定义中的Resource替换为本地arn,使得其调用本地的lambda
SetupProduct: arn:aws:lambda:us-east-1:101010101010:function:${self:provider.stage}-setup-product
CompleteOrder: arn:aws:lambda:us-east-1:101010101010:function:${self:provider.stage}-complete-order
SendMessage: arn:aws:lambda:us-east-1:101010101010:function:${self:provider.stage}-send-message
CatchAllFallback: arn:aws:lambda:us-east-1:101010101010:function:${self:provider.stage}-fallback
externalInstance: true
stepFunctions: //这个就是stepfunction的定义,按你的业务要求写即可
3、业务代码中使用本地stepdunction
const stepFunctions = new StepFunctions({
endpoint: 'http://localhost:8083', // 连接到本地 Step Functions Local
})
4、启动serverless offline
sls offline start
5、docker 安装启动stepfunction
docker pull amazon/aws-stepfunctions-local
docker run -d \
--name step-function-local \
-p 8083:8083 \
-e "AWS_ACCOUNT_ID=101010101010" \ #和custom.stepFunctionsLocal.accountId一致
-e "AWS_DEFAULT_REGION=us-east-1" \ #和custom.stepFunctionsLocal.region 一致
-e "LAMBDA_ENDPOINT=http://host.docker.internal:3002" \ #访问到本机的lambda
amazon/aws-stepfunctions-local
⚠️注意
1、docker访问宿主机
LAMBDA_ENDPOINT=http://host.docker.internal:3002
访问到本机lambda host用的是host.docker.internal,因为stepfunction是运行在docker容器中的,localhost访问的是容器内部的localhost,不能访问到宿主机上
host.docker.internal 会被自动解析为宿主机的ip
2、访问offline-lambda的地址
因为我的服务启动之后出现了好几个port,我不太清楚究竟使用哪一个,根据serverless-offline说明文档,3002是默认的lambda port
如果不确定,可以在启动本地服务之后,在js文档中调用lambda api测试,哪个port测试通了就用哪个,给个测试demo
3、启动serverless要使用sls offline start
我的服务中使用的是sls offline,但必须要加上start,因为serverless-offline留了很多钩子的入口,这个命令才会触发,比如本次场景中stepfunction machine的创建