如何调试Bref Laravel Serverless Lambda超时问题?
排查与解决Laravel+Lambda部署的超时、500/404问题
核心问题定位:网络连通性缺失
Lambda部署在私有子网且VPC未配置NAT网关,是导致超时的直接原因:
- 私有子网内的Lambda实例无法通过Internet Gateway直接访问公网,必须依赖NAT网关转发出站流量。
- 你的应用需要调用第三方公网API,无NAT网关时这些请求会持续挂起直至超时,进而引发500错误。
解决网络问题步骤
- 创建NAT网关:在VPC的公有子网中部署NAT网关(需绑定弹性IP)。
- 更新路由表:将Lambda所在私有子网的路由表中,
0.0.0.0/0的目标指向新建的NAT网关(移除或替换原指向Internet Gateway的规则)。 - 验证公网访问:编写简单的Lambda测试函数验证连通性:
// 测试公网请求 $client = new \GuzzleHttp\Client(); $response = $client->get('https://example.com'); return $response->getStatusCode();
完善日志排查能力
无详细栈追踪是因为日志配置未适配Lambda环境,调整如下:
- Laravel日志配置:在
.env中设置:
让Laravel错误日志直接输出到Lambda的stderr,同步到CloudWatch。LOG_CHANNEL=stderr APP_DEBUG=true - Serverless日志配置:在
serverless.yml的provider段添加:
开启API Gateway访问日志并保留日志便于排查。provider: logs: restApi: true logRetentionInDays: 7
验证VPC内部资源访问
虽本地能连接数据库和Redis,但Lambda在VPC内的访问仍需确认:
- 安全组规则:
- Lambda的安全组需允许出站访问RDS的
3306端口、ElastiCache的6379端口。 - RDS和ElastiCache的安全组需添加入站规则,允许来自Lambda安全组的对应端口请求。
- Lambda的安全组需允许出站访问RDS的
- 测试内部连接:在Lambda中运行测试代码:
// 测试数据库连接 try { \DB::connection()->getPdo(); return 'DB connected'; } catch (\Exception $e) { return 'DB error: ' . $e->getMessage(); } // 测试Redis连接 try { \Redis::ping(); return 'Redis connected'; } catch (\Exception $e) { return 'Redis error: ' . $e->getMessage(); }
修复API Gateway与Laravel的路由匹配
404错误可能是请求未正确传递到Laravel路由:
- 确认集成类型:API Gateway需使用Lambda代理集成,确保请求的路径、HTTP方法、headers等完整传递给Laravel。
- 路径匹配:若API Gateway的基础路径是
/api,需确保Laravel路由定义在api路由组中:Route::prefix('api')->group(function () { // 你的API路由 }); - 测试直接触发Lambda:通过Lambda控制台的测试功能,模拟API Gateway的代理请求(使用类似如下测试事件),验证Laravel是否能正确处理:
{ "httpMethod": "GET", "path": "/api/your-endpoint", "headers": { "Content-Type": "application/json" } }
临时调整Lambda超时时间
在解决网络问题前,可临时增加Lambda超时时间(默认3秒),确保能获取完整的错误日志:
functions: api: handler: public/index.php runtime: php-8.2-fpm timeout: 10 # 调整为10秒 # 其他配置...
内容的提问来源于stack exchange,提问作者Kristi Jorgji
相关产品推荐
相关产品推荐

