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.ymlnodejs18.xを指定

provider:
  name: aws
  stage: dev
  runtime: nodejs18.x
  region: ap-northeast-1
ととかるちょととかるちょ

試しに公式のテンプレートを参考に関数を追加してみる。
https://github.com/serverless/examples/tree/v3/aws-node-typescript

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.ymlpluginを指定しているので追加してみる

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)は対応してなさそう?nuxtbuild設定でjs出力されれば動くかもしれないけど、configにある?

ととかるちょととかるちょ

結局serverlessNode.js 18.xに対応していないことにより困難。
デプロイのタイミングまできてnodeのバージョン下げられないこと、16のEOLも近いという2点からserverlessを使わずにデプロイする方法を考えることにする

このスクラップは2023/05/04にクローズされました