本地SAM API的Lambda无法连接Postgres的Docker网络问题排查
SAM本地Lambda无法连接Postgres数据库的问题排查与解决
核心原因
Docker容器内的localhost指向容器自身,而非宿主机。你的Postgres运行在独立容器中,且与SAM启动的Lambda容器同属自定义Docker网络,但Lambda代码中用localhost作为数据库host,导致容器内部无法找到Postgres服务。
解决步骤
修改数据库连接字符串的host值
由于Postgres容器启动时指定了名称postgres_db_new,且与Lambda容器在同一my-sam-network网络内,容器间可通过名称直接通信。将连接字符串的host改为容器名称:connStr := "host=postgres_db_new port=5432 user=local_db password=local_db dbname=vigitrack sslmode=disable"使用网络名称而非ID启动SAM
启动SAM时建议使用自定义网络的名称my-sam-network,而非自动生成的网络ID,避免ID变动导致的问题:sam local start-api --docker-network my-sam-network可选:验证容器间连通性
若问题仍存在,可进入Lambda容器测试与Postgres容器的连通性:# 列出运行中的容器,找到SAM Lambda容器ID docker ps # 进入Lambda容器 docker exec -it <lambda-container-id> /bin/sh # 测试ping Postgres容器 ping postgres_db_new
补充说明
本地环境能正常连接是因为宿主机的localhost指向自身,Postgres容器通过-p 5432:5432将端口映射到了宿主机,所以宿主机可以直接访问。但Lambda运行在独立容器中,localhost仅代表该容器内部,无法直接映射到宿主机的端口。
内容的提问来源于stack exchange,提问作者Sebastian Luna
相关产品推荐
相关产品推荐

