Puppeteer入りNode.jsアプリをServerlessでAWS Lambdaにデプロイするときに困ったこと

結論

nodejs+puppeteer+lambdaのアプリケーションには .npmrc が必須

起きたこと

C:\[hogehoge]>npx sls deploy

をしたら

  Serverless Error ---------------------------------------

  An error occurred: [Function Name] - Unzipped size must be smaller than 262144000 bytes (Service: AWSLambda; Status Code: 400; Error Code: InvalidParameterValueException; Request ID: [fugafuga]).

と怒られました。
Serverlessのログを見てみると、

~略~
Serverless: Uploading CloudFormation file to S3...
Serverless: Uploading artifacts...
Serverless: Uploading service .zip file to S3 (157.42 MB)...
Serverless: Validating template...
~略~

157MBのzipをアップロードしようとしている。
Lambdaの容量制限は50MBなのでそりゃ怒られる…

調査したこと

ディレクトリのサイズを調査すると、node-module で300MBくらい食ってることが判明。
何度か npm install を繰り返して原因究明。
アプリケーションに使用していたPuppeteerの中にChromium(130MBくらい)が含まれていた。こいつのせい!
こいつがデプロイの時に含まれないようにしたいと思い、除外設定を探すもヒットせず。

解決法

たどり着いた神記事がこちら
https://www.pressmantech.com/tech/serverless/4613

ちょっと自分の対応の角度はズレてた。
解決法は「デプロイに含めない」ではなく、「そもそもインストールしない」だった。

というわけで、↑の記事に従って以下の手順を踏んだ。


1. node-moduleディレクトリを全削除

2. .npmrcをルートディレクトリに作る(書くのは1行だけ)

PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=TRUE

3. npm install

これで skip install が出た。
もう一回デプロイ挑戦したらzipのサイズは130MBくらい減っていて、無事lambdaにアップロードされていった。
ありがたや。