serverless离线启用useDocker时Golang Lambda无法被SQS事件触发
问题解决方案
根因说明
该问题是serverless-offline-sqs插件与serverless-offline的useDocker模式存在兼容性问题导致:默认配置下插件触发函数时仅调用本地runtime执行逻辑,没有适配docker运行时的调用路径,同时docker容器默认无法通过localhost访问宿主机上的本地SQS服务。
可行解决方法
配置调整(优先尝试)
在
serverless.yml的custom段新增如下配置,解决网络访问和适配问题:custom: serverless-offline: useDocker: true host: 0.0.0.0 serverless-offline-sqs: autoCreate: true # 替换为你本地SQS服务的宿主机访问地址,macOS/Windows用host.docker.internal,Linux用172.17.0.1 endpoint: http://host.docker.internal:9324 region: us-east-1 accessKeyId: local secretAccessKey: local注意Golang runtime场景下需将yml内的
runtime配置改为go1.x,不要使用nodejs相关runtime。版本适配
两套经过验证的兼容版本组合二选一即可:
- 低版本稳定组合:
"dependencies": { "serverless-offline": "7.0.0", "serverless-offline-sqs": "4.2.0" }- 高版本修复组合:
"dependencies": { "serverless-offline": "^11.0.0", "serverless-offline-sqs": "^7.0.0" }Golang编译校验
提前将Golang handler编译为Linux amd64架构的二进制文件,并赋予执行权限,避免docker容器内无法执行:
GOOS=linux GOARCH=amd64 go build -o [你的handler名称] [代码路径].go chmod +x [你的handler名称]临时调试方案
如果上述方案仍未生效,可以写本地脚本轮询本地SQS队列,收到消息后调用以下命令触发docker模式下的函数执行:
sls invoke local --useDocker -f [你的函数名] -d '完整的SQS事件JSON'
内容的提问来源于stack exchange,提问作者Ivaylo Ivanov
相关产品推荐
相关产品推荐

