serverless-aws-aliasを公式ドキュメントに従ってインストールし、sls deploy を実行しようとすると、 "Error: Cannot find module" が発生したので、原因と対処方法をまとめる。
エラー発生までの経緯
公式ドキュメントに従って、プラグインをインストール。
npm install --save-dev serverless-aws-alias
試しに関数のデプロイを実行(他にリソースはなし)。
# serverless.yml
functions:
hello:
handler: functions/hello.lambda_handler
events:
- http:
path: hello
method: get
sls deploy
エラー発生。
Error:
Error: Cannot find module 'C:\Users\saki0\dev\cfn_apigw_sample\node_modules\serverless\lib\plugins\aws\lib\monitorStack'
Require stack:
- C:\Users\saki0\dev\cfn_apigw_sample\node_modules\serverless-aws-alias\index.js
- C:\Users\saki0\dev\cfn_apigw_sample\node_modules\serverless\lib\utils\require-with-import-fallback.js
- C:\Users\saki0\dev\cfn_apigw_sample\node_modules\serverless\lib\classes\plugin-manager.js
- C:\Users\saki0\dev\cfn_apigw_sample\node_modules\serverless\lib\serverless.js
- C:\Users\saki0\dev\cfn_apigw_sample\node_modules\serverless\scripts\serverless.js
- C:\Users\saki0\dev\cfn_apigw_sample\node_modules\serverless\bin\serverless.js
- C:\Users\saki0\AppData\Roaming\npm\node_modules\serverless\bin\serverless.js
at Module._resolveFilename (node:internal/modules/cjs/loader:1075:15)
at Module._load (node:internal/modules/cjs/loader:920:27)
at Module.require (node:internal/modules/cjs/loader:1141:19)
at require (node:internal/modules/cjs/helpers:110:18)
at new AwsAlias (C:\Users\saki0\dev\cfn_apigw_sample\node_modules\serverless-aws-alias\index.js:43:24)
at PluginManager.addPlugin (C:\Users\saki0\dev\cfn_apigw_sample\node_modules\serverless\lib\classes\plugin-manager.js:91:28)
at C:\Users\saki0\dev\cfn_apigw_sample\node_modules\serverless\lib\classes\plugin-manager.js:137:69
at Array.forEach (<anonymous>)
at PluginManager.loadAllPlugins (C:\Users\saki0\dev\cfn_apigw_sample\node_modules\serverless\lib\classes\plugin-manager.js:137:44)
at async Serverless.init (C:\Users\saki0\dev\cfn_apigw_sample\node_modules\serverless\lib\serverless.js:146:5)
at async C:\Users\saki0\dev\cfn_apigw_sample\node_modules\serverless\scripts\serverless.js:607:7
原因
serverless-aws-aliasのissueでも取り上げられていた。
どうやら、Serverless Framework の最近のバージョンでは、monitorStack というモジュールの名前が、キャメルケースからケバブケースに変更になったらしい。結果、プラグインがモジュールをインポートできなくなり、Cannot find module エラーが発生するようになったとのこと。
下記にissueのやり取りを一部抜粋する。
It looks like this is caused by this line in serverless-aws-alias-fixed:
const monitorStack = require(
Path.join(this._serverless.config.serverlessPath,
'plugins',
'aws',
'lib',
'monitorStack')
);
In the recent versions of Serverless, it's called monitor-stack not monitorStack.
解決方法
serverless-aws-alias-v3 を代わりに利用する。
直接的な解決方法は、先程のrequire文のmonitorStack
を、monitor-stack
に変更すれば良いのだが、もうやってくれた人がいるらしい。下記の箇所が該当。
https://github.com/Psycholive/serverless-aws-alias/blob/master/index.js#L79
serverless-aws-alias-v3 をインストール。
npm install --save-dev serverless-aws-alias-v3
デプロイ実行。
sls deploy
"Error: Cannot find module"は起きず、デプロイできた様子。
sls deploy
Deploying apigw-sample to stage dev (ap-northeast-1)
Preparing alias ...
Creating Alias Stack 'dev' ...
Uploading CloudFormation alias file to S3...
Updating alias stack...
✔ Service deployed to stack apigw-sample-dev (137s)
参考情報