Serverless FrameworkでRuntime.ImportModuleError

2020.10.25
Serverless FrameworkでRuntime.ImportModuleError

Serverless FrameworkでAWSにデプロイした後、Runtime.ImportModuleErrorというエラーが起きました。

$ npx sls invoke -f hello
{
    "errorType": "Runtime.ImportModuleError",
    "errorMessage": "Error: Cannot find module 'source-map-support/register'\nRequire stack:\n- /var/task/handler.js\n- /var/runtime/UserFunction.js\n- /var/runtime/index.js",
    "trace": [
        "Runtime.ImportModuleError: Error: Cannot find module 'source-map-support/register'",
        "Require stack:",
        "- /var/task/handler.js",
        "- /var/runtime/UserFunction.js",
・・・
・・・
Your Environment Information ---------------------------
   Operating System:          darwin
   Node Version:              12.10.0
   Framework Version:         2.8.0 (local)
   Plugin Version:            4.1.1
   SDK Version:               2.3.2
   Components Version:        3.2.3

chromeでアクセスした場合は普通に Internal server error



結論私は「serverless.yml」を修正する事で解決したので、備考欄も含め書いていきます。

検証した環境

1 yarn 1.22.4
2 serverless 2.8.0

プロジェクトを作る際は、
node.jsのTypeScript版( $ sls create -t aws-nodejs-typescript )で作成しています。

起きた事象

ローカル環境で $ sls invoke を実行すると正常に動作するが、AWSにデプロイするとコケる、というものでした。

# ローカルでは実行出来る
$ npx sls invoke local -f hello
・・・
{
    "statusCode": 200,
    "body": "{\n  \"message\": \"Go Serverless Webpack (Typescript) v1.0! Your function executed successfully!\",\n  \"input\": \"\"\n}"
}
# デプロイするとエラー
$ npx sls invoke -f hello
{
    "errorType": "Runtime.ImportModuleError",
    "errorMessage": "Error: Cannot find module 'source-map-support/register'\nRequire stack:\n- /var/task/handler.js\n- /var/runtime/UserFunction.js\n- /var/runtime/index.js",
    "trace": [
        "Runtime.ImportModuleError: Error: Cannot find module 'source-map-support/register'",
        "Require stack:",
        "- /var/task/handler.js",
        "- /var/runtime/UserFunction.js",
・・・

webpackのincludeModulesを設定する

結論としてはserverless.ymlに includeModules: true を設定すれば通るようになりました!

serverless.yml
service: serverless-ts-sample

plugins:
  - serverless-webpack

# 以下の部分を追記
custom:
  webpack:
    includeModules: true
・・・


調べてみると webpack.config.jsexternals を設定している場合、
includeModules: trueが必要になるようです。

Serverless Webpack の使い方まとめ - Qiita


ホントだ、 webpack.config.js 見ると書かれとる。。

webpack.config.js
const path = require('path')
const slsw = require('serverless-webpack')
const nodeExternals = require('webpack-node-externals')
const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin')

module.exports = {
  context: __dirname,
・・・
  target: 'node',
  externals: [nodeExternals()],
・・・

おすすめ