实操: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的创建

相关推荐
麦麦麦当劳大王9 小时前
【油猴脚本】Boss直聘 岗位职责复制
开发语言·前端·javascript
只睡四小时10 小时前
Three.js Sub-tick:漏判 60.7%→0
开发语言·javascript·性能优化·ecmascript·游戏开发·three.js·碰撞检测
excel11 小时前
基于 GPT 的自动发布文章接口方案:从一句话或一张图片生成并发布内容
前端·javascript·后端
OpsEye16 小时前
大模型 Token 计量不准,是什么原因,怎么解决??
javascript·ai编程
独隅18 小时前
WebStorm Windows 版 React / Next.js 实战替换指南
javascript·windows·webstorm
冷眸_18 小时前
同名食材不能直接相减:一个 JavaScript 用量模型的边界
javascript
apollo_qwe18 小时前
接口超时了,前端为什么不能直接重试?
javascript·http
toooooop81 天前
CRMEB 故障排查笔记:安全网关只放行 GET/POST 怎么办
前端·javascript·vue.js·thinkphp6·crmeb
软件技术NINI1 天前
基于SpringBoot和Vue的项目评审系统
javascript·vue.js·spring boot·后端·spring·毕业设计·毕设
vipxieliang1 天前
JavaScript 模板字符串与标签模板:不只是拼接
前端·javascript