Topics

既存サイトを「後付けSSR」で一部CMS化(Cloudflare Pages Functions + microCMS の活用メモ)

  • column

こんにちは、リベロジックでCTOをしている大塚です。

記事をなんとか!と言われてもなぁ……。

ということで「既存サイトの一部CMS化」について、ちょっとした技術メモを残しておこうと思います。

昔ならPHPを使って「HTMLの中にロジックを流し込む」のが定番でしたが、今はCloudflare PagesのFunctionsを使うことで、もっとスマートに、きちんとGoogleにインデックス化できるSEOを配慮した構成が作れるんですよね。

今回はEleventyで構築された静的サイトに、Cloudflare Pages Functionsで「後付けSSR」を施してmicroCMSを組み込んだ話を紹介します。

今回の構成のポイント

今回のプロジェクトでは、Eleventy + Nunjucks を使ってフロントエンドを構築しています。 Astroのようにプロジェクト内にFunctionsを内包する形ではなく、dist/ に出力された静的HTMLに対して、後から動的コンテンツを差し込む 式を採用しました。

意外と取り回しが良くて便利ですね。

1. プレビュー環境だけBasic認証をかけたい

要件としてあったのが「プレビュー環境では認証を入れたいけど、本番では不要なWorkerの実行(コスト)を極力減らしたい」というもの。 そこで、ビルド前処理でちょっと工夫して、本番ビルドの時だけ _middleware.js を削除するという運用です。

本番環境では認証処理を通らずに済むので、余計な実行コストを抑えつつセキュリティと利便性を両立させています。

2. Cache APIでmicroCMSのレスポンスをキャッシュ

SSR(サーバーサイドレンダリング)にすると、どうしても気になるのが「リクエストのたびに API を叩きに行く負荷やレイテンシ」ですよね。

そこはCloudflareのCache APIを利用して、レスポンスをエッジでキャッシュさせることにしました。 キャッシュTTLは5〜10 分程度と短めに設定。

鮮度を保ちつつパフォーマンスもしっかり確保しています。

3. KVを使ったキャッシュパージ(revalidate)

短いTTLとはいえ「更新した瞬間に反映されない」のは運用側としては少しストレスです。 そこでCloudflare KVをrevalidateの制御用ストアとして活用しました。

仕組みはシンプルです。

  • microCMSで記事を更新するとWebhookが飛ぶ
  • そのタイミングでKVの値を更新
  • Pages Functions側でKVの値をトリガーに、キャッシュを無効化するか判定

これで「普段はキャッシュで爆速、更新時は即時反映」という、いいとこ取りの設計になりました。

まとめ

こういう「既存の静的サイトの良さを活かしつつ、必要なところだけエッジで加工する」というアプローチは、運用の柔軟性が高くて気に入っています。

昔のPHP的な手軽さを現在のCloudflareのパワーで再現する! 派手なフレームワーク移行もいいですが、こういう「地に足のついた改善」が実は一番現場で役立つんですよね。

ではでは。

この記事を書いた人

リベロジック技術部門の屋台骨。「こんなものが欲しいなぁ、あったら便利だよなぁ〜」という言葉を聞くと、持ち前の知恵で付加価値までつけて、あっという間に実装。コミュ力が高くお客様にファンも多い弊社の宝、そして猫大好き人間。

翔さん

取締役CTO / チーフエンジニア / 合同会社猫穴代表 / 無駄に若く見える

このスタッフの記事を見る

安心のチーム体制とスピードのある対応力が自慢

リベロジックでは、ベテランスタッフが積極的にプロジェクトを推進するため、お客様から高く評価されています。
プロジェクトマネージャー、ディレクターをきちんとアサインし、プロジェクト全体をスムーズに進行することを心掛けています。 不必要なフルコミットでのコスト増加を防ぎ、適材適所にリソースを配分するスタイルで、業務内容の把握から見積作成/提出の速さにも定評があります。

当社はSES的な常駐業務等は積極的に行っておりませんので予めご了承ください。

Slack、Teams、Redmine、Backlog、Asana、Jira、Notion、Google Workspace、Zoom、Webexなど、ほぼすべての主要なプロジェクト管理ツールやチャットツールをご利用いただけます。

SESやオフショアを利用する大規模案件において、技術的な課題や取り組み方にお悩みはございませんか?

ケーススタディ