使用SAM时如何让Lambda连接Mac本地localhost的数据库?
SAM本地Lambda连接Mac本地端口转发数据库的解决方法
问题概述
Lambda与RDS同属VPC,开发仅能通过Bastion实例访问RDS。SAM本地测试无数据库依赖的API正常,但依赖数据库的API无法直接访问Gamma环境RDS。已通过SSM代理在Bastion上完成端口转发,Mac本地127.0.0.1:3306可正常连接数据库,但Lambda容器内访问该地址报Connection refused,使用host.docker.internal:3306报Name or service not known。
解决方案
方案1:让Lambda容器使用Mac主机网络
SAM默认创建独立Docker网络,若让Lambda容器直接复用Mac的网络栈(仅支持Mac/Linux),可直接访问本地转发端口:
- 临时运行:执行SAM命令时添加
--docker-network host参数# 调用单个Lambda函数 sam local invoke --docker-network host YourLambdaFunction # 启动本地API网关 sam local start-api --docker-network host - 持久化配置:在项目根目录
sam.toml中添加全局配置
配置完成后,Lambda代码中直接连接[default.parameters] docker_network = "host"127.0.0.1:3306即可访问Mac本地转发的数据库。
方案2:自定义Docker网络并配置host.docker.internal解析
若不想使用主机网络,可手动创建Docker网桥并指定主机映射:
- 创建自定义Docker网络
docker network create sam-local-network --driver bridge --subnet 192.168.0.0/16 - 运行SAM时指定该网络,并添加主机映射参数
此时Lambda代码中使用sam local invoke YourLambdaFunction --docker-network sam-local-network --add-host host.docker.internal:host-gatewayhost.docker.internal:3306即可连接Mac本地的转发端口。
方案3:本地数据库镜像替代测试
若Gamma环境数据库结构可复刻,可在本地启动同版本数据库镜像,导入Gamma数据后直接测试:
- 启动本地MySQL镜像(示例)
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=yourpassword mysql:8.0 - 修改Lambda数据库连接配置,指向
host.docker.internal:3306(或用方案1的主机网络连接127.0.0.1:3306)
注意事项
- 使用主机网络时,Lambda容器会共享Mac的端口资源,需注意端口冲突
host-gateway参数要求Docker版本≥20.10,请确保本地Docker版本符合要求
内容的提问来源于stack exchange,提问作者bluprince13
相关产品推荐
相关产品推荐

