本地模拟SQS触发Lambda并调用云端Lambda的测试方案咨询
「本地SQS→本地Lambda→AWS云端Lambda」模拟测试实现方案
问题场景
业务流程为:SQS触发待测试Lambda,该Lambda可触发AWS云端已部署的其他Lambda。已通过serverless-offline实现Lambda本地测试,现需测试「本地SQS触发本地Lambda,本地Lambda调用云端Lambda」的场景,本地Lambda调用云端Lambda的代码如下:
params = { FunctionName: lambdaName, InvocationType: 'RequestResponse', LogType: 'None', Payload: JSON.stringify(event) }; response = await lambda.invoke(params).promise();
实现步骤
1. 搭建本地SQS模拟环境
- 安装
serverless-offline-sqs插件,在serverless.yml的plugins节点添加该插件 - 用Docker启动ElasticMQ作为本地SQS模拟器:
docker run -p 9324:9324 softwaremill/elasticmq - 在
serverless.yml中配置SQS触发器的本地端点,指向http://localhost:9324 - 启动serverless-offline服务:
sls offline start
2. 调整本地Lambda的AWS SDK配置
- 利用
serverless-offline自动设置的process.env.IS_OFFLINE环境变量,区分本地与线上环境 - 本地环境下,直接初始化指向云端的Lambda客户端(指定云端Lambda所在区域),而非本地模拟器
- 调整后的代码示例:
const AWS = require('aws-sdk'); // 本地环境直接调用云端Lambda,线上环境保持原有配置 const lambda = process.env.IS_OFFLINE ? new AWS.Lambda({ region: 'us-east-1' }) // 替换为你的云端Lambda实际区域 : new AWS.Lambda(); // 原有调用逻辑无需修改 const params = { FunctionName: lambdaName, InvocationType: 'RequestResponse', LogType: 'None', Payload: JSON.stringify(event) }; const response = await lambda.invoke(params).promise();
3. 配置本地AWS凭证权限
- 确保本地使用的AWS凭证(
~/.aws/credentials)对应的IAM实体,拥有调用目标云端Lambda的lambda:InvokeFunction权限 - 在AWS IAM控制台为该实体添加包含该权限的自定义策略
4. 测试验证
- 向本地SQS队列发送测试消息:
aws sqs send-message --queue-url http://localhost:9324/queue/your-queue-name --message-body '{"test": "data"}' --endpoint-url http://localhost:9324
- 查看
serverless-offline日志,确认本地Lambda被触发且成功发起云端调用 - 检查云端Lambda的CloudWatch日志,验证请求是否正常处理
内容的提问来源于stack exchange,提问作者enigmatic
相关产品推荐
相关产品推荐

