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

相关推荐
成都渲染101云渲染66666 小时前
如何在3ds Max中实现更快、更高质量的渲染
前端·javascript·人工智能
SRET9 小时前
Mineradio 沙盒隔离安装完全指南 | 一键安全运行 Electron 应用!!!
javascript·经验分享·安全·electron·aigc·音视频·ai编程
全栈前端老曹10 小时前
【MongoDB】安全与权限管理 —— 用户认证、角色权限、SSL 加密
前端·javascript·数据库·安全·mongodb·nosql·ssl
free3513 小时前
作用域链与 Environment:变量查找、遮蔽和赋值怎么实现
javascript
YHL13 小时前
🤖 Agent 智能体开发实战 · 第一课:Tool Use —— 让大模型自动干活
前端·javascript·人工智能
HUMHSX15 小时前
Vue 组件通信核心知识点梳理
javascript·vue.js·ecmascript
风止何安啊15 小时前
🚦 前端并发请求 “交通管制”:别让你的接口堵成早高峰
前端·javascript·面试
熊猫钓鱼>_>15 小时前
2026 前端的三场底层革命:当 Vue、React Native 和 Three.js 同时去掉中间层
前端·javascript·vue.js·react native·架构·webgl·three.js
名字还没想好☜15 小时前
React useEffect 依赖数组踩坑:闭包陷阱与清理函数
前端·javascript·react.js·react·useeffect
柒和远方16 小时前
LeetCode 4. 寻找两个正序数组的中位数 —— 二分划分的艺术
javascript·python·算法