2023/03/24 エイチーム×レバレジーズ フロントエンド勉強会 の発表資料です
https://ateam.connpass.com/event/276968/
© 2023 Ateam Inc.ビギナー向け エッジランタイムのすすめ~エッジランタイムを意識した開発をはじめよう~エイチーム×レバレジーズ フロントエンド勉強会
View Slide
© 2023 Ateam Inc.自己紹介Who am I ?Name: Aiji UejimaTwitter: aiji42_devGithub: aiji42株式会社エイチームライフデザイン技術開発室所属リードエンジニア直近はサービス開発からは離れていますが、少し前までRemixでのサービス開発を進めていました。最近興味があるのはこの発表の通りエッジランタイム。毎日プライベートでGithubに草生やしながら頑張ってます!2
© 2023 Ateam Inc.おしながき1. エッジランタイム/エッジコンピューティングとはなにか2. エッジコンピューティングはなぜ流行っているのか?3. エッジコンピューティングで具体的に何ができるのか?4. エッジランタイムで開発する上での留意点3
© 2023 Ateam Inc.エッジランタイム/エッジコンピューティングとはなにか4
© 2023 Ateam Inc.エッジランタイム/エッジコンピューティングとは?CDNロケーションに配置されたコンピューティングリソースおよびその実行環境5※一般的に「エッジ」が指すものは文脈によって異なりますこの発表では上の画像のイメージで話しますedgeedgeedgeorigin
© 2023 Ateam Inc.エッジランタイム/エッジコンピューティングとは?各CDNベンダーのエッジコンピューティング6ベンダー 名称 エンジン/言語Cloudflare Cloudflare Workers Javescript/V8Fastly Fastly [email protected] Wasm/Wasmtime (Javascriptも動く)Vercel Vercel Edge Function Javascript/V8 (内部はCF Workers)Akamai Akamai EdgeWorkers Javascript/V8他にも多数...
© 2023 Ateam Inc.エッジランタイム/エッジコンピューティングとは?なぜV8/Javascript構成が採用されるのか71. パフォーマンスV8エンジンは最適化されたJITコンパイラを使用し、Javascriptをネイティブマシンコードに変換する。そのため、低遅延が重要視されるエッジランタイムでの採用が盛ん
© 2023 Ateam Inc.エッジランタイム/エッジコンピューティングとは?なぜV8/Javascript構成が採用されるのか82. 独立性エッジランタイムではV8 isolateという機構が取られる。独自のメモリ空間を持ち分離されるため、複数ユーザ・アプリケーションが同一物理リソース上にあっても、セキュリティや安定性が担保される。また、isolateの作成と破棄が早いことが魅力的https://developers.cloudflare.com/workers/learning/how-workers-works/
© 2023 Ateam Inc.エッジランタイム/エッジコンピューティングとは?Cloudflare がゼロコールドスタートを謳う仕組み9ハンドシェイク中にV8 isolateにWorkerコードをローディングすることによって、実質起動速度0msを実現している。(他のベンダーでも同じ仕組みが取られているかもしれません)逆にハンドシェイク中の5msの間にコードをロードしないといけないので、厳し目のバンドルサイズの制限が敷かれている(後述)従来のCF Workers 及び古典的なサーバレスコンピューティング 現在のCF Workers (TLSのネゴシエーション中に立ち上げる)https://blog.cloudflare.com/eliminating-cold-starts-with-cloudflare-workers/
© 2023 Ateam Inc.なぜエッジコンピューティングが流行っているのか?10
© 2023 Ateam Inc.なぜ流行っているのかCore Web Vitals との関連性11https://akshayranganath.github.io/Understanding-And-Using-Core-Web-Vitals/
© 2023 Ateam Inc.なぜ流行っているのかCore Web Vitals との関連性12LCP/FIDの時間を短縮させるためにTTFBに着目すると、オリジンの応答速度・オリジンとの距離が注目される。CDNでの静的ファイル配信はもちろんのこと、リアルタイム処理も含めると、オーバーヘッドが少ないエッジランタイムは魅力的。https://www.keycdn.com/support/what-is-ttfb
© 2023 Ateam Inc.なぜ流行っているのかオリジンへリクエストするよりもエッジでレスポンスを返せたほうが早い13edgeedgeedgeorigin
© 2023 Ateam Inc.なぜ流行っているのかキャッシュハンドリングの柔軟性と敷居の低下Next.jsのISRに代表されるように、キャッシュの破棄までを含めた設計が重要視されるようになった。かつてはFastlyのVernish(VCL)がその領域を代表していたが、アプリケーションエンジニアやフロントエンドエンジニアにはハードルが高かった。Cloudflare Workersの登場により、Javascriptでアプリケーション感覚で構築できるようになり一気にハードルが下がった。14https://www.facebook.com/FastlyEdgeCloudJapan/videos/using-vcl-on-our-devhub/611247286543080/
© 2023 Ateam Inc.なぜ流行っているのか開発体験の向上- デプロイ速度がとても早い(数百ms~30s)- プロダクションと同等の開発がローカルで再現できる(miniflare/Wokerd/edge-runtimeなど)故にJest/Vitestなどでのテストが容易- そしてなにより、Typescriptで書けるNext.js なら config で切替可能15
© 2023 Ateam Inc.なぜ流行っているのかエコシステムの加速16エッジでの動作が保証されているフロントエンドフレームワークエッジで動作するExpress相当のサーバーその他周辺サービス/ライブラリKV/R2/D1/DuableObjects (Cloudflare Workers)
© 2023 Ateam Inc.なぜ流行っているのかエコシステムの加速17#edge_studyでのCloudflareのセッションより
© 2023 Ateam Inc.エッジコンピューティングで具体的に何ができるのか18
© 2023 Ateam Inc. 19エッジの主なユースケースキャッシュの柔軟なハンドリングNext.jsのISRと同じもの実現したり、記事の作成者本人にはリアルタイムでレンダリングし、その他多数のユーザにはキャッシュしたコンテンツを返すみたいなことができる。KV記事作成者その他ユーザ🍪🍪キャッシュSSRToken verifyキャッシュを返却した後に再検証
© 2023 Ateam Inc. 20エッジの主なユースケース実際のエイチームでの例CSRがメインのサービスをSSRに移行する過程で、ヘッドレスブラウザでレンダリングした結果をKVにキャッシュし、社外(一般ユーザ)アクセスの場合はレンダリング結果(キャッシュ)を返却しSSGぽく振る舞わせる。社内アクセスの場合はキャッシュせずリアルタイムのコンテンツを返却ということをしていた。https://speakerdeck.com/aiji42/saibouzuhurontoendomansuri-number-26-eitimuサイボウズフロントエンドマンスリー #26CSRなサイトを(擬似的な)ISRに変更した話
© 2023 Ateam Inc. 21エッジの主なユースケースABテストのルーティングCDNでリクエストをルーティングできるため、チャレンジャー用のコードをオリジナルに含めなくて良くなるoriginalに着弾したユーザchallengerに着弾したユーザ🍪🍪original vs challengeroriginalmain branch(original)challengerbranchchallengerdeploydeploy
© 2023 Ateam Inc. 22エッジの主なユースケースエイチームでの例Vercelのpreview deployとNext.jsのmiddlewareを使用したABテストのルーティングNext.js middleware: Vercelにデプロイするとエッジに展開され、Next.jsのサーバ到達前に処理を差し込むことができるoriginalに着弾したユーザchallengerに着弾したユーザ🍪🍪main branch(original)challengerbranchchallenger(example.challenger.vercel.dev)preview deployproduction deployoriginal(example.com)middlewarerewrite to challengerスクリプトやデータはダイレクトにリクエストhttps://github.com/aiji42/next-with-split
© 2023 Ateam Inc. 23エッジの主なユースケースレンダリング (Edge as Origin)エッジでコンテンツをレンダリングして返却する。オリジンへの物理的な距離を短縮できるため、高速にリアルタイムなコンテンツを返却できる。D1やKVなどの周辺サービスを利用すれば、SSRでTTFB100msを切るようなコンテンツデリバリも可能。🚫D1
© 2023 Ateam Inc. 24エッジの主なユースケース3rd party scriptの実行 (Cloudflare Zaraz)GoogleTabManagerやGoogleAnalyticsなどのアド系・分析計のスクリプトを、ユーザのクライアントではなくエッジで動作させることで、クライアント側のパフォーマンス改善やプライバシーリスクに対処できる。zaraz用のスクリプトが自動挿入される3rd party scriptがエッジで実行される🚫代わりにzaraz eventがプッシュされるクライアントでの3rd party scriptのロードが不要にベンダーに情報が送信される
© 2023 Ateam Inc.エッジコンピューティングはキャッシュハンドリングやルーティングのためのものではなくなっている25
© 2023 Ateam Inc.限りなくクライアントに近いオリジンであり、ユーザにとってのもう一つのクライアントでもある26
© 2023 Ateam Inc.エッジランタイムで開発したくなってきた?27
© 2023 Ateam Inc.何から始めればいいかどんなことに留意すればいいのか(※Cloudflare/Vercelの話題が多めになりますがご容赦ください)28
© 2023 Ateam Inc.何から始める?Next.js/Vercelを使っているのであれば...- middlewareを使ってみるAdvanced Features: Middleware | Next.jsリダイレクト・リライトを設定してみたり、Cookieを読み取ってアクセス制御をアプリケーション到達前にやってみるなどオリジンを変えてしまえば、外部にプロキシすることもできる29
© 2023 Ateam Inc.何から始める?Next.js/Vercelを使っているのであれば...- ページスクリプトのランタイムを切り替えてみるReact 18: Switchable Runtime | Next.jsAPI RoutesもPagesも export const config で簡単にランタイムの切り替えができるデプロイしてみてブラウザのコンソールを見るとTTFBが大きく異なることがわかるはず(VercelのNode runtimeはLambdaなので、物理的な距離による遅延+コールドスタートの遅延もある)30pagesDirの場合 appDirの場合
© 2023 Ateam Inc.Next.jsのAPIルートで、同じコードをruntimeを切り替えて比較何から始める?応答速度の比較31(コールドスタート)Vercel Serverless (Lambda in Tokyo)(ホットスタンバイ)Vercel Edge runtime
© 2023 Ateam Inc.何から始める?他のフレームワークを使うなら...エッジに対応しているフレームワークなら、簡単にエッジランタイムでの開発/デプロイができる- Deploy a Remix site · Cloudflare Pages docs- Remix on the Edge – Vercel- Deploy a Svelte site · Cloudflare Pages docs- SvelteKit at the Edge – VercelベンダーはCloudflareかVercelが(個人的には)おすすめCloudflare はドキュメントや事例が多い、Vercelは設定が簡単32
© 2023 Ateam Inc.何から始める?エッジランタイムでAPIエンドポイントを作ってみるHono x Cloudflare Workersがおすすめhttps://hono.dev/Typescriptでのルーターの書き味と、デプロイコマンドを叩いてから公開されるまでの速度に感動するはずある程度書けるようになったらKVやD1などのデータストアも使ってみるとよい33https://hono.dev/
© 2023 Ateam Inc.何から始める?デプロイの速さ34Hono の最小構成スクリプトを Cloudflare Workers に wrangler でデプロイ
© 2023 Ateam Inc.とりあえずデプロイの速さと応答速度(TTFB)を体感してほしい35
© 2023 Ateam Inc.一方で結構ハードルもある36
© 2023 Ateam Inc.留意しなければいけないことNode APIは動かないエッジランタイム初心者はみなこのハードルにぶつかる- fs などのNode依存なAPIは使用できない使用できるのはWeb標準API (DOMの操作を除くブラウザで使用できるAPI)- 故に現状使用できないnpmライブラリが多くあるので、代替ライブラリ探しの旅がつきもの例) JWTを処理するためのNPMライブラリ jsonwebtoken (観測している限りで一番DL数が多い)はNodeAPI依存のためエッジランタイムでは動かない => 代替は jose探すときにおすすめなのは、package.json の exports を見てみること。37
© 2023 Ateam Inc.留意しなければいけないことライブラリがエッジに対応しているかチェックできるサイトを作ることに38乞うご期待🚀
© 2023 Ateam Inc.留意しなければいけないことNode専用のAPIは動かない- Cloudflare Workersを使うのであれば、--node-compat を使ってみるConfigure wrangler.toml - Workersビルド時にpolyfillが入り、Bufferなどはウェブ標準なものに置き換えられる※ あくまで、一部のウェブ標準なAPIでpolyfill可能なもののみ。fsなどは置き換えられない。- あとはライブラリのIssueにリクエストを登録してみましょう39
© 2023 Ateam Inc.留意しなければいけないことNode専用のAPIは動かないと、書いたそばから、ビルドタイムではなくランタイムにpolyfillを入れたとの発表があった(2023/03/23)設定ファイル(wrangler.toml)にcompatibility_flags = [ "nodejs_compat" ]を追加すると互換モードで動かすことができる対応APIは順次追加されていく予定40https://blog.cloudflare.com/workers-node-js-asynclocalstorage/
© 2023 Ateam Inc.留意しなければいけないこと外部へのTCP接続はできない- Postgres/MysqlなどのDBや、Redisなどとは直接は接続できない例えば Prisma のネイティブ接続のモードではDBアクセスはできない- Cloudflareであれば、KV や D1、Duable Objects などの使用をおすすめします41
© 2023 Ateam Inc.留意しなければいけないこと外部へのTCP接続はできない- あるいはfetchを利用しているライブラリ・HTTPリクエストで返却できるリソースを選択しましょう例) Supabase + @supabae/supabase-js: 内部的にはPostgREST という REST を利用してデータリクエストができるPlanetscale + @planetscale/database: Supabase同様 REST APIに変換されるPrisma Data Ploxy: Prisma Cloudが提供するプロキシサーバが間に入ることで HTTP リクエストに変換される※ エッジがマルチロケーションなのに対して、基本的にはDBはシングルロケーションであることが多いそうなると、着弾するエッジによってはラウンドトリップが無視できなくなる可能性があることに注意425msTokyo Tokyo100msOregon
© 2023 Ateam Inc.留意しなければいけないことバンドルサイズ・CPUタイムのリミットに注意- バンドルサイズの制限はLambda等と比較するとかなり厳しい (理由は起動速度のスライドで説明の通り)43
© 2023 Ateam Inc.留意しなければいけないことバンドルサイズ・CPUタイムのリミットに注意- CPUタイムも厳しめ※カウントされるのはCPUを使用している時間のみ、fetchでのリクエスト待ちの時間などはカウントに入らないヘビーなこと(画像の生成とか圧縮とか)をしない限りは、リミッタを超えることはそうそうないが、リミットを超えても通知は基本的にないので、ダッシュボード等を要確認(ベンダーによって一定時間エラーになったり、課金が始まったりする)44
© 2023 Ateam Inc.まとめ45
© 2023 Ateam Inc.エッジコンピューティングは限りなくクライアントに近いオリジンであり、ユーザにとってのもう一つのクライアントでもある46
© 2023 Ateam Inc.エコシステムなどもかなり加速しており今後もますます発展していく47
© 2023 Ateam Inc.エッジコンピューティングの採用シーンの数やプライオリティも上がっていくかもしれない48
© 2023 Ateam Inc.ただし既存のクラウドコンピューティングを完全に置き換えるものではなさそう49
© 2023 Ateam Inc.おそらく今後求められるのは両立やコラボレーション、適材適所な選択50
© 2023 Ateam Inc.そして今は発展のために痛みを伴っている状態51
© 2023 Ateam Inc.発展のスピードに対して情報や人手も足りていない52
© 2023 Ateam Inc.この状況に投資・参画するか一歩引いて俯瞰するかはあなた次第53
© 2023 Ateam Inc.Let's enjoy edge runtime!54