0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

serverless-aws-alias プラグインで "Error: Cannot find module" が発生する原因と対処

Posted at

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)

参考情報

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?