Contents
Deno Deploy の概要と最新情報
Deno Deploy は、JavaScript/TypeScript アプリをエッジ上でサーバーレス実行できる公式クラウドサービスです。2024 年 3 月時点では GA(General Availability)版はまだ公開されていません が、ベータ版が Deno 2.0 を基盤に提供されています。ベータ版では V8 エンジンが 12 系に近いバージョンへ更新され、Fresh の公式サポートが追加されたことがリリースノートで確認できます(※Next.js・Astro は「実験的」または「カスタムアダプタ経由」の対応です)。本稿では、現在利用可能な機能を前提に安全かつスムーズにデプロイする手順を解説します。
前提環境の準備とプロジェクト構成
この章ではローカル開発環境の整備からリポジトリ構造まで、実装を始めるために最低限必要な項目を順に説明します。
**ポイントは「公式 CLI のインストール」「GitHub アカウントで無料枠を確保」そして「デプロイ設定ファイルを正しく配置する」ことです。
Deno CLI のインストール
公式サイトが提供しているシェルスクリプト/PowerShell を使うと、OS に依存せず最新の Deno 2.x が取得できます。インストール後はバージョン確認で deno 2. 系が表示されることを必ずチェックしてください。
|
1 2 3 4 5 6 |
# macOS / Linux curl -fsSL https://deno.land/x/install/install.sh | sh # Windows (PowerShell) iwr https://deno.land/x/install/install.ps1 -UseBasicParsing | iex |
注意:ベータ版でも
deno --versionは「v2.x」 と表示されますが、正式 GA がリリースされた際はバージョン番号が変わる可能性があります。
GitHub アカウントと無料プランの概要
Deno Deploy へのサインアップは GitHub アカウント経由のみです。無料プランで利用できる主なクオータは以下の通りです(2024 年 3 月時点)。
| 項目 | 上限 |
|---|---|
| 月間リクエスト数 | 1,000,000 回 |
| エッジロケーション | 世界 20 カ所 (自動負荷分散) |
| 永続ストレージ | 5 GB |
| KV ストア | 5 GB 相当 |
ディレクトリ構成と設定ファイル
以下は最小構成の例です。TypeScript を使う場合でも同じ形で問題ありません。
|
1 2 3 4 5 6 |
my-deno-app/ ├─ src/ │ └─ main.ts # エントリーポイント ├─ import_map.json # 外部モジュール解決マップ └─ deno.jsonc # Deno の設定ファイル |
import_map.json
|
1 2 3 4 5 6 7 |
{ "imports": { "$fresh/": "https://deno.land/x/fresh@1.5.0/", "$std/": "https://deno.land/std@0.225.0/" } } |
deno.jsonc
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
{ // エントリーポイントとインポートマップを指定 "entry": "./src/main.ts", "importMap": "./import_map.json", // ローカル開発用タスク(-A はローカル限定) "tasks": { "dev": "deno run -A src/main.ts" }, // フォーマット・リンティング設定は省略可 "fmt": { "options": {} } } |
ポイント:
-A(全権限)はローカルデバッグ用です。実際に Deno Deploy にデプロイする際は、ランタイムが自動で必要最小限の権限だけを付与します。
デプロイ手順:GitHub 連携・CI/CD・CLI
この章では「コードをプッシュしたら自動で Edge に届く」フローと、手動デプロイ用 CLI の両方を網羅的に紹介します。
結論としては、継続的デリバリーが必要な場合は GitHub Actions 経由、単発テストやローカルスクリプトからの呼び出しには CLI が便利です。
GitHub リポジトリ作成と Deno Deploy への接続
- GitHub 上で新規リポジトリを作成し、先ほどの
my-deno-appディレクトリをプッシュ。 - Deno Deploy のダッシュボードで 「New Project」 → 「GitHub」 を選択。
- 連携したいリポジトリとデプロイ対象ブランチ(通常は
main)を指定すると、プッシュごとに自動ビルド・デプロイが有効化されます。
補足:GitHub 連携時に生成された Deploy Token は後述のシークレット管理で GitHub Secrets に保存しておく必要があります。
GitHub Actions を利用した自動デプロイ設定例
現在(2024 年 3 月)公式ドキュメントが推奨するコマンドは deployctl です。deno deploy --project が存在しない環境もあるため、以下のように deployctl を使用します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
name: Deploy to Deno Deploy on: push: branches: [ main ] jobs: deploy: runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v3 - name: Install Deno (2.x) uses: denoland/setup-deno@v1 with: deno-version: v2.x - name: Deploy env: DEPLOY_TOKEN: ${{ secrets.DENO_DEPLOY_TOKEN }} run: | # deployctl は Deno が提供する公式デプロイ CLI deno install -A -f -n deployctl https://deno.land/x/deployctl@0.4.1/cli.ts deployctl deploy \ --project my-deno-app \ --token $DEPLOY_TOKEN \ --prod |
| 項目 | 説明 |
|---|---|
deployctl |
Deno Deploy 用公式 CLI。deno install -A でグローバルにインストールします。 |
--project |
ダッシュボードで作成したプロジェクト名(必須)。 |
--prod |
本番環境としてデプロイするフラグ。ステージングは省略可能です。 |
注意:
DEPLOY_TOKENはダッシュボードの「Settings → Tokens」から取得し、GitHub の Secrets に登録してください。
CLI (deployctl) での直接デプロイ手順
ローカル環境で動作確認が済んだら、次のコマンドで即座に本番へ反映できます。deno deploy が利用できない場合は deployctl を代替してください。
|
1 2 3 4 5 6 7 8 9 |
# 事前に Deploy Token を環境変数としてエクスポートしておく export DEPLOY_TOKEN=xxxxxxxxxxxx # デプロイ実行(プロジェクト名はダッシュボードと同一) deployctl deploy \ --project my-deno-app \ --token $DEPLOY_TOKEN \ --prod |
| オプション | 意味 |
|---|---|
--project |
ダッシュボードに登録したプロジェクト名。 |
--token |
認証トークン(環境変数で管理)。 |
--prod |
本番モードでのデプロイを指示。 |
結論:GitHub Actions が最も自動化に優れますが、CLI はローカルスクリプトや緊急リリース時に有用です。
環境変数・シークレット管理とデプロイ後の確認
本節では、本番環境で機密情報を安全に扱う方法と、デプロイ完了後に実際に動作しているかどうかを確認する手順を解説します。
**ポイントは「ダッシュボード UI だけで暗号化保存」し、「コード側では Deno.env.get のみを呼び出す」ことです。
ダッシュボードからシークレットを登録
- プロジェクトの左メニュー → Settings → Secrets を開く。
- Add Secret ボタンでキー名(例:
API_KEY)と値を入力し、保存する。 - 保存されたシークレットは自動的に環境変数としてランタイムに注入されます。
補足:GitHub Actions でも同様の名前で
secrets.API_KEYを参照すれば、ビルド時に露出しません。
コード側での取得例
|
1 2 3 4 5 6 |
// src/main.ts const apiKey = Deno.env.get("API_KEY"); if (!apiKey) { console.error("[error] API_KEY が設定されていません。デプロイ設定を確認してください。"); } |
--allow-env フラグは不要です。Deno Deploy のランタイムはシークレットに対して自動的に読み取り権限を付与します。
ロギング・ヘルスチェックの実装
- ロギング:
console.log/console.errorは即座にダッシュボードの「Logs」ビューへ送られます。 - ヘルスチェックエンドポイント:軽量な
/healthzを用意すると、外部モニタリングツールや自動ウォームアップに便利です。
|
1 2 3 4 5 6 7 8 9 |
addEventListener("fetch", (event) => { const url = new URL(event.request.url); if (url.pathname === "/healthz") { event.respondWith(new Response("OK")); return; } // 通常リクエストのハンドラ... }); |
フレームワーク別実装例と Classic vs GA の比較
この章では、現在 Deno Deploy が「公式に」サポートしている Fresh と、実験的・カスタムアダプタで利用できる Astro、および Next.js (Edge Runtime) の 3 パターンを具体例とともに紹介します。
さらに、旧環境(Deploy Classic)との主な違いを表形式でまとめます。
Fresh の最小構成
Fresh は Deno Deploy がネイティブサポートしている唯一のフレームワークです。以下は「Hello, World」だけを返す最小プロジェクトです。
|
1 2 3 4 5 6 7 |
fresh-project/ ├─ routes/ │ └─ index.ts ├─ static/ │ └─ logo.svg └─ deno.jsonc |
routes/index.ts
|
1 2 3 4 5 6 |
import { HandlerContext } from "$fresh/server.ts"; export const handler = async (_req: Request, _ctx: HandlerContext) => { return new Response("Hello from Fresh on Deno Deploy!"); }; |
deno.jsonc に $fresh/ の import map を追加すれば、GA(ベータ)環境でもそのままデプロイできます。
Astro のビルド → 静的配信設定
Astro は「静的サイト」出力が前提です。Deno Deploy では public/ ディレクトリ以下のファイルを自動で配信します。そのため、ビルド後に生成物(dist/)を public/ にコピーするステップが必要です。
-
プロジェクト作成
bash
npm create astro@latest my-astro-app
cd my-astro-app -
静的出力ビルド
bash
npm run build -- --output static # デフォルトで dist/ が生成される -
Deno 用タスク追加(
deno.jsonc)
|
1 2 3 4 5 6 7 |
{ "tasks": { // ビルド後に dist/ → public/ をコピー "build:astro": "npm run build -- --output static && deno run -A https://deno.land/std@0.225.0/fs/copy.ts ./dist ./public" } } |
- デプロイ
bash
deployctl deploy --project my-astro-app --token $DEPLOY_TOKEN --prod
ポイント:
public/配下に配置された HTML、CSS、画像はエッジで自動的にキャッシュされ、高速配信が実現します。
Next.js (Edge Runtime) の簡易セットアップ
Next.js は公式には「ネイティブサポート」対象外ですが、@vercel/edge-runtime を利用すれば Edge で動作させられます。以下は最小構成です。
|
1 2 3 4 5 6 |
next-edge/ ├─ pages/ │ └─ index.tsx ├─ next.config.mjs └─ deno.jsonc |
pages/index.tsx
|
1 2 3 4 |
export default function Home() { return <h1>Hello from Next.js on Deno Deploy (Edge)</h1>; } |
next.config.mjs
|
1 2 3 4 5 6 7 8 9 |
import { defineConfig } from "next"; export default defineConfig({ output: "standalone", // Edge 用に最適化 experimental: { runtime: "edge", }, }); |
deno.jsonc に tasks.build を追加し、npm run build && deno run -A https://deno.land/std@0.225.0/fs/copy.ts .next ./public とすれば、ビルド成果物が public/ 配下にコピーされ Deno Deploy で配信できます。
注意:この手法は「実験的」扱いです。公式のサポートが出るまで本番利用は自己責任で行ってください。
Classic vs GA(ベータ)比較表
| 項目 | Deploy Classic (2023‑12) | Deno 2.0 ベータ(GA 未リリース) |
|---|---|---|
| 使用 V8 バージョン | 9.4 系 | 12.0 系(V8 12.x に近い) |
| コールドスタート | 約200‑300 ms | 約80‑120 ms(最適化済み) |
| フレームワークサポート | Fresh のみ(公式) | Fresh + Astro (実験的) + Next.js (Edge Runtime) |
| KV ストア | 実験的機能のみ | 安定版 Deno KV が利用可能 |
| デプロイ方式 | 手動アップロード、GitHub 連携なし | GitHub Actions・CLI(deployctl)で自動化 |
結論:ベータ版は V8 の高速化と複数フレームワークの実験的サポートが最大の利点です。GA が正式にリリースされるまでは、機能の安定性を考慮して「Fresh」中心の構成で開発することを推奨します。
トラブルシューティング Q&A
以下は実際の運用で頻出するエラーとその対処法です。各項目は 原因 → 解決策 の形で記載しています。
| 質問 | 現象 | 原因・解決策 |
|---|---|---|
権限エラー (PermissionDenied) が出る |
Deno.env.get が undefined、またはファイル読み込みが失敗 |
環境変数は UI の Secrets に登録し、コード側では Deno.env.get のみ使用。ローカルで -A フラグを付けても、本番デプロイ時には自動で必要権限だけが付与されます。 |
| ビルド後に 404 エラーになる | 静的ファイルが Edge に届かない | Astro・Next.js の場合は必ず dist/(または .next/) を public/ 配下へコピーしたことを確認してください。deployctl deploy 前にローカルで ls public/ が期待通りのファイル構造になっているか検証します。 |
| Cold start が想定以上に遅い | 初回リクエストで 500 ms 超える | deployctl warmup --project <name> コマンド(ベータ)で事前ウォームアップするか、/healthz エンドポイントを Cloudflare Workers のスケジューラから定期的に叩くことでキャッシュ保持が可能です。 |
| V8 バージョン不一致エラー | ローカルでは動作するが Deploy でモジュールロード失敗 | deno.jsonc の "compat" フィールドは削除し、最新 API(例:fetch のストリーミング)に合わせてコードを書き直す。ベータ版のランタイムは V8 12 系なので、古いシンタックスは利用できません。 |
| Deploy Token が無効 | deployctl deploy が認証エラーで失敗 |
ダッシュボードの「Settings → Tokens」から新しいトークンを作成し、GitHub Secrets の DENO_DEPLOY_TOKEN を更新してください。古いトークンは自動で無効化されます。 |
まとめ
- 現在提供中のベータ版 は Deno 2.0 ベースで V8 12 系を搭載し、Fresh が公式サポート対象です。Astro と Next.js は実験的・カスタムアダプタ方式で利用可能です。
- 環境構築 は公式 CLI のインストール → GitHub アカウント作成 →
deno.jsonc/import_map.jsonを正しく配置するだけで完了します。 - デプロイ方法 は「GitHub Actions + deployctl が最も自動化に優れる」一方、CLI (
deployctl deploy) は単発テストや緊急リリースに便利です。 - シークレット管理 はダッシュボード UI で暗号化保存し、コード側は
Deno.env.getのみで取得します。-Aフラグはローカルデバッグ専用です。 - フレームワーク別実装例 を参考に、Fresh はそのまま、Astro はビルド後に
public/へコピー、Next.js は Edge Runtime 用設定を行うことで Deno Deploy に適応できます。 - Classic とベータの比較 では V8 の高速化・KV の安定提供が主な利点です。GA が正式リリースされた際は、公式ドキュメントでサポート状況とバージョン情報を再確認してください。
本ガイドに沿って環境構築からデプロイ、運用までを実施すれば、最新の Deno Deploy エッジプラットフォーム上で安全かつ高速なサーバーレスアプリケーションが提供できます。まずは無料アカウントを作成し、**Fresh の「Hello World」から試してみることをおすすめします。