实操:serverless-step-functions-local

呼... 盲区太多,折磨了我好久终于搞通了,必须输出一篇经验贴

问题

在我的业务中使用了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、安装依赖插件:

diff 复制代码
- serverless-step-functions
- serverless-step-functions-local 
- serverless-offline-lambda 
- serverless-offline 

2、serverless.yml配置,我这里只提供stepfunction依赖的配置

yaml 复制代码
custom: 
    serverless-offline:
        httpPort: 3010
        useInProcess: true
        host: 0.0.0.0 这个一定要设置,不设置默认是localhost,表示只能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、业务代码中使用本地stepfunction

arduino 复制代码
const stepFunctions = new StepFunctions({
    endpoint: 'http://localhost:8083', // 连接到本地 Step Functions Local
})

4、启动serverless offline

sql 复制代码
sls offline start

5、docker 安装启动stepfunction

bash 复制代码
docker pull amazon/aws-stepfunctions-local
perl 复制代码
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=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的创建

相关推荐
一路向前的月光3 小时前
Vue2中的监听和计算属性的区别
前端·javascript·vue.js
长路 ㅤ   3 小时前
vue-live2d看板娘集成方案设计使用教程
前端·javascript·vue.js·live2d
Fan_web3 小时前
jQuery——事件委托
开发语言·前端·javascript·css·jquery
Jiaberrr4 小时前
Element UI教程:如何将Radio单选框的圆框改为方框
前端·javascript·vue.js·ui·elementui
安冬的码畜日常6 小时前
【D3.js in Action 3 精译_029】3.5 给 D3 条形图加注图表标签(上)
开发语言·前端·javascript·信息可视化·数据可视化·d3.js
太阳花ˉ6 小时前
html+css+js实现step进度条效果
javascript·css·html
john_hjy7 小时前
11. 异步编程
运维·服务器·javascript
风清扬_jd7 小时前
Chromium 中JavaScript Fetch API接口c++代码实现(二)
javascript·c++·chrome
yanlele7 小时前
前瞻 - 盘点 ES2025 已经定稿的语法规范
前端·javascript·代码规范