Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Bun がメジャーリリースされたけど、本当にBun はNode.js に取って代わるのか?をAWS Lambda で検証してみた

Makky12
November 18, 2023

Bun がメジャーリリースされたけど、本当にBun はNode.js に取って代わるのか?をAWS Lambda で検証してみた

2023/11/19(日) に開催された、JSConf JP における私のセッション「Bun がメジャーリリースされたけど、本当にBun はNode.js に取って代わるのか?をAWS Lambda で検証してみた」の発表資料になります。 #jsconfjp

https://jsconf.jp/2023/

Makky12

November 18, 2023
Tweet

More Decks by Makky12

Other Decks in Programming

Transcript

  1. Bunがメジャーリリースされたけど、本当にBunは
    Node.jsに取って代わるのか?を
    AWS Lambdaで検証してみた
    Masaki Suzuki (DeNA Co., Ltd.)
    2023/11/19
    JSConf JP 2023

    View full-size slide

  2. アジェンダ
    1. 自己紹介&注意事項
    2. 導入:Bunの紹介と疑問
    3. AWS Lambdaで検証する
    4. LambdaでBunを使ってみて嬉しい点・困った点
    5. ユースケース
    6. まとめ
    7. 参考情報
    2

    View full-size slide

  3. 自己紹介
    ◼ 名前: 鈴木 正樹 (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

    View full-size slide

  4. 注意事項
    ◼ 今回の発表資料・発言内容は、すべて個人の見解になります
    • 所属企業、及びその方針・見解とは一切無関係です
    ◼ 今回の検証結果は、あくまで私の環境での結果です
    • 環境によって、結果が異なる可能性があります
    ◼ 本資料の内容は、2023/11/19(日)現在のものです
    ◼ 本資料では、TSのトランスパイルを便宜上「ビルド」と記載しています
    4

    View full-size slide

  5. 導入:Bunの紹介と疑問

    View full-size slide

  6. Bunがメジャーリリースされましたね!
    6
    ◼ 9/8 にBun v1.0がリリース(現在の最新版はver1.0.13)
    ◼ とにかく「速い!」のが最大の特徴
    SSR/パッケージインストール/単体テスト etc.
    ◼ URL: https://bun.sh/
    ここに 図 や テキスト を挿入します

    View full-size slide

  7. ちょっと調べたら
    7
    • 「とにかく早い!」という事で、ネットやYouTubeで結構話題になってる(た?)
    • 中には「Node.jsはもう古い」「もうNode.jsはオワコン」なんて言う表現も…
    が、これらを見て、自分の中である疑問が…

    View full-size slide

  8. 疑問
    8
    いやいや

    View full-size slide

  9. 疑問
    9
    パッケージインストールや
    単体テストは
    速いかもしれないけど

    View full-size slide

  10. 疑問
    10
    ランタイムは…

    View full-size slide

  11. 疑問
    11
    プロダクトワークロードで
    動かして
    ナンボでしょ!

    View full-size slide

  12. そして本題へ
    12
    というわけで、検証してみた

    View full-size slide

  13. AWS Lambdaで検証する

    View full-size slide

  14. 前提
    14
    • プロダクトワークロードとして、AWS Lambdaを使用
    • 「DynamoDBからランダムな1データ(※)を取得する」処理を実行する
    • 上記LambdaをAPI Gateway経由で実行する(=Web API)
    • 上記API Gatewayへのリクエストを20回行い、その結果を計測する
    ※ 使用するデータについては次スライドで説明

    View full-size slide

  15. 使用するデータについて
    15
    ◼ データは「(今年で発売40周年となる)ドルアーガ
    の塔」の各フロアの宝物情報を使用(左を参照)
    ◼ 「ドルアーガの塔」が分からない人はググるなり、
    お父さん・お母さんに聞いてみてください
    {
    floor: 2
    treasures: [{
    name: ‘ジェットブーツ’,
    effect: ‘足が速くなる’,
    condition: ‘ブラックスライムを2体倒す’,
    necessary: false,
    }]
    }

    View full-size slide

  16. 検証結果
    16

    View full-size slide

  17. 検証結果(単位は全て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,459
    Duration(最遅) 491 411 491 556
    Duration(最速) 65 179 88 181
    Duration(平均) ※Cold Startは含まず 171 287 172 318

    View full-size slide

  18. LambdaでBunを使ってみて嬉しい点・困った点

    View full-size slide

  19. その1:困った点
    19
    最新版が使えない Bun公式のLambdaレイヤー作成処理が、ver1.0.8以降はエラーで動かない(※1)
    現時点ではVer1.0.7で動かすしかない
    ビルドファイルが動かない ビルド時にnode_modulesをバンドルすると、js実行時にエラーが発生する
    回避策はある(※2)
    モジュールモック未対応 ver1.0.13時点で、Bunテストランナーでのモジュールモックは未対応
    マッチャーも一部未対応
    ※1:必要なファイルのzip化がうまくできていない模様
    ※2:後述の「参考情報」 にて説明します

    View full-size slide

  20. その2:嬉しい点
    20
    やっぱり速い! パッケージインストール・単体テストなどの実行が速い
    特に単体テストはjestに比べて実感できるレベルで速い(※1)
    All-in-One Bun一つでパッケージ管理・テスト・ビルド・バンドルなどが完結する
    特にTypeScriptトランスパイラも内包しているのは大きい
    LambdaをTSで動かせる
    ソースをTypeScriptのままアップロードして動かすことが可能(※2, ※3)
    マネジメントコンソールでのソースの確認・編集が容易になる
    ※1:テスト前の初期処理(ビルドなど?)含め、本当に一瞬で終わる
    ※2:正確にはLambda実行時にビルド処理が行われる
    ※3:上記ビルド処理の分、実行時間は少し多くなる(「実行結果」参照)

    View full-size slide

  21. ユースケース

    View full-size slide

  22. ユースケース
    22
    ローカルでの作業 パッケージインストール・単体テスト・ビルドなど、Bunの実行速度を活かせる作業
    特にテストの速さは本当に魅力的(モジュールモックの問題がクリアできれば)
    TSのままデプロイしたい マネジメントコンソールでのソースの可読性、及び編集目的
    主に開発環境で実行する場合(本番環境では難しいと思うので) (※1)
    SSR(未検証)
    React SSRにおいてNode.jsの約4.8倍の性能、と公式サイトで名言
    SSRの用途ならば、Bunの方が速い?(※3)
    ※1:「検証結果」の通り、速度的な問題で本番環境では難しいかも
    ※2:Bun公式ページの「Server-side rendering React」を参照
    ※3:時間の関係&私がフロントエンドは専門外なので、今回は検証できませんでした

    View full-size slide

  23. まとめ
    ◼ 現時点では、本番環境のLambdaでBunを動かすのは時期尚早かも
    ◼ ローカル作業で使用したり、開発環境で使う分にはありかもしれない
    ◼ とはいえ、まだまだメジャーリリースしたばかりなので、今後に期待!
    24

    View full-size slide

  24. 参考情報

    View full-size slide

  25. LambdaでBunを実行する方法
    26
    1. 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にもやり方が書いてある

    View full-size slide

  26. 「ビルドファイルが動かない」現象を回避する方法
    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);

    View full-size slide

  27. (おまけ)Bunにcontributeしました その1
    28
    ◼ 「Lambdaレイヤー作成処理が、ver1.0.8以降はエラーで動かない」件に
    ついて、issueを新規作成(#7028)
    ※「困った点」の「最新版が使えない」に対応するissue
    ◼ 今のところ進展はない模様
    ここに 図 や テキスト を挿入します

    View full-size slide

  28. (おまけ)Bunにcontributeしました その2
    29
    ◼ 「Issue #5707 import.meta.require is not a function error after
    target: “node” build」において、ソース改善に関するコメントを投稿済み
    ※19ページの「その1:困った点」で紹介した現象に対応するissue
    ◼ 絵文字リアクションもそれなりにあるので、割と評価は良かった?
    ◼ 現在は #6168 に統合済み
    ここに 図 や テキスト を挿入します

    View full-size slide

  29. DeNA ENGINEERING
    DeNAのエンジニアの技術・文化・チーム等を伝えるポータルサイトです。
    様々な技術発信や、カルチャーの紹介をしています。

    View full-size slide