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

serverless-aws-aliasを公式ドキュメントに従ってインストールし、sls deploy を実行しようとすると、 "Error: Cannot find module" が発生したので、原因と対処方法をまとめる。

## エラー発生までの経緯

公式ドキュメントに従って、プラグインをインストール。

https://www.serverless.com/plugins/serverless-aws-alias

```terminal
npm install --save-dev serverless-aws-alias
```
試しに関数のデプロイを実行（他にリソースはなし）。

```yaml
# serverless.yml
functions:
  hello:
    handler: functions/hello.lambda_handler
    events:
      - http:
          path: hello
          method: get
```
```terminal
sls deploy
```
エラー発生。
```terminal
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でも取り上げられていた。

https://github.com/serverless-heaven/serverless-aws-alias/issues/217

どうやら、Serverless Framework の最近のバージョンでは、monitorStack というモジュールの名前が、キャメルケースからケバブケースに変更になったらしい。結果、プラグインがモジュールをインポートできなくなり、Cannot find module エラーが発生するようになったとのこと。

下記にissueのやり取りを一部抜粋する。

> It looks like this is caused by this line in serverless-aws-alias-fixed:
```javascript
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 を代わりに利用する。

https://github.com/Psycholive/serverless-aws-alias

直接的な解決方法は、先程の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
```

デプロイ実行。
```terminal
sls deploy
```

"Error: Cannot find module"は起きず、デプロイできた様子。
```terminal
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)
```

## 参考情報

https://www.serverless.com/plugins/serverless-aws-alias

https://github.com/serverless-heaven/serverless-aws-alias/issues/217

https://github.com/Psycholive/serverless-aws-alias