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.js
で externals
を設定している場合、
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()],
・・・