实操:serverless-step-functions-local

目录

问题

依赖组件

调用流程

代码设置

1、安装依赖插件:

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

3、业务代码中使用本地stepfunction

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、业务代码中使用本地stepfunction

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的创建

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值