はい、あいました。
Nuxt.js+TypeScriptなアプリと、GoLangのワーカーを混在させたプロジェクトをServerlessでデプロイするとなぜかnode_modules
の中身が全部パッケージに含まれてしまい、ファイルサイズオーバーAWS Lambdaにデプロイできなくなりハマっていました。
serverless.yml
のpackage.excludeDevDependencies
で含める含めないの指定ができるのですが、どう指定してもだめ。。。
Serverless Framework Guide - AWS Lambda Guide - Packaging
https://serverless.com/framework/docs/providers/aws/guide/packaging/#development-dependencies
いろいろと原因が考えられてあれこれと調査した結果、原因は(案の定)大したことがありませんでした。
原因
package-lock.json
がプロジェクトにある状態で、yarn install
すると、Serverlessのパッケージ作成でnode_modules
の中身を全部パッケージに含んでしまう。
理由はわかっていません。
再現
適当なディレクトリにServerlessでnode.jsのプロジェクトを作成します。
> mkdir 任意のディレクトリ
> cd 任意のディレクトリ
> npm init
# serverlessがあグローバルにインストールされてなかったら
#> npm install -g serverless
> npm install -D serverless
> serverless --version
1.33.2
> serverless create --template aws-nodejs --name node-app
> cat package.json
{
"name": "node-app",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"devDependencies": {
"serverless": "^1.33.2"
}
}
プロジェクトが作成できたらserverless package
でzipファイルを作成します。
> serverless package
Serverless: Packaging service...
Serverless: Excluding development dependencies...
> ll .serverless/
-rw-r--r-- 1 user Users 361B 11 28 13:50 cloudformation-template-create-stack.json
-rw-r--r-- 1 user Users 3.6K 11 28 13:50 cloudformation-template-update-stack.json
-rw-r--r-- 1 user Users 69K 11 28 13:50 node-app.zip
-rw-r--r-- 1 user Users 5.8K 11 28 13:50 serverless-state.json
> cd .serverless/
> unzip node-app.zip
Archive: node-app.zip
inflating: handler.js
inflating: package-lock.json
inflating: package.json
はい。
Serverless以外モジュールを含めておらず、かつdevDependencies
なので、パッケージに含められるモジュールはありません。zipファイルのサイズは69KBと軽量です。
で、ある日突然気が変わってnpm
からyarn
に鞍替えしたとします。
yarn install
でモジュールをインストールしなおします。
# Yarnがインストールされてなかったら
# > npm install -g yarn
> cd ..
> rm -rf node_modules/
> yarn install
yarn install v1.12.3
warning package-lock.json found. Your project contains lock files generated by tools other than Yarn. It is advised not to mix package managers in order to avoid resolution inconsistencies caused by unsynchronized lock files. To clear this warning, remove package-lock.json.
(略)
success Saved lockfile.
改めてパッケージを作成します。
> serverless package
Serverless: Packaging service...
Serverless: Excluding development dependencies...
!!!
zipのファイルサイズがすっごく増えました!!!
解凍してみると、さっきはなかったnode_modules
が含められています。
> ll .serverless/
total 34856
-rw-r--r-- 1 user Users 361B 11 28 13:58 cloudformation-template-create-stack.json
-rw-r--r-- 1 user Users 3.6K 11 28 14:00 cloudformation-template-update-stack.json
-rw-r--r-- 1 user Users 17M 11 28 14:00 node-app.zip
-rw-r--r-- 1 user Users 5.8K 11 28 14:00 serverless-state.json
> cd .serverless/
> unzip node-app.zip
Archive: node-app.zip
inflating: handler.js
(お察し)
inflating: node_modules/zip-stream/index.js
inflating: node_modules/zip-stream/package.json
inflating: package-lock.json
inflating: package.json
inflating: yarn.lock
解決策
npm
に戻るか、package-lock.json
を削除すると解消できます。
> cd ..
> rm package-lock.json
> serverless package
Serverless: Packaging service...
Serverless: Excluding development dependencies...
> ll .serverless/
total 152
-rw-r--r-- 1 user Users 361B 11 28 14:03 cloudformation-template-create-stack.json
-rw-r--r-- 1 user Users 3.6K 11 28 14:04 cloudformation-template-update-stack.json
-rw-r--r-- 1 user Users 57K 11 28 14:04 node-app.zip
-rw-r--r-- 1 user Users 5.8K 11 28 14:04 serverless-state.json
yarn.lock
がある状態で、npm install
したらどうなるか
逆だと大丈夫でした。なんぞ?
> rm -rf node_modules
> npm install
> serverless package
Serverless: Packaging service...
Serverless: Excluding development dependencies...
> ll .serverless/
-rw-r--r-- 1 user Users 361B 11 28 14:14 cloudformation-template-create-stack.json
-rw-r--r-- 1 user Users 3.6K 11 28 14:14 cloudformation-template-update-stack.json
-rw-r--r-- 1 user Users 69K 11 28 14:14 node-app.zip
-rw-r--r-- 1 user Users 5.8K 11 28 14:14 serverless-state.json
まとめ
yarn install
時にワーニングしてくれています。パッケージマネージャは混在させないでおきましょう。
package-lock.json found. Your project contains lock files generated by tools other than Yarn. It is advised not to mix package managers in order to avoid resolution inconsistencies caused by unsynchronized lock files. To clear this warning, remove package-lock.json.
(Google翻訳)
package-lock.jsonが見つかりました。 あなたのプロジェクトには、糸以外のツールで生成されたロックファイルが含まれています。 非同期ロックファイルによって引き起こされる解決の不一致を避けるために、パッケージマネージャを混在させないことが推奨されます。 この警告をクリアするには、package-lock.jsonを削除してください。
参考
Serverless Framework Guide - AWS Lambda Guide - Packaging
https://serverless.com/framework/docs/providers/aws/guide/packaging/#development-dependencies