ロゴテキスト ロゴ

    Serverless FrameworkでRuntime.ImportModuleError

    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

    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()],
    ・・・
    プロフィールの背景画像 プロフィール画像
    Yuki Takara
    都内でフリーランスのエンジニアをやってます。フロントとアプリ開発メインに幅広くやってます。