今日から始めるDeno Deploy

Denoで変わるランタイムの景色 2024/06/21 (Fri)

Yusuke Tanaka (https://x.com/yusuktan)

はじめに

Denoアプリを爆速でデプロイできるDeno Deploy
特徴やユースケースをざっと紹介してから、実践形式でデプロイをやってみます。

爆速でDeno Deployライフを始めてみましょう!

自己紹介

  • 𝕏: @yusuktan
  • GitHub: @magurotuna

趣味でDeno(主にdeno_lintというリンター部分)にコントリビュートしていたら、いつのまにかDeno社に入社していました。
今はDeno Deployの開発をしています。

対象オーディエンス

  • Denoは使ったことがあるけど、Deno Deployを使ったことがまだない人
  • Denoを使ったことがないけど、JavaScript/TypeScriptで何か作って公開したい人
  • 無料で結構使えるPaaSを探している人
  • 組織でDenoを採用していて、デプロイ先を検討している人
対象ではないかもしれない人
  • すでにDeno Deployをたくさん使っている人

セッションの流れ

  1. Deno Deployの特徴
  2. Deno Deployのユースケース
  3. Deno Deployにデプロイしてみよう

1. Deno Deployの特徴

公式ページ (https://deno.com/deploy) によると...

Hassle-free platform for serverless JavaScript applications

Develop locally in JavaScript or TypeScript, deploy in seconds globally and scale to billions of requests.

👇 ChatGPT先生による翻訳 🎌

手間いらずのサーバーレスJavaScriptアプリケーションプラットフォーム

JavaScriptまたはTypeScriptでローカルに開発し、数秒でグローバルにデプロイ、そして数十億のリクエストにスケール可能

数秒でグローバルにデプロイ?🤔

本当でしょうか?

後ほどデプロイをいくつかの方法でやってみて、デプロイの速度をライブで検証してみましょう。

数十億のリクエストにスケール可能?🤔

Deno DeployはNetlify、Slack、Supabaseのようなサービスに対してJavaScript/TypeScriptの実行基盤を提供しています。

これらのエンタープライズ環境向けのリクエストも合わせると、月間100億リクエストほどの規模をさばいています。

「数十億のリクエストにスケール可能」というフレーズは、ここからきたものだと思います(多分)

でも、お高いんでしょう?

https://deno.com/deploy/pricing

無料プランで以下のリソースが利用可能です。

  • 月間100万リクエスト
  • 100GBデータ転送
  • 1GiBのKVストレージ

2. Deno Deployのユースケース(一例)

  • Fresh(Deno公式のフロントエンドフレームワーク)製のアプリを公開
  • Hono製のAPIサーバーのデプロイ
  • 定時実行するタスクを実行させる (Deno.cron が使えます!)
  • Webhookを受け取って非同期処理 (Deno KVベースのキュー機能)
  • リアルタイムにクライアント間で情報が同期されるアプリ
向いていないこと
  • 常時起動していなければならないバックエンドサーバー
  • CPUヘビーな処理

2-1. ユースケース1 Fresh🍋

Deno公式が提供するPreactベースのフロントエンドフレームワークです。

公式だけあって、デプロイ先としてはDeno Deployが推奨されています。

例えば https://deno.com もFreshで作られていて、Deno Deploy上でホスティングされています。

2-2. ユースケース2 Hono🔥

飛ぶ鳥を落とす勢いのWebアプリケーションフレームワークHonoも難なくDeno Deploy上にデプロイできます。

例えばDenoの公式ドキュメント https://docs.deno.com ではHono製のWebサーバーがDeno Deploy上で動いており、リダイレクトや動的コンテンツの配信などを担当しています。

2-3. ユースケース3 定時実行タスク

Deno.cron という関数をトップレベルに定義しておくと、スケジュールされたタイミングで指定した関数が実行されます。

// 毎分実行
Deno.cron("Log a message", "* * * * *", () => {
  console.log(`This will print once a minute. Current time: ${new Date()}`);
});

2-4. ユースケース4 Webhookハンドリング

Webhookペイロードをキューに積み、非同期に処理することができます (Webhook送信元には素早く200を返す)

const kv = await Deno.openKv();

// Webhookを受け取り、キューに積む
Deno.serve(async (req: Request) => {
  const payload = await req.json();
  await kv.enqueue(payload);
  return new Response("", { status: 200 });
});

// キューイングされたメッセージを処理する
kv.listenQueue(async (message) => {
  await handleWebhookMessage();
});

2-5. ユースケース5 クライアント間状態同期

BroadcastChannel (MDN) というWeb APIがあります。異なるウィンドウ、タブなどの間で通信を行うためのAPIです。
Deno Deployではこの解釈を拡大して、全世界に散らばるデータセンター上で立ち上がったV8 Isolate間で通信を行うためのAPIとして利用できます。

例えばリアルタイムに状態を同期するようなアプリを作ることができます。

https://pixelpage.deno.dev/

3. Deno Deployにデプロイしてみよう

そろそろDeno Deployにワクワクしてきたところだと思うので、実際にいくつかのやり方でデプロイしてみましょう。

おおまかに以下の4つの方法があります。

  1. Playground
  2. CLIツール deployctl
  3. GitHub Automatic(ビルドステップなし)
  4. GitHub Actions(ビルドステップあり)

3-1. 実践: deployctl

Deno DeployのCLIツール deployctl を使ってFreshプロジェクトをデプロイしてみます。

https://github.com/denoland/deployctl

⏲️ 「数秒」でデプロイできるでしょうか?
試走では10秒くらいでした。数秒?

deno run -A -r https://fresh.deno.dev
deno task build && deployctl deploy

3-2. 実践: GitHub Automatic

GitHubと連携することで、ブランチと連動した自動デプロイを行うことができます。

Honoで書いたAPIサーバーをこの方法でデプロイしてみます。

https://dash.deno.com/new_project

まとめ

  • Denoの開発体験の良さをそのままデプロイ体験につなげるDeno Deploy
  • すでに結構な規模のリクエストをさばいていて、エンタープライズ環境での実績もある
  • パワフルでポータブルなWeb API、ますます充実しつつあるNode.js互換性
  • ホビーユースから企業利用まで幅広く対応

今日からDeno Deployを使ってみてください!
質問などもお気軽にお寄せください 🙋

License

  • High-res Deno logo by kevinkassimo, licensed under the MIT License