Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

導入:Bunの紹介と疑問

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

疑問 8 いやいや

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

疑問 10 ランタイムは…

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

AWS Lambdaで検証する

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

検証結果 16

Slide 17

Slide 17 text

検証結果(単位は全て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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

ユースケース

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

まとめ

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

参考情報

Slide 26

Slide 26 text

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にもやり方が書いてある

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

No content