2023/11/19(日) に開催された、JSConf JP における私のセッション「Bun がメジャーリリースされたけど、本当にBun はNode.js に取って代わるのか?をAWS Lambda で検証してみた」の発表資料になります。 #jsconfjp
https://jsconf.jp/2023/
Bunがメジャーリリースされたけど、本当にBunはNode.jsに取って代わるのか?をAWS Lambdaで検証してみたMasaki Suzuki (DeNA Co., Ltd.)2023/11/19JSConf JP 2023
View Slide
アジェンダ1. 自己紹介&注意事項2. 導入:Bunの紹介と疑問3. AWS Lambdaで検証する4. LambdaでBunを使ってみて嬉しい点・困った点5. ユースケース6. まとめ7. 参考情報2
自己紹介◼ 名前: 鈴木 正樹 (Masaki Suzuki)◼ 会社: 株式会社DeNA エンターテイメント開発事業本部◼ 職業: クラウドアーキテクト(というクラウド何でも屋)◼ 技術・その他:• AWS(特にLambda), その他クラウドバックエンド全般, IaC (特にAWS CDK), CI/CD etc.• JavaScript(Node.js), TypeScript, Jestなど• JAWS-UG CDK支部, JAWS-UG 名古屋, AWS Community Builder (Serverless, 2023~)◼ SNS:• @makky12 (SUZUKI Masaki@クラウドエンジニア)• @makky12.bsky.social• https://github.com/smt7174/• http://makky12.hatenablog.com/3
注意事項◼ 今回の発表資料・発言内容は、すべて個人の見解になります• 所属企業、及びその方針・見解とは一切無関係です◼ 今回の検証結果は、あくまで私の環境での結果です• 環境によって、結果が異なる可能性があります◼ 本資料の内容は、2023/11/19(日)現在のものです◼ 本資料では、TSのトランスパイルを便宜上「ビルド」と記載しています4
導入:Bunの紹介と疑問
Bunがメジャーリリースされましたね!6◼ 9/8 にBun v1.0がリリース(現在の最新版はver1.0.13)◼ とにかく「速い!」のが最大の特徴SSR/パッケージインストール/単体テスト etc.◼ URL: https://bun.sh/ここに 図 や テキスト を挿入します
ちょっと調べたら7• 「とにかく早い!」という事で、ネットやYouTubeで結構話題になってる(た?)• 中には「Node.jsはもう古い」「もうNode.jsはオワコン」なんて言う表現も…が、これらを見て、自分の中である疑問が…
疑問8いやいや
疑問9パッケージインストールや単体テストは速いかもしれないけど
疑問10ランタイムは…
疑問11プロダクトワークロードで動かしてナンボでしょ!
そして本題へ12というわけで、検証してみた
AWS Lambdaで検証する
前提14• プロダクトワークロードとして、AWS Lambdaを使用• 「DynamoDBからランダムな1データ(※)を取得する」処理を実行する• 上記LambdaをAPI Gateway経由で実行する(=Web API)• 上記API Gatewayへのリクエストを20回行い、その結果を計測する※ 使用するデータについては次スライドで説明
使用するデータについて15◼ データは「(今年で発売40周年となる)ドルアーガの塔」の各フロアの宝物情報を使用(左を参照)◼ 「ドルアーガの塔」が分からない人はググるなり、お父さん・お母さんに聞いてみてください{floor: 2treasures: [{name: ‘ジェットブーツ’,effect: ‘足が速くなる’,condition: ‘ブラックスライムを2体倒す’,necessary: false,}]}
検証結果16
検証結果(単位は全てmsec)17◼ やはりBunは速い!…と予想していたが、実際はNode.jsの方が速かった平均差は116msなので、誤差と言えば誤差だけど、もっと複雑な処理をしたらどうなるか…◼ Bun環境の場合、Cold Start時にLambdaレイヤーを読み込むので、前処理を含んだ時間(≒Billed Duration)はもっと長いBunで2,246ms、Bun(TypeScript)は10,811ms◼ AWS環境の構成差も影響している?(BunはARM64 & カスタムランタイム必須)ここに 図 や テキスト を挿入しますNode.js Bun Bun(Node.js ビルド)Bun(TypeScript)項目名Duration(Cold Start時) 773 1,056 689 1,459Duration(最遅) 491 411 491 556Duration(最速) 65 179 88 181Duration(平均) ※Cold Startは含まず 171 287 172 318
LambdaでBunを使ってみて嬉しい点・困った点
その1:困った点19最新版が使えない Bun公式のLambdaレイヤー作成処理が、ver1.0.8以降はエラーで動かない(※1)現時点ではVer1.0.7で動かすしかないビルドファイルが動かない ビルド時にnode_modulesをバンドルすると、js実行時にエラーが発生する回避策はある(※2)モジュールモック未対応 ver1.0.13時点で、Bunテストランナーでのモジュールモックは未対応マッチャーも一部未対応※1:必要なファイルのzip化がうまくできていない模様※2:後述の「参考情報」 にて説明します
その2:嬉しい点20やっぱり速い! パッケージインストール・単体テストなどの実行が速い特に単体テストはjestに比べて実感できるレベルで速い(※1)All-in-One Bun一つでパッケージ管理・テスト・ビルド・バンドルなどが完結する特にTypeScriptトランスパイラも内包しているのは大きいLambdaをTSで動かせるソースをTypeScriptのままアップロードして動かすことが可能(※2, ※3)マネジメントコンソールでのソースの確認・編集が容易になる※1:テスト前の初期処理(ビルドなど?)含め、本当に一瞬で終わる※2:正確にはLambda実行時にビルド処理が行われる※3:上記ビルド処理の分、実行時間は少し多くなる(「実行結果」参照)
ユースケース
ユースケース22ローカルでの作業 パッケージインストール・単体テスト・ビルドなど、Bunの実行速度を活かせる作業特にテストの速さは本当に魅力的(モジュールモックの問題がクリアできれば)TSのままデプロイしたい マネジメントコンソールでのソースの可読性、及び編集目的主に開発環境で実行する場合(本番環境では難しいと思うので) (※1)SSR(未検証)React SSRにおいてNode.jsの約4.8倍の性能、と公式サイトで名言SSRの用途ならば、Bunの方が速い?(※3)※1:「検証結果」の通り、速度的な問題で本番環境では難しいかも※2:Bun公式ページの「Server-side rendering React」を参照※3:時間の関係&私がフロントエンドは専門外なので、今回は検証できませんでした
まとめ
まとめ◼ 現時点では、本番環境のLambdaでBunを動かすのは時期尚早かも◼ ローカル作業で使用したり、開発環境で使う分にはありかもしれない◼ とはいえ、まだまだメジャーリリースしたばかりなので、今後に期待!24
参考情報
LambdaでBunを実行する方法261. BunのGitHubリポジトリをcloneし、packages/bun-lambdaに移動2. “bun install” コマンド(パッケージインストール)を実行3. “bun run publish-layer” コマンド(Lambdaレイヤー作成)を実行4. Lambda関数で、3で作成したLambdaレイヤーを使用する(※1)※1: ランタイムを「カスタムランタイム(provided.al2)」、アーキテクチャを「ARM64」にしないと動かないので注意※参考: BunをLambdaのカスタムランタイムで動作させてみた (クラスメソッドさんのブログ)※packages/bun-lambda/README.mdにもやり方が書いてある
「ビルドファイルが動かない」現象を回避する方法27◼ node_modulesを使用すると、ビルド後のjsファイル実行時に「(intermediate value).require is not a function」エラーが発生◼ ビルド後のjsファイルの先頭に上記2行を追加すると、正常に実行可能◼ ビルドファイルのサンプルを下記で公開しています◼ https://github.com/smt7174/jsconfjp2023_bun-aws-lambda// このコードをjsファイルの先頭に追加するimport { createRequire as createImportMetaRequire } from "module";import.meta.require ||= (id) => createImportMetaRequire(import.meta.url)(id);
(おまけ)Bunにcontributeしました その128◼ 「Lambdaレイヤー作成処理が、ver1.0.8以降はエラーで動かない」件について、issueを新規作成(#7028)※「困った点」の「最新版が使えない」に対応するissue◼ 今のところ進展はない模様ここに 図 や テキスト を挿入します
(おまけ)Bunにcontributeしました その229◼ 「Issue #5707 import.meta.require is not a function error aftertarget: “node” build」において、ソース改善に関するコメントを投稿済み※19ページの「その1:困った点」で紹介した現象に対応するissue◼ 絵文字リアクションもそれなりにあるので、割と評価は良かった?◼ 現在は #6168 に統合済みここに 図 や テキスト を挿入します
DeNA ENGINEERINGDeNAのエンジニアの技術・文化・チーム等を伝えるポータルサイトです。様々な技術発信や、カルチャーの紹介をしています。