部署AWS Lambda与API Gateway获取客户端IP报错排查求助
问题根因
报错Cannot read property 'sourceIP' of undefined的核心原因是配置不匹配:你在API Gateway映射模板中定义的sourceIP字段位于传入Lambda的event对象根级,但Lambda代码中尝试读取的路径是event.identity.sourceIP,路径不存在导致取值报错。
快速修复方案
两种修复方式二选一即可,修改完成后必须重新部署API到对应阶段,新配置才会生效:
- 方案1(改Lambda代码,无需调整API配置):
保留现有API Gateway映射模板配置,直接替换Lambda函数代码为如下内容,同时对齐官方checkip服务的纯文本返回格式:
'use strict'; console.log('Loading function'); exports.handler = (event, context, callback) => { const clientIp = event.sourceIP; console.log('SourceIP =', clientIp); callback(null, { statusCode: 200, headers: { 'Content-Type': 'text/plain', 'Access-Control-Allow-Origin': '*' }, body: clientIp }); };
- 方案2(改映射模板,无需调整Lambda代码):
保留原有Lambda代码,进入Integration Request的Mapping Templates配置页,将原有映射模板替换为如下内容,让传入的字段路径和代码取值逻辑匹配:
{ "identity": { "sourceIP": "$context.identity.sourceIp" } }
更优零配置实现方案
不需要手动编写映射模板,直接利用API Gateway传给Lambda的原生请求上下文取值,配置步骤更少,出错概率更低:
- 创建Lambda函数,选择Node.js 14.x及以上版本Runtime,写入如下函数代码:
exports.handler = async (event) => { // 直接从API Gateway原生请求上下文中读取客户端源IP const clientIp = event.requestContext.identity.sourceIp; return { statusCode: 200, headers: { 'Content-Type': 'text/plain' }, body: clientIp }; };
- 进入API Gateway控制台创建REST API,新建GET方法,集成类型选择Lambda,绑定刚才创建的函数,Integration Request配置保持默认,不要添加任何自定义Mapping Templates。
- 按需开启GET方法的CORS配置,完成后将API部署到对应阶段,访问生成的调用URL即可直接得到客户端公网IP,返回行为和官方checkip服务完全一致。
常见踩坑提示:所有API Gateway侧的配置修改,必须执行部署操作后才会在线上生效,仅保存配置不会同步到已发布的API阶段。
内容的提问来源于stack exchange,提问作者kpg11
相关产品推荐
相关产品推荐

