AWS Lambda/NodeJSランタイムで、絶対パス(_/opt/nodejs/node_modules/puppeteer
_)からインポートしようとしています。
ソースはローカルで正常に動作しますが、Webpack/serverless-webpackにバンドルされてAWS Lambdaで実行されると、require('puppeteer')
の結果は次のようになります。
_{"errorMessage":"Cannot find module 'puppeteer'","errorType":"Error","stackTrace":["webpackMissingModule (/var/task/src/render/handler.js:643:89)","/var/task/src/render/handler.js:643:173","next (native)","step (/var/task/src/render/handler.js:608:191)","/var/task/src/render/handler.js:608:361"]}
_
私はチェックしました:
/opt
_にマウントされます。/opt/nodejs/node_modules/puppeteer
_は存在します。NODE_PATH
_は_/opt/nodejs/node_modules
_を正しく含みますZipをAmazonにアップロードする前に、save
フラグを使用してモジュールをインストールする必要があります。
npm i puppeteer --save
_npm i --save puppeteer
_は、パッケージが大きすぎます。 (ラムダの場合は最大50MB。)
そのため、代わりに、puppeteerは_npm i --save-dev puppeteer --ignore-scripts
_でインストールされました。 (Chromiumがインストールされないようにスクリプトを無視します。)_serverless-webpack
_プラグインは、パッケージ内のpuppeteerを無視するように指示する必要がありました。 (そうでなければ、操り人形師はパッケージを膨らませます。)
Puppeteerモジュールは(質問で言及されたフォルダー構造の)レイヤーに配置され、require('puppeteer')
が機能するようになりました。