0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Cloudflare】Pages × Workersで作る「ドメイン制御付きCDN配信」構築ガイド

Posted at

はじめに

とある案件で「フロントにJSタグを1行入れるだけで使えるCDN配信システム」が必要になりました。
加えて「契約ユーザーだけが利用できるようにしたい」という要件もあり、ドメイン制御機能の実装が求められることに。

そこで今回は、Cloudflare PagesとWorkersを組み合わせて
ドメイン制御付きのCDN配信システムを構築しました。
その手順をまとめます💡

前提

今回の配信対象は静的アセットです。
(例:CSS / JS / 設定ファイル など)

システム要件は以下のとおり:

  • フロント側ではJSタグを1行読み込むだけで利用できること
  • 配信は 許可したドメインのみに制限できること

システム構成図

スライド1.png

ディレクトリ構成

ディレクトリはこんな感じ👇

root
├── public
│   ├── assets
│   │   ├── css
│   │   │   └── style.css
│   │   └── js
│   │       └── app.js
│   └── settings
│       └── config.json
├── README.md
└── workers
    └── プロジェクト名
        ├── src
        │   └── worker.js
        └── wrangler.toml

やったこと

構築フローはざっくり以下のとおりです。

  1. Cloudflare PagesとGitHubの連携
    • GitHubリポジトリをPagesに接続
    • オートデプロイ&CDN配信機能を利用
  2. 静的ファイルの配置
    • public配下にCSS / JS / 設定ファイルを格納
    • Pages側で自動的にビルド&配信
  3. Workersをプロキシとして利用
    • フロントではWorkersのエンドポイントを読み込むだけで利用可能
    • Workers経由でPagesの静的ファイルを間接的に配信
  4. ドメイン制御の実装
    • Workers側で許可ドメインのリストを定義
    • 許可外ドメインからのアクセスは403 Forbiddenを返却

worker.js のサンプルコード

const allowedDomains = JSON.parse(env.ALLOWED_DOMAINS || "[]");

const refererHost = new URL(request.headers.get("Referer") || "").hostname;

const isAllowed = allowedDomains.some(
  (domain) => refererHost === domain || refererHost.endsWith("." + domain)
);

if (!isAllowed) {
  return new Response("Access denied: Unauthorized domain", { status: 403 });
}

const targetURL = `${env.PAGES_BASE_URL}${new URL(request.url).pathname}`;
const res = await fetch(targetURL, { method: request.method, headers: request.headers });
return res;
  • ALLOWED_DOMAINS の読み込み
    環境変数から許可されたドメインリストを取得して配列化
  • Referer ヘッダーの確認
    リクエスト元(呼び出し側)のホスト名を取り出す
  • ドメインチェック
    許可リストと突き合わせて、含まれていなければ403 Forbiddenを返す
  • Proxy動作
    問題なければPAGES_BASE_URL(Cloudflare Pages側のURL)にリクエストを流し、静的ファイルを取得して返す

wrangler.toml のサンプルコード

[vars]
ALLOWED_DOMAINS = """
[
  "example.com",
  "example.org"
]"""
PAGES_BASE_URL = "https://プロジェクト名.pages.dev" # 各プロジェクトのPages URLに置き換え
  • ALLOWED_DOMAINS → 許可するドメインのリスト
  • PAGES_BASE_URL → Cloudflare Pages が発行するURL

⚠️ 実際のwrangler.toml 全文は Wrangler公式ドキュメントを参照

フロントでの使い方

フロント側では、WorkersのURLを読み込むだけでOK。

<script src="https://ワーカー名.workers.dev/assets/js/app.js"></script>

これで
✅ CDN配信
✅ ドメイン制御(許可されたドメインのみ)
が有効になります💪

参考リンク

Workersのデプロイにはwrangler CLIを利用しています。
セットアップ方法については公式ドキュメント、または以下の参考記事が分かりやすいです。

まとめ

今回、Cloudflare PagesとWorkersを組み合わせることで、ドメイン制御付きのCDN配信システムを構築することができました。

Cloudflareのおかげで、

  • Pagesに静的ファイルを置くだけで簡単にCDN配信できる
  • Workersを挟むことでアクセス制御などの機能を柔軟に追加できる

といった仕組みが思ったよりシンプルに実現できて、「こんなに手軽にできるのか!?」と実感しました。
同じように「契約ユーザー専用の配信システムを作りたい」という要件がある方には、この構成はかなりおすすめです!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?