Closed7
Nuxt3 + aws-lamdaでbuild→serverlessでデプロイするとInternal Server Error
推測される原因はnodeのバージョン
{
"errorType": "Error",
"errorMessage": "Cannot find module './.output/server/index.js'\nRequire stack:\n- /var/task/s_NuxtSsrEngine.js\n- /var/runtime/index.mjs",
"code": "MODULE_NOT_FOUND",
"requireStack": [
"/var/task/s_NuxtSsrEngine.js",
"/var/runtime/index.mjs"
],
"stack": [
"Error: Cannot find module './.output/server/index.js'",
"Require stack:",
"- /var/task/s_NuxtSsrEngine.js",
"- /var/runtime/index.mjs",
" at Module._resolveFilename (node:internal/modules/cjs/loader:1075:15)",
" at _require.i.require (/var/task/serverless_sdk/index.js:9:73131)",
" at require (node:internal/modules/cjs/helpers:110:18)",
" at Object.<anonymous> (/var/task/s_NuxtSsrEngine.js:25:23)",
" at Module._compile (node:internal/modules/cjs/loader:1254:14)",
" at Module._extensions..js (node:internal/modules/cjs/loader:1308:10)",
" at Module.load (node:internal/modules/cjs/loader:1117:32)",
" at Module._load (node:internal/modules/cjs/loader:958:12)",
" at Module.require (node:internal/modules/cjs/loader:1141:19)",
" at require (node:internal/modules/cjs/helpers:110:18)"
]
}
開発環境はnode:18.13.0
lamda
のランタイムもNode.js 18.x
serverless.yml
もnodejs18.x
を指定
provider:
name: aws
stage: dev
runtime: nodejs18.x
region: ap-northeast-1
serverless
がNodejs18.x
、aws-sdk-v3
をまだサポートしていない
Node.js 18.x
で試した人がいるからできる?
試しに公式のテンプレートを参考に関数を追加してみる。
handler.ts
export async function hello(event) {
return {
message: 'Go Serverless v3! Your function executed successfully!',
input: event,
}
}
serverless.yml
functions:
NuxtSsrEngine:
runtime: nodejs18.x
handler: '.output/server/index.handler'
url: true
events:
- httpApi:
method: ANY
path: /api
++ hello:
++ handler: handler.hello
ローカルで実行
> serverless invoke local --function hello
Error: Cannot find module './handler.js'
公式テンプレートが動かないことはなさそうだと思うので、なにか設定たりてなさそう。
公式テンプレート確認するとserverless.yml
にplugin
を指定しているので追加してみる
serverless.yml
functions:
NuxtSsrEngine:
handler: '.output/server/index.handler'
url: true
events:
- httpApi:
method: ANY
path: /api
hello:
handler: handler.hello
++ plugins:
++ - serverless-esbuild
plugin
もインストールする
> yarn add -D esbuild
> yarn add -D serverless-esbuild
package.json
"devDependencies": {
...
++ "esbuild": "^0.17.18",
++ "serverless-esbuild": "^1.43.1"
...
}
改めてローカル実行
> serverless invoke local --function hello
{
"message": "Go Serverless v3! Your function executed successfully!",
"input": {}
}
正常に動いたので、元のNuxtの方で試す。
> serverless invoke local --function NuxtSsrEngine
Error: Compilation failed. Please ensure you have an index file with ext .ts or .js, or have a path listed as main key in package.json
やはりindex.mjs
(Node18)は対応してなさそう?nuxt
のbuild
設定でjs
出力されれば動くかもしれないけど、config
にある?
試してだめだったこと
-
nuxt.config.ts
のbuild.target
を変更 -
serverless-esbuild
のオプションでtarget:"node18"
を設定する - https://github.com/floydspace/serverless-esbuild
結局serverless
がNode.js 18.x
に対応していないことにより困難。
デプロイのタイミングまできてnodeのバージョン下げられないこと、16のEOLも近いという2点からserverless
を使わずにデプロイする方法を考えることにする
このスクラップは2023/05/04にクローズされました