如何在AWS Lambda中运行带experimental-edge runtime的Next.js并生成OG图片
Next.js 13 + @vercel/og 在AWS Lambda中运行Edge Runtime接口500错误问题
我在AWS Lambda中部署带OG图片生成逻辑(依赖@vercel/og的ImageResponse)的Next.js 13.0.6项目,本地开发和生产构建后直接运行都正常,但调用Lambda处理程序时,依赖runtime: 'experimental-edge'的接口始终返回statusCode: 500错误,问题应该出在Edge Runtime的配置上。
我的部署流程与代码
- 执行
next build构建项目,next.config.js中配置了output: 'standalone',生成.next/standalone目录 - 在standalone目录下编写handler.js作为Lambda入口:
const { parse } = require('url'); const NextServer = require('next/dist/server/next-server').default const serverless = require('serverless-http'); const path = require('path'); process.env.NODE_ENV = 'production' process.chdir(__dirname) const currentPort = parseInt(process.env.PORT, 10) || 3000 const nextServer = new NextServer({ hostname: 'localhost', port: currentPort, dir: path.join(__dirname), dev: false, customServer: false, conf: {...} // 从同目录下的server.js中复制配置内容 }); const requestHandler = nextServer.getRequestHandler(); // 将Lambda事件转换为Next服务器可处理的HTTP请求 const handler = serverless(async (req, res) => { try { await requestHandler(req, res); }catch(err){ console.error(err); res.statusCode = 500 res.end('internal server error') } }); module.exports = { handler }
奇怪的现象
用local-lambda本地测试Lambda处理程序,报错和部署到AWS上一致。但.next/standalone目录自带的server.js,配置和我的handler几乎一样,只是多启动了一个HTTP服务器,却能正常处理所有接口请求,包括OG图片生成的Edge接口。
错误日志更新
更新1:初始AWS Lambda错误日志
ERROR [Error [CompileError]: WebAssembly.compile(): Compiling function #64 failed: invalid value type 'Simd128', enable with --experimental-wasm-simd @+3457 ]
更新2:切换Node版本后的新错误
把AWS Lambda的Node版本换成16后,上面的错误消失,但出现新的报错:
{ "errorType": "Error", "errorMessage": "write after end", "trace": [ "Error [ERR_STREAM_WRITE_AFTER_END]: write after end", " at new NodeError (node:internal/errors:372:5)", " at ServerlessResponse.end (node:_http_outgoing:846:15)", " at ServerlessResponse.end (/var/task/node_modules/next/dist/compiled/compression/index.js:22:783)", " at NodeNextResponse.send (/var/task/node_modules/next/dist/server/base-http/node.js:93:19)", " at NextNodeServer.handleRequest (/var/task/node_modules/next/dist/server/base-server.js:332:47)", " at processTicksAndRejections (node:internal/process/task_queues:96:5)", " at async /var/task/index.js:34:5" ] }
内容的提问来源于stack exchange,提问作者romanlv
相关产品推荐
相关产品推荐

