You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过SAM Local API调用本地Lambda函数失败,求排查解决

问题分析与解决方向

核心原因

你遇到的连接失败问题,本质是Docker容器内的localhost指向容器自身,而非宿主机。Flask运行在SAM启动的Docker容器中,代码里写的http://localhost:3001实际访问的是Flask容器内部的3001端口,而非宿主机上运行的sam local start-lambda服务。


具体解决方法

方法1:使用宿主机在Docker网络中的IP

  1. 先查询宿主机在sam-network网络中的网关IP:
    docker network inspect sam-network
    
    在输出中找到Gateway字段,值通常是172.xx.xx.1格式。
  2. 修改Flask代码中的endpoint_url为该IP:
    lambda_client = boto3.client("lambda", endpoint_url="http://172.xx.xx.1:3001", use_ssl=False)
    

方法2:使用Docker容器名称访问(推荐)

利用Docker同网络下的容器名称解析功能:

  1. 启动本地Lambda服务时指定容器名:
    sam local start-lambda --docker-network sam-network --container-name email-sender-lambda
    
  2. 修改Flask代码中的endpoint_url为容器名称:
    lambda_client = boto3.client("lambda", endpoint_url="http://email-sender-lambda:3001", use_ssl=False)
    
    两个容器在同一sam-network网络中,Docker会自动解析容器名称对应的IP。

方法3:使用SAM Local原生服务发现(更贴近生产逻辑)

SAM Local支持本地Lambda函数间的自动调用,无需手动指定endpoint:

  1. 修改Flask代码,移除手动指定的endpoint_url:
    # SAM会自动处理本地函数调用路由
    lambda_client = boto3.client("lambda")
    
  2. 确保启动API和Lambda服务时都加入同一Docker网络:
    sam local start-api --docker-network sam-network
    sam local start-lambda --docker-network sam-network
    
    SAM会自动识别同网络下的本地Lambda函数,完成调用转发。

额外检查项

  • 确认两个服务都加入了sam-network网络,启动命令均包含--docker-network sam-network参数;
  • 验证宿主机上curl http://localhost:3001/2015-03-31/functions/EmailSender/invocations能正常响应;
  • 使用容器名称访问时,确保启动Lambda服务的容器名与代码中拼写完全一致。

内容的提问来源于stack exchange,提问作者Jacob Heath

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 06:27:55