システム開発
5 min read

Cloudflare Pages × Workers実装ガイド:高速HPと問い合わせフォーム構築

#Cloudflare Workers 問い合わせフォーム#Cloudflare Turnstile 使い方#Resend Cloudflare Workers#Cloudflare Pages Functions Workers 違い
Definition

Cloudflare Workersとは、世界中のエッジサーバーでJavaScriptを実行できるサーバーレス環境です。Pages(フロントエンド)と組み合わせることで、サーバー管理なしに動的機能(フォーム、認証、API)を低遅延・低コストで実装可能です。

TL;DR (要約)

静的サイト運用で最大の壁となる「フォーム」は、Cloudflare WorkersとResend(メールAPI)で解決します。さらに無料のTurnstile(スマートCAPTCHA)を挟むことで、ボットやスパムを排除。本構成はサーバー管理不要・月額無料から開始でき、将来的なWAF導入やDDoS対策への拡張性も兼ね備えた、現在最も合理的なアーキテクチャです。

この記事でわかること

  • なぜ Pages だけでは“問い合わせフォーム”が鬼門なのかについて学べます
  • 選定基準:Pages / Functions / Workers 比較について学べます
  • アーキテクチャ(Bot排除とメール送信)について学べます
  • 実装手順(番号付きガイド)について学べます
  • 運用設計(脅威モデルと対策)について学べます
  • Vercel と比較(開発者目線)について学べます
  • 発展:WAF / CDN / Zero Trust への布石について学べます
  • まとめについて学べます
  • よくある質問 (FAQ)について学べます
  • 参考リンク / 出典について学べます

なぜ Pages だけでは“問い合わせフォーム”が鬼門なのか

Cloudflare Pagesのような「静的サイトホスティング」は、サーバーが存在しないため、「メールを送る」「データベースに保存する」といった処理が単体ではできません。

安易に外部からのJavaScriptだけで処理しようとすると、APIキーが漏洩し、スパムの踏み台にされるリスクがあります。そこで、「フォームの裏側で動く極小のサーバー」が必要になります。

Note: 本記事は実装・運用にフォーカスした技術解説です。Cloudflare Pagesの基本的な構築手順や、Vercelとの料金比較(経営者・Web担当者視点)については、こちらの導入ガイドをご覧ください。

▼ フォーム実装の3つの選択肢

方式 A. 外部SaaS埋込 B. Pages Functions C. Workers (推奨)
概要 Google Forms等をiframeで貼る。 Pagesのリポジトリ内にAPIを書く。 独立したAPIサーバーとして立てる。
メリット 実装ゼロ。 フロントエンドと同じGit管理。 再利用性・拡張性が最強。
デメリット デザインが崩れる。ドメインが異なる。 デプロイがPagesと連動するため遅い。 別途リポジトリ管理が必要(最初は手間)。
中小企業HPへ × (非推奨) △ (簡易用途なら可) ◎ (将来の標準)

「B: Pages Functions」も悪くありませんが、将来的に「スマホアプリからも送りたい」「他のサイトでも使いたい」となった時、独立した「C: Workers」の方が柔軟性が高いため、本記事ではCを推奨します。

選定基準:Pages / Functions / Workers 比較

開発者が迷いやすい、Cloudflare内の機能の使い分け基準を整理します。

比較軸 Pages Functions Cloudflare Workers
デプロイ単位 フロントエンド (Pages) と同時。 独立して数秒でデプロイ可能。
ルーティング ファイルパス依存 (/api/...) workers.dev またはカスタムドメインで自由。
Secrets管理 Pages設定画面(GUI)のみ。 wrangler secret コマンド (CUI) で安全管理。
ログ・監視 Pagesのビルドログと混ざり見づらい。 tail コマンドでリアルタイム監視が可能。
WAF連携 Pages全体への適用。 Worker単位でルートやルールを適用可能。

※最終確認日:2025-01-13 (公式ドキュメント参照)

特に「Secrets管理」と「リアルタイムログ」の点で、バックエンド処理にはWorkersの方が運用強度が一段上です。

アーキテクチャ(Bot排除とメール送信)

今回構築するシステムの全体像です。

クライアントからは直接メールを送らず、必ずWorkerを経由します。ここで「Turnstileの認証トークン」をチェックすることで、ボットによる大量送信を水際で遮断します。

Loading Diagram...

実装手順(番号付きガイド)

実運用に耐えうる構成での実装ステップです。以下の手順に従って構築を進めてください。

チェックリスト

  • □ TurnstileのSecret KeyとResendのAPI Keyを取り違えていないか
  • □ Workerのデプロイ後、環境変数が反映されているか(反映に数十秒かかる場合あり)
  • □ CORS設定で、自分のサイト(Origin)のみを許可しているか

Cloudflare Turnstile の発行

Cloudflareダッシュボード > Turnstile > [サイトを追加]。
ドメイン名を入力し、ウィジェットモードは「Managed(推奨)」を選択。
「Site Key(公開)」と「Secret Key(非公開)」の2つを取得します。

Resend のAPI Key発行とドメイン設定

Resendでアカウント作成し、API Keyを取得。
[Domains] 設定で自社ドメインを追加し、表示されるDNSレコード(DKIM / SPF)をCloudflareのDNSに追加します。
※これをやらないと、送信したメールがGmail等でスパム扱いされます。必須です。

Workerプロジェクトの作成

ターミナルで `npm create cloudflare@latest contact-api` を実行。
テンプレートは「Hello World」等の最小構成を選択します。

Secrets(環境変数)の設定

コードに直接キーを書いてはいけません。wranglerコマンドで暗号化して保存します。
実行: `npx wrangler secret put TURNSTILE_SECRET_KEY`
実行: `npx wrangler secret put RESEND_API_KEY`

Workerコードの実装(バリデーションと送信)

以下の順序で処理を実装します。1つでも失敗したら即エラーを返します。
1. CORSヘッダーの処理(OPTIONSリクエストへの応答)
2. リクエストボディからのデータ取り出し
3. Turnstile認証APIへの問い合わせ(トークン検証)
4. 入力値のバリデーション(空文字チェック、文字数制限)
5. Resend APIへのPOST送信
6. 成功レスポンスの返却

クライアント側(Pages)の実装

`react-turnstile` 等のライブラリを使い、フォーム送信時にトークンを取得。
取得したトークンをWorkerへのPOSTボディに含めて送信します。

デプロイと動作確認

`npx wrangler deploy` で公開。
実際のフォームから送信し、Resendのログと自分のメールボックス両方で受信を確認します。
← 横にスクロールできます →

運用設計(脅威モデルと対策)

「動けばいい」で作ったフォームは、攻撃者の格好の標的になります。最低限考慮すべき脅威と対策をまとめました。

脅威 (Threat) 具体的な攻撃内容 実装すべき対策
Botスパム 問い合わせフォームから広告や詐欺URLを大量に送りつける。 Turnstile (必須)
Honeypot (隠しフィールド)
DoS攻撃 APIを過剰に叩き、Resendの送信上限を枯渇させる。 Rate Limiting (Cloudflare WAF)
IP制限
なりすまし 自社ドメインを騙ってウイルスメールを撒く。 DKIM / SPF / DMARC設定。
ResendでVerify済みドメインのみ使用。
キー漏洩 GitHubにAPI Keyをコミットしてしまい、悪用される。 Secrets管理 (環境変数)。
コード内ベタ書き厳禁。

特に「Botスパム」は公開後すぐに来ます。Turnstileを入れておけば、ユーザーに「自転車のタイルを選んでください」といった面倒なパズルを強いることなく、裏側でAIがボット判定してくれます。

Vercel と比較(開発者目線)

VercelのServerless Functionsも優秀ですが、Cloudflare Workersには「コールドスタート(起動遅延)がほぼ無い」という特性があります。

項目 Vercel Functions Cloudflare Workers
実行環境 Node.js (AWS Lambdaベース) V8 Isolate (Chromeと同じ)
起動速度 数百ms〜数秒 (コールドスタート有) 0ms (ミリ秒)
無料枠 100GB-hours / 月 10万リクエスト / 日
Node.js互換 完全互換 一部互換 (特定APIは動かない)

メール送信のような軽い処理には、Workers(V8 Isolate)の爆速起動が相性抜群です。一方で、重い画像処理や複雑なNode.jsライブラリを使う場合はVercelに軍配が上がります。

発展:WAF / CDN / Zero Trust への布石

本構成の真の価値は、フォームを作った後にあります。Cloudflareのエコシステムに乗っているため、以下のようなセキュリティ強化が「管理画面の設定だけ」で可能になります。

  • WAF (Web Application Firewall):特定の国やIPからのアクセスをブロック。
  • Rate Limiting:「1分間に10回以上送信してきたら1時間ブロック」等のルール設定。
  • Zero Trust:社内管理画面を追加で作る際、VPNなしで安全にアクセス制御。

「まずはフォームから」始めたとしても、将来的にエンタープライズレベルのセキュリティ基盤へとスムーズに拡張できるのがCloudflareの強みです。

まとめ

「静的サイトだからフォームは諦める(またはGoogleフォームで妥協する)」必要はありません。Cloudflare Workersを使えば、セキュアで高速、かつ運用費の安いフォームが作れます。

チェックリスト

  • □ Turnstileサイトキー/シークレットキーを発行・保全した
  • □ Resendでドメイン認証 (DNS設定) を完了させた
  • □ Workerの環境変数にSecretを設定した
  • □ Cloudflare WAFで異常なレート制限がかかっていないか確認した

よくある質問 (FAQ)

よくある質問

Q. TurnstileはreCAPTCHAと何が違うのですか?

最大の違いは「ユーザー体験」です。reCAPTCHAのような画像選択パズルがほとんど発生せず、ブラウザの挙動から人間かどうかを自動判定します。また、プライバシー重視でトラッキングを行わない点も企業のコンプライアンス的に有利です。

Q. 無料プランでどこまで耐えられますか?

Workersの無料プランは「1日10万リクエスト」までです。問い合わせフォームとしては十分すぎる容量です。Resendの無料プラン(月3000通)の方が先に上限に来るでしょう。

Q. ResendのFromアドレスはGmailでもいいですか?

いいえ、推奨されません。Gmail等をFromにすると、DMARCポリシーにより受信拒否される確率が高いです。必ず独自ドメイン(例: noreply@yourdomain.com)を設定してください。

Q. Pages FunctionsとWorkers、結局どっちが良い?

「そのサイト専用の簡易API」ならFunctionsの方が管理が楽です。「複数のサイトから使い回したい」「細かく監視ログを見たい」ならWorkersです。本番運用ではWorkersをおすすめします。

Q. 将来的にWAFを入れるタイミングは?

「スパムが目視で確認できるほど増えた時」または「特定の国からの攻撃ログが見えた時」で構いません。Cloudflareなら後からいつでもオンにできます。

モダンで拡張性の高いシステム開発

Next.jsやクラウドネイティブ技術を活用し、ビジネスを加速させるシステムを構築します。

システム・アプリ開発について
Theme Overview

モダンなWeb開発の標準:Next.jsとヘッドレスCMSによる構築

このテーマの全体像を把握し、より体系的な理解を深めましょう。

全体像を読む

ビジネスの課題解決を、
もっと具体的に。

Malakeは、テクノロジーと戦略の両面から
貴社のビジネス変革をサポートします。