外部組織管理のサブドメインを Cloudflare Workers に向ける — AWS CloudFront + WAF を前段に挟んだ記録
自分の管理外(外部組織)の DNS にあるサブドメインを Cloudflare Workers のカスタムドメインに割り当てたかったものの、Cloudflare Free プランは外部サブドメインを zone として受け入れない制約に行き当たり、最終的に AWS CloudFront + WAF を前段に挟む構成で解決した記録です。
cloudflareworkerscloudfrontawswafdnssecurity
台本(フルテキスト)
動画の掛け合いを書き起こしたものです。音声を再生しづらい場合はこちらをお読みください。
オープニング
- 外部組織管理のサブドメインを Cloudflare Workers に向けたい
- Cloudflare Free は外部サブドメインを zone として受け入れない
- ずんだもん
- こんにちは。今日は外部組織管理のサブドメインを Cloudflare Workers に向けようとして詰まった話を紹介します。
- めたん
- 外部組織のサブドメインというのはどういう状況ですか?
- ずんだもん
- Next.js アプリを Cloudflare Workers に移行する作業で、本番 URL が外部組織の DNS に属するサブドメインだったのだ。URL を変えられず、DNS の個別変更は依頼できるが管理は外部なのだ。
- めたん
- サブドメインをそのまま Cloudflare に CNAME で向ければよいのでは?
- ずんだもん
- それが動かない。Cloudflare Workers の workers.dev に CNAME を向けても、Cloudflare 側が SNI でルーティングできずにエラーを返すのだ。
- めたん
- なぜ動かないのですか?
CNAME が動かない理由と試した選択肢
- Cloudflare は自分の zone 外ホスト名を SNI でルーティングできない
- Cloudflare for SaaS は Pro $25/月 以上が必要、Vercel は排他クレーム済
- ずんだもん
- Cloudflare は自分の zone に登録されたホスト名か、Cloudflare for SaaS に登録済みのホスト名しか受け付けないのだ。ルーティング層と TLS 証明書の 2 つの理由がある。
- めたん
- Cloudflare for SaaS で対応できませんか?
- ずんだもん
- Pro $25 / 月以上が必要で、小規模サイトには継続コストが見合わないと判断したのだ。
- めたん
- Vercel は試しましたか?
- ずんだもん
- Vercel に登録しようとしたら、他のアカウントで既にクレーム済みというエラーが出て弾かれたのだ。排他クレーム方式のためクレーム解除に手間がかかる状況だったのだ。
- めたん
- 自前サーバでリバースプロキシを使うという手もあるのでは?
- ずんだもん
- 既存サーバが単一障害点として残り、移行の本来の目的だったエッジ配信と自前サーバ依存解消に逆行するため避けたのだ。
AWS CloudFront + WAF を前段に置く構成
- CloudFront は ACM 証明書で zone 不問にカスタムドメインを受け入れ
- Origin を workers.dev に向け、WAF で定型攻撃を遮断
- ずんだもん
- 最終的に採用したのが AWS CloudFront を前段に置く案なのだ。CloudFront は ACM の DNS validation で証明書を発行でき、ゾーン管理権限が不要なのだ。
- めたん
- Cloudflare と CloudFront の証明書発行の仕組みの違いは何ですか?
- ずんだもん
- Cloudflare はホスト名の zone が自社配下に必要。CloudFront は DNS で TXT か CNAME を 1 本立てるだけで証明書が発行される。zone を誰が管理しているかに関係ないのだ。
- めたん
- WAF はなぜ付けたのですか?
- ずんだもん
- Cloudflare の DDoS 防御の代替として、AWS WAF の Managed Rules を 3 つ有効化した。CommonRuleSet、KnownBadInputs、IpReputationList を適用しているのだ。
- めたん
- コストはどれくらいになりますか?
- ずんだもん
- 小規模トラフィックで月約 10 ドルの目安だ。CloudFront リクエスト・転送量が数ドル、WAF の Web ACL 固定費が 5 ドルほどかかるのだ。
構築手順
- ACM 証明書リクエスト → DNS 検証 CNAME を組織 DNS に追加
- CloudFront Distribution 作成 → alias 追加 → DNS カットオーバー
- めたん
- 構築の流れを教えてください。
- ずんだもん
- まず us-east-1 で ACM 証明書をリクエストし、DNS 検証用の CNAME を組織側の DNS に追加してもらうのだ。
- めたん
- 証明書が発行される前に CloudFront の Distribution は作れますか?
- ずんだもん
- 証明書が PENDING のうちは alias なしのデフォルト証明書で Distribution を先に作り、ISSUED になったら alias と ACM 証明書を追加する 2 段階の手順が必要なのだ。
- めたん
- Origin の設定で気をつける点はありますか?
- ずんだもん
- OriginRequestPolicy に AllViewerExceptHostHeader を設定する必要があるのだ。Host ヘッダを書き換えずに渡すと Cloudflare Worker が未知のホスト名として 404 を返してしまうのだ。
- めたん
- DNS カットオーバーはどのタイミングで行いますか?
- ずんだもん
- CloudFront が新しい alias で Deployed になったら、組織側に既存 A レコードの削除と CloudFront ドメインへの CNAME 追加を依頼するのだ。TTL は 300 秒にしておくと問題時の切り戻しが速いのだ。
まとめ
- 外部サブドメイン + CloudFront + WAF 構成で Workers への振り向けが可能
- 月約 $10 / Cloudflare for SaaS Pro $25 の代替として有効
- めたん
- 今日のポイントをまとめてください。
- ずんだもん
- Cloudflare Free/Pro では外部組織のサブドメインを zone として受け入れられないのだ。Cloudflare for SaaS や Vercel も状況によっては使えない場合がある。
- めたん
- そういう場合は AWS CloudFront を前段に置く構成が有効なのですね。
- ずんだもん
- CloudFront は証明書発行がゾーン管理に依存しないため、外部組織の DNS でも CNAME 変更だけで対応できるのだ。
- めたん
- WAF の Managed Rules 誤検知には注意が必要ですね。
- ずんだもん
- 本番投入前にダッシュボードのサンプルログで正常リクエストがブロックされていないか確認するのが安全なのだ。登場人物が多い構成なので、事前に層ごとの役割を整理しておくと構築が楽になるのだ。