出発点は「壊れていないサイト」だった
弊社のコーポレートサイトは、リニューアル前から静的サイトとして配信していました。
リニューアルの話をするとき、たいてい「今のサイトに問題があった」という書き出しになります。今回はそうではありませんでした。
【リニューアル前】
エンジニアがHTMLを編集
│ コミット / プッシュ
▼
CI(GitHub Actions)でデプロイ
│
▼
オブジェクトストレージ ──▶ CDN ──▶ 閲覧者
この構成、配信という観点では何の問題もありません。
- 表示は速い(CDNから静的ファイルを返すだけ)
- 落ちない(動的処理がないので、落ちる部分がない)
- 攻撃対象がない(PHPもDBも管理画面も、公開側に存在しない)
- 安い(ストレージとCDN転送だけ)
つまりインフラ的にはすでに理想に近い状態でした。これを壊してまでWordPressを入れる理由は、普通に考えればありません。
本当の課題は「サイトを更新できる人が限られていた」こと
問題は技術ではなく、運用の属人化でした。
コンテンツを1文字直すにも、こういう流れになります。
- 担当者が「ここを直したい」と依頼する
- エンジニアがHTMLを開いて編集する
- コミットしてプッシュする
- CIが走ってデプロイされる
誤字ひとつの修正にエンジニアの手が必要です。お知らせを1本出すのも、実績を1件追加するのも、同じ手順を踏みます。
これが積み重なると、じわじわと効いてきます。
- エンジニアが空くまで更新が止まる(リードタイムが人の予定に依存する)
- 軽微な修正でも依頼が必要になるため、更新の優先度が下がりやすい
- HTMLの構造を理解している人に依存する=運用が特定の担当者に紐づく
- 情報が古いままになり、サイトが「作った時点の状態」で止まる
一番まずいのは3つ目と4つ目です。サイトが更新されない理由が「面倒だから」になっている状態は、コンテンツを持つ意味そのものを削っていきます。
やりたかったことは、はっきりしていました。
配信の速さ・堅牢さ・安さは1ミリも手放さず、 「誰でも更新できる」だけを足す。
選択肢を3つ検討した
案A: WordPressをそのままホスティングする
「普通にWordPressで作ればいいのでは?」——ここは真っ先に検討しました。編集の楽さだけを見るなら、これが最短です。
ただしこの構成では、閲覧者のリクエストごとにPHPが動き、DBに問い合わせます。その瞬間に、静的配信で得ていたものを一通り手放すことになります。
| 静的配信 | WordPressを直接ホスティング | |
|---|---|---|
| 表示速度 | CDNがファイルを返すだけ | リクエストごとに生成 |
| アクセス集中 | 構成側がボトルネックにならない | PHPとDBがボトルネックになる |
| 攻撃対象 | 公開側に存在しない | 管理画面・ログイン・DBが公開側に出る |
| 費用 | ストレージとCDNのみ | アクセス増がサーバー費用に直結 |
編集の楽さを得るために、速度・可用性・セキュリティ・費用を差し出す構図です。
ここが今回の出発点でした。「運用が楽になればいい」だけなら案Aで十分です。 そうしなかったのは、楽さと可用性はトレードオフではないはずだと考えたからです。
却下しました。
案B: ヘッドレスCMS(SaaS)を導入する
編集画面はSaaSに任せ、フロントは静的生成する構成。筋は通っています。
ただ今回は、既存のテンプレートやページ構造をフロント側で作り直す必要がありました。「今あるものを維持したまま編集機能だけ足す」という要件に対して、作り直しの範囲が大きくなります。
新規構築であれば有力な選択肢だと思いますが、既存資産を そのまま活かしたい今回の要件には合いませんでした。
案C: WordPressを「HTML生成器」として裏側に置く ← 採用
WordPressは動かしますが、閲覧者には一切見せません。
【リニューアル後】
編集者がWordPressの管理画面で更新
│ 保存をきっかけに、関係するページをHTMLとして書き出す
▼
オブジェクトストレージ ──▶ CDN ──▶ 閲覧者
↑ ここは以前とまったく同じ
配信の部分は前と何も変わっていません。オブジェクトストレージにHTMLを置いてCDNで配信する、そのままです。
変わったのは「HTMLを誰が作るか」だけ。以前はエンジニアが手で書いてCIが運んでいた。今はWordPressが生成して自動で運ばれる。
つまりこの構成では、
- 配信の堅牢性・速度: 以前と同一(変えていないので、劣化する余地がない)
- 編集: 管理画面から誰でも
- エンジニアの関与: コンテンツ更新には不要
を同時に満たせます。今回はこれを選びました。
「CMSを足すとコストが増える」問題への答え
案Cの弱点は明確で、WordPressを動かす分のコストが増えることです。配信はもともと安いので、増分はまるごとCMSの費用になります。
ここは設計で対処しました。CMSを常時起動しないという方針です。
前述のとおり、閲覧者はCDN上の静的ファイルを見ています。CMSが止まっていても公開サイトは何の影響も受けません。だから、編集しない時間帯は止めておけます。
実際の運用では、CMSは平日の日中しか起動していません。夜間も土日もCMSは停止していますが、サイトは24時間365日配信されています。
結果として、CMSのコストは常時起動のおよそ1/5の稼働時間分に収まりました。配信部分は以前と同じ(コーポレートサイト規模なら実質ごくわずかな額)なので、全体の増分を最小限に抑えたまま、編集体験を手に入れた形になります。
さらにコンテナ実行基盤にはフルマネージドのサービスを選び、OSやミドルウェアの面倒を見ない構成にしました。小規模サイトの運用で地味に効くのは、この「管理しなくていいものを増やす」効果です。
ポイントは「止められる設計にしたから、止めてコストを下げられた」という順番です。 CMSが配信経路に入っていたら、止めるという選択肢自体がありません。
セキュリティ面:WordPressを入れても攻撃面は増えていない
「WordPressを入れた」と聞くと、まず脆弱性の心配をされると思います。
今回の構成では、公開ドメインにWordPressが存在しません。
- 公開側で動的処理がゼロ → プラグインの脆弱性を突く攻撃が成立しない
- 公開ドメインに管理画面が無い → ログイン試行の的にならない
- 公開側にDBが無い → SQLインジェクションの対象がない
CMS本体は別ドメインに置き、アクセス制限をかけています。そして公開HTMLにCMSのURLが残らないよう、書き出し時にすべて置換しています。外から見て「このサイトはWordPressで作られている」と分かる手がかりが出ません。
静的サイトのセキュリティ上の利点は、そのまま維持されています。
編集者から見ると
- 管理画面にログインする
- 記事を書く/実績を登録する
- 「更新」を押す
- 数分後に公開サイトに反映される
エンジニアへの依頼も、コミットも、デプロイの待ちもありません。内部的には、保存をきっかけに関係するページだけを再生成しています。記事を1本更新したら、その記事ページ・一覧ページ・トップページなど、その記事が載っている場所をまとめて焼き直す作り方です。
この構成で必ず設計が必要になる点
構成そのものは前述のとおりシンプルですが、実運用に載せるには押さえておくべき論点がいくつかあります。同じ構成を検討される方の参考になるよう、要点を共有します。
静的書き出しは「既製品が動かない」ことがある
WordPressの静的化プラグインはいくつもありますが、コンテナ環境・ヘッドレス運用では想定どおり動かないことがあります。今回も既製プラグインでは書き出しが0件になる事象に当たり、最終的にはWordPressからURL一覧を取得して1ページずつ取得する自前処理に置き換えました。
処理としては素朴ですが、同期的で、失敗が分かりやすく、ログが読める。運用に乗せることを考えると、こちらが正解でした。
「デプロイ中に2つ動いている」問題
コンテナをデプロイすると、新旧のインスタンスが一時的に並走する期間があります。この間に書き出し処理が両方で走ると、古い方が後に終わった場合、古い内容で上書きされ得ます。
コンテナ環境で「サイトを書き出して配信する」処理を動かす以上、ここは必ず設計しておくべきポイントです。
対策は3層入れています。
- 書き出し権限を1インスタンスに限定する(新しく起動した方が権限を持ち、古い方は自ら降りる)
- デプロイが落ち着くまで公開処理を始めない
- 公開後、配信先の中身が手元のソースと一致するか検証し、違えば異常終了する
3つ目が要です。「成功と表示されるが実は反映されていない」という一番厄介なパターンを構造的に潰せます。あわせて、どのインスタンスがいつ何を公開したか(識別子と出力内容のハッシュ)を記録しておくと、状態の追跡が容易になります。CI/CDでも同じですが、「やった」ではなく「そうなった」を確認するのは地味に重要です。
キャッシュは2種類に分けて考える
CDNを挟むと必ずキャッシュの話になります。割り切って2つに分けました。
- HTML: 短いTTL。記事を更新したら放っておいても切り替わる
- CSS/JS/画像: 長いTTL。デプロイ時に明示的にキャッシュを破棄する
記事の更新は頻繁ですが、デザインの更新はたまにしかありません。更新頻度が違うものを同じルールで扱わない、というだけの話ですが、最初に決めておくと運用がとても楽になります。
この構成が向いているケース
向いている
- すでに静的サイトを運用していて、更新がエンジニア依存になっている
- WordPressを使いたいが、速度・堅牢性・セキュリティを落としたくない
- コーポレート/採用/サービス紹介サイト、オウンドメディア
- 更新頻度が「1日数回」程度まで
向いていない(工夫が要る)
- 会員機能やログインが必要
- 検索・絞り込みをサーバー側で行いたい
- 在庫や価格がリアルタイムに変わるEC
- 秒単位の即時反映が必須
なお「一部だけ動的にしたい」(お問い合わせフォーム、簡単な検索など)は、その機能だけを独立させることで両立できます。今回もお問い合わせはサーバーレスの小さなAPIに切り出しており、サイト本体は静的なままです。
全部を静的にする必要はありません。動的である必要がある部分だけを動的にする、というのが現実的な設計です。
まとめ
- 静的配信の速さ・堅牢さ・安さと、CMSの編集の楽さは、どちらかを選ぶものではない
- 「運用を楽にするだけ」なら普通のWordPressで足りる。 楽さと可用性を同時に取りにいくなら、配信とCMSを分ける設計になる
- 鍵は「配信経路を変えないこと」。CMSは配信に入れず、HTMLを作る側に置く
- CMSを配信経路から外すと、止められる。止められるからコスト増を抑えられる
- 静的化は構成を選んだ時点では終わらない。運用に乗せるところまでが設計範囲
配信基盤(オブジェクトストレージ + CDN)自体は、以前から同じものを使っていました。変わったのは、そこに編集の仕組みを”配信を汚さずに”接続したという一点です。
Jamstackは「速いサイトを作る手法」として語られがちですが、実際の価値は運用と可用性を同じ構成の上で両立できることにあると考えています。
お問い合わせ
Bee2Bでは、JAMstack構成による高速・高可用なWebサイト構築に力を入れています。
この構成の最大の強みは可用性です。閲覧者に返しているのは事前に書き出されたHTMLファイルだけで、公開側にPHPもデータベースも存在しません。そのため——
- アクセスが急増しても落ちない — CDNが静的ファイルを配るだけなので、 瞬間的にトラフィックが跳ねても構成側がボトルネックになりません。 キャンペーンやメディア掲載など、読めない負荷に強い構成です
- 公開側に攻撃対象がない — 管理画面もログインフォームも公開ネットワーク上にありません
- CMSが停止してもサイトは動き続ける — 編集ができなくなるだけで、閲覧には影響しません
- アクセス増が費用に直結しない — 配信の主体はストレージとCDNです
こうしたご相談を承っています。
- 「サイト更新のたびにエンジニアの手が必要で、運用が止まりがち」
- 「WordPressを入れたいが、表示速度やセキュリティを落としたくない」
- 「アクセスが読めないので、落ちない構成にしておきたい」
- 「今の静的サイト構成は維持したまま、CMSだけ載せたい」
- 「リニューアルを機に、構成から費用対効果を見直したい」
このようなご相談を承っています。既存構成を拝見したうえで、費用対効果の観点から現実的な選択肢をご提案します。「そもそも作り直すべきか」からご相談いただいて構いません。