CloudFrontの継続的デプロイで、AIに公開前の最終確認をさせる

 公開 2026-09-15

CloudFront continuous deployment(CloudFrontの継続的デプロイ)のヘッダー振り分けを使い、AIやスクリプトに本番ドメインからStagingの公開前の版を確認させる構成を整理する。人の確認は認証付きの確認用配信に分け、ヘッダーで届く経路を秘密として扱わない前提と、返った版を突き合わせる理由、運用で注意する点を示す。

静的サイトを公開する前に、新しい版を確かめる場所が要る。 人が見る確認用の画面は、ログインで閲覧者を限定しておきたい。 一方で、AIやスクリプトによる自動の確認は、人と同じログインを通れない。

本稿では、CloudFrontの継続的デプロイを使っている静的サイトで、人は認証付きの確認用配信から、自動の確認は本番ドメインへヘッダーを付けてStagingから、同じ公開前の版を確かめる構成を整理する。 当社のサイトの公開手順で採った構成で、経路を分けるときに決めたことと、運用で注意する点を示す。

1. 前提: 継続的デプロイの配信と、確認用の配信

CloudFrontの継続的デプロイ(CloudFront continuous deployment)は、本番の配信(Primary)とStagingの配信を組にして使う。 Stagingの設定で新しい版を試し、よければ昇格(Promote)でStagingの設定をPrimaryへコピーする。

公開前の版を人が確かめるために、Stagingとは別に、確認用の配信を置いている。 確認用の配信はStagingと同じ版を参照し、エッジでログインを求めて閲覧者を限定する。

別の配信を置く理由は、Stagingの配信へ直接アクセスできないためである。 閲覧者はStagingのドメイン名、IPアドレス、別名のどれでも直接リクエストできず、本番の配信へのリクエストの一部が、継続的デプロイのポリシーに従ってStagingへ送られる。

2. 振り分けの方式を選ぶ

継続的デプロイのポリシーには、振り分けの方式が2つある。

方式
Stagingへ送られるリクエスト
公開前の版を見る人
重み
本番へのリクエストのうち、指定した割合(最大15%)。同じ閲覧者を同じ側に固定する設定がある
一般の閲覧者の一部。誰に届くかは選べない
ヘッダー
指定したヘッダーと値を持つリクエストだけ。ヘッダー名は aws-cf-cd- で始める
ヘッダーを付けてリクエストした人だけ

重み方式は、実際の閲覧者で新しい設定を試すカナリアリリースに向く。 ただし公開前の版を確かめる目的では、確認が済む前の版が一般の閲覧者の一部に出るうえ、確認する側のリクエストがStagingに届くかは確率で決まる。

そこで、自動の確認にはヘッダー方式を選んだ。 ヘッダーを付けないリクエストは本番の配信のまま処理されるため、一般の閲覧者には影響しない。

3. 人と自動の確認で経路を分ける

一般の閲覧者は本番ドメインで本番の配信へアクセスし、公開中の版を受け取る。自動の確認は本番ドメインへ指定のヘッダーを付けてアクセスし、ポリシーが有効な間はStagingの配信へ振り分けられて公開前の版を受け取る。確認する人は確認用ドメインでログインし、確認用の配信から同じ公開前の版を受け取ることを示す図
3つの経路と、それぞれが受け取る版
経路
使う人
入口
閲覧者の限定
確認用の配信
確認する人
確認用のドメイン
ログインで限定する
Staging(ヘッダー)
AI・スクリプト
本番ドメインへ指定のヘッダーを付ける
しない。ヘッダーを知っていれば届く
本番の配信
一般の閲覧者
本番ドメイン
しない(公開中の版)

閲覧者を認証で限定したい場合は、確認用の配信で担保する。 Stagingの経路には認証がなく、見られにくさの根拠はヘッダーの名前と値が知られていないことだけである。

このため、ヘッダーの値は秘密情報として扱わないと決めた。 ヘッダーの名前と値は、インフラを定義するコード(IaC)とその状態ファイルに平文で残る。リポジトリや状態ファイルを読める人には分かる前提である。

この前提を受け入れられるのは、Stagingで見られるのが近く公開する予定の版だからである。 確認用の配信とStagingは同じ版を参照するので、ヘッダーの経路が使える間は、確認用の配信の中身も認証なしで見られる。 中身そのものを厳密に隠したい版では、ヘッダーの経路を開かない運用が要る。

4. 公開までの流れ

新しい版を配置してStagingと確認用の配信を向け、運用の手順でポリシーを有効にし、自動の確認で返った版が公開前の版かを確かめる。違えば時間をおいて再試行し、一致すればページを検査する。続けて人が確認用の配信で確認し、Stagingの設定をPrimaryへ昇格すると、ポリシーは自動で無効になる流れ図
配置から昇格まで
  1. 新しい版を配置し、Stagingと確認用の配信をその版へ向ける。
  2. 継続的デプロイのポリシーを有効にする。
  3. 自動の確認が、本番ドメインへヘッダーを付けて版の目印を取得し、公開前の版が返ったかを確かめる。
  4. 一致したら、同じヘッダーでページを検査する。
  5. 人が確認用の配信で内容を確かめる。
  6. 昇格する。CloudFrontはStagingの設定をPrimaryへコピーし、ポリシーを無効にする。以後、すべてのリクエストがPrimaryで処理される。

ポリシーの有効化は、IaCではなく運用の手順で行っている。 昇格のたびにCloudFront側でポリシーが無効になるため、IaCで有効・無効の値を持つと、実際の状態とすぐに食い違うからである。

当社の環境では、昇格の後もPrimaryとStagingにポリシーの紐付けが残ることを、操作の記録で確かめている。 それでも、配置の手順ではポリシーを有効にする前に紐付けを確かめ、なければ付けるようにしている。

5. 返った版を突き合わせる

ヘッダーを付けても、Stagingに届くとは限らない。 CloudFrontのサービス全体が混み合う時間帯は、ポリシーの設定に関係なく、すべてのリクエストがPrimaryへ送られることがある。

そのまま検査すると、公開中の版を公開前の版だと思い込んで合格させてしまう。 そこで、成果物に版の目印(配置した版の名前を書いた小さなファイル)を含め、自動の確認は最初にそれを取得する。

返った目印
判断
今回配置した版
Stagingに届いている。ページの検査に進む
公開中の版、または取得できない
Stagingに届いていない。検査せずに止め、時間をおいて再試行する

ページを検査するときも、ヘッダーは検査対象のドメインへのリクエストだけに付ける。 外部のサービスへ送るリクエストにまで付けると、ヘッダーの値を外部へ渡すことになる。

6. 運用で注意すること

注意点
内容
対応
IaCの差分
ポリシーを有効にしてから昇格するまでの間、IaCの定義(無効)と実際の状態(有効)が食い違い、差分として表示される
この間に別件で反映するときは、ポリシーを対象から外す。反映して無効に戻った場合は、配置をやり直す
レート制限
本番ドメインにWAFのレート制限があると、全ページを複数の画面幅で検査したときに上限を超える。WAFは直近の評価期間(既定は5分)のリクエスト数を数える
検査の側でリクエスト数を数え、上限を超えないように待つ
キャッシュ
PrimaryとStagingはキャッシュを共有しない。Stagingへの最初のリクエストはキャッシュが空の状態で処理される
速度の比較には使わず、表示と内容の確認に使う
HTTP/3
HTTP/3に対応した配信では、継続的デプロイを使えない
配信のHTTPのバージョンを確かめてから採用する

本番と同じ配信経路で確かめると、手元の確認では見つからない問題も見つかる。 当社では、配信の応答ヘッダーで指定しているコンテンツセキュリティポリシーが、UIのライブラリがCSSに埋め込んだフォントを許可しておらず、ブラウザが読み込みを拒否していたことが、この確認で分かった。 手元の確認用サーバーは同じヘッダーを返さないため、それまでの検査では出ていなかった。

7. まとめ

設計判断
内容
確認の経路を分ける
人は認証付きの確認用配信、自動の確認は本番ドメインへヘッダーを付けてStagingから
ヘッダー方式を選ぶ
重み方式は確認前の版が一般の閲覧者にも出るため、自動の確認には使わない
限定は確認用配信で担保する
ヘッダーの値は秘密にしない。IaCと状態ファイルを読める人には分かる前提
返った版を突き合わせる
混雑時はPrimaryへ送られるため、版の目印で届いた先を確かめてから検査する
有効化は運用で行う
昇格でポリシーが無効になるため、IaCで有効・無効を持たない

公開前の確認は、誰が見るかで守り方が変わる。 人のための経路は認証で限定し、自動の確認のための経路は「見られても困らない」前提で開き、届いた先を毎回確かめる。 経路ごとに前提を決めておくと、確認の自動化とアクセスの限定を両立できる。