はい、あいました。

Nuxt.js+TypeScriptなアプリと、GoLangのワーカーを混在させたプロジェクトをServerlessでデプロイするとなぜかnode_modules の中身が全部パッケージに含まれてしまい、ファイルサイズオーバーAWS Lambdaにデプロイできなくなりハマっていました。
serverless.ymlpackage.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が使いたい気分になった感じ

# 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

元記事はこちら

package-lock.jsonがある状態でyarn installするとServerlessのデプロイで痛い目にあう