📑
Serverless Frameworkの公式TypeSctiptテンプレートでPuppeteerを使うTips
この記事は、Lancers(ランサーズ) Advent Calendar 2023 の5日目の記事です。
かつ、AWS Lambda と Serverless Advent Calendar 2023 の5日目の記事です。
モチベーション
Puppeteerを使ってちょっとした処理を書きたいケースがあり、下記のスタックでシステムを構築しました。
- Lambda
- 言わずもがな
- Serverlessの代名詞的なやつ
- Serverless Framework
- 言わずもがな
- Serverlessを良い感じに扱える君
-
aws-nodejs-typescript
- Serverless Frameworkが公式に出しているTypeScriptのテンプレート
- esbuildを採用しておりビルドが高速
- APIを作る際に便利なライブラリが同梱されている
-
Sparticuz/chromium: Chromium (x86-64) for Serverless Platforms
- Chromiumをlambdaで使えるようにするもの
- Chromiumのバイナリを含んでいる
-
puppeteer/puppeteer-core: Node.js API for Chrome
- PuppeteerからChromiumを除いたもの
この時、TypeScriptのビルドに失敗したのでTipsとして紹介します。
tl;dr
- esbuildはpuppeteer-coreの依存関係を解決できない
- esbuild-plugin-aliasを使って別名を付けるとビルドできる
esbuildはpuppeteer-coreの依存関係を解決できない
sls deploy
でデプロイするとesbuild
が下記のエラーを吐きます。
Running "serverless" from node_modules
Deploying test-service to stage dev (ap-northeast-1)
✘ [ERROR] Do not know how to load path: node_modules/@puppeteer/browsers/node_modules/yargs/yargs
node_modules/@puppeteer/browsers/lib/cjs/CLI.js:49:40:
49 │ const yargs_1 = __importDefault(require("yargs/yargs"));
╵ ~~~~~~~~~~~~~
✘ [ERROR] Do not know how to load path: node_modules/@puppeteer/browsers/node_modules/yargs/yargs
とある通り、
Puppeteerが依存しているyargs
が解決できないようです。
esbuild-plugin-aliasを使って別名を付けるとビルドできる
esbuild-plugin-alias
をインストールします。
npm install --save-dev esbuild-plugin-alias
esbuild.config.js
を作成し下記を記述します。
esbuild.config.js
const alias = require("esbuild-plugin-alias");
module.exports = (serverless) => ({
plugins: [
alias({
"yargs/yargs": `${__dirname}/node_modules/@puppeteer/browsers/node_modules/yargs/index.mjs`,
}),
],
});
serverless.ts
に下記の設定を追加します。
serverless.ts
const serverlessConfiguration: AWS = {
// 略
custom: {
esbuild: {
bundle: true,
minify: false,
sourcemap: true,
exclude: ["aws-sdk"],
target: "node16",
define: { "require.resolve": undefined },
platform: "node",
concurrency: 10,
+ config: "./esbuild.config.js",
},
},
};
これでビルドできるようになりました。
まとめ
普段、esbuildは使っていないのでエラーが出た時はビビりましたが解決できました。
この記事が誰かの役に立てれば幸いです。
Discussion