CloudFront の Server-Timing ヘッダーをサンプリングレート 0 % で有効化し、Pragma: server-timing で取得してみた

CloudFront の Server-Timing ヘッダーをサンプリングレート 0 % で有効化し、Pragma: server-timing で取得してみた

CloudFront のレスポンスヘッダーポリシーで Server-Timing ヘッダーを有効化し、サンプリング率を 0% に設定した場合の動作を検証しました。Pragma: server-timing ヘッダーの有無で Server-Timing ヘッダーの返却がどう変わるのか、実際の設定手順と確認結果をご紹介します。
2026.09.01

はじめに

テクニカルサポートの 片方 です。
以前、Amazon S3、Amazon CloudFront、AWS Certificate Manager(ACM)、Amazon Route 53 を利用して、独自ドメインの静的サイトを HTTPS 配信する環境を構築しました。S3 バケットはパブリック公開せず、CloudFront の Origin Access Control(OAC)を利用して、CloudFront 経由でのみコンテンツを配信する構成です。

CloudFront では、Response headers policy を利用して、ビューアーに返す HTTP レスポンスヘッダーを追加・削除できます。その設定の一つに Server-Timing ヘッダーがあります。
Server-Timing ヘッダーを利用すると、CloudFront のキャッシュ状況やオリジン応答に関する情報を確認できます。一方で、常時レスポンスへ付与するのではなく、調査時のリクエストに限定して取得したい場面もあります。

https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/understanding-response-headers-policies.html

そこで今回は、既存の静的サイト配信環境に対して Server-Timing を有効化し、サンプリング率を 0 % に設定しました。そのうえで、通常のリクエストと Pragma: server-timing ヘッダーを付与したリクエストで、Server-Timing ヘッダーの返却有無がどのように変わるかを確認します。

本ブログで確認すること

  • サンプリング率を 0 % にした場合、通常のリクエストで Server-Timing ヘッダーが返却されるか
  • Pragma: server-timing を付与すると、サンプリング率が 0 % でも Server-Timing ヘッダーを取得できるか

※ Pragma: server-timing はクライアント側で付与できるリクエストヘッダーです。本ブログの設定は Server-Timing ヘッダーを運用者だけに公開するアクセス制御ではない点に注意してください。

先に結論から

CloudFront のレスポンスヘッダーポリシーで Server-Timing ヘッダーを有効化し、サンプリングレートを 0 % に設定しました。
その結果、以下を確認できました。

  • 通常のリクエストでは Server-Timing ヘッダーは返却されませんでした。
  • Pragma: server-timing を付与したリクエストでは、Server-Timing ヘッダーが返却されました。
  • 今回は cdn-cache-misscdn-upstream-connectcdn-upstream-fblcdn-downstream-fbl などを確認できました。

ただし、Pragma: server-timing はクライアントが任意に指定できるため、Server-Timing ヘッダーを運用者だけに制限するアクセス制御には利用できません。

検証環境について

本ブログでは、以下の既存環境を検証対象とします。

https://dev.classmethod.jp/articles/s3-cloudfront-acm-route53-https-static-site/

Amazon S3 に配置した静的コンテンツを Amazon CloudFront 経由で配信し、AWS Certificate Manager(ACM)で発行した証明書と Amazon Route 53 のエイリアスレコードを利用して、独自ドメインで HTTPS 配信しています。

Client (curl)
  ↓ HTTPS
Amazon Route 53
  ↓ Alias A レコード
Amazon CloudFront
  ├─ ACM 証明書
  ├─ Response headers policy ※今回設定する対象
  └─ Origin Access Control (OAC)

Amazon S3
  └─ 静的コンテンツ

検証環境の主な設定は以下のとおりです。

項目 内容
配信するコンテンツ Amazon S3 に配置した静的コンテンツ
S3 バケット パブリックアクセスをブロック
S3 へのアクセス CloudFront の Origin Access Control(OAC)を利用
CDN Amazon CloudFront
HTTPS 証明書 ACM で発行した証明書
DNS Amazon Route 53
検証先 独自ドメインのルートパス(/)
検証クライアント curl
今回の変更箇所 CloudFront の Response headers policy

S3 の静的ウェブサイトホスティング機能は利用していません。S3 バケットを CloudFront の S3 オリジンとして設定し、OAC を利用して CloudFront Distribution からの s3:GetObject のみを許可しています。この構成により、S3 バケットやオブジェクトを直接公開せずに静的コンテンツを配信できます。
また、CloudFront で ACM 証明書を利用するため、証明書は米国東部(バージニア北部)リージョン(us-east-1)で発行しています。

今回は、既存の CloudFront Distribution の対象 Behavior に Response headers policy を関連付け、次の設定を追加します。

設定項目 設定値
Server-Timing 有効
Sampling rate 0 %

Response headers policy では、CloudFront がビューアーへ返すレスポンスに追加・削除する HTTP ヘッダーを定義できます。本ブログでは Server-Timing ヘッダーを対象に、通常のリクエストと Pragma: server-timing を付与したリクエストの差異を確認します。

実装してみた

今回は、CloudFront の Response headers policy で Server-Timing を有効化し、サンプリング率を 0 % に設定します。
サンプリング率が 100 % の場合、CloudFront は対象のキャッシュビヘイビアに一致するすべてのレスポンスへ Server-Timing ヘッダーを付与します。一方、0 % に設定すると通常のリクエストには付与されません。ただし、リクエストに Pragma: server-timing を含めた場合は、サンプリング率にかかわらず Server-Timing ヘッダーが返されます。

Response headers policy を作成する

CloudFront コンソールで Policies → Response headers を開き、「レスポンスヘッダーポリシーを作成」 を選択します。

01

今回は、以下の値を設定しました。

項目 設定値
Name server-timing-sampling-zero
Description Enable Server-Timing only when requested with Pragma header.
Server-Timing header 有効
Sampling rate 0

Name は環境内で識別しやすい任意の値を指定します。今回は、Server-Timing を有効化しつつサンプリング率を 0 % にしたことが分かる名前にしました。
Server-Timing header の設定を有効にすると、サンプリング率を指定できます。指定可能な値は 0 から 100 までで、小数第 4 位まで設定できます。
設定後、作成 を選択して Response headers policy を作成します。

02
03

CloudFront Distribution のキャッシュビヘイビアへ関連付ける

続いて、作成した Response headers policy を既存の CloudFront Distribution へ関連付けます。
CloudFront コンソールで対象の Distribution を開き、Behaviors タブから検証対象のキャッシュビヘイビアを選択して 編集 を選択します。
今回は、静的サイトのトップページを配信しているデフォルトキャッシュビヘイビアへ関連付けました。

項目 設定値
Path pattern Default (*)
Response headers policy server-timing-sampling-zero

すでに Response headers policy を設定している場合は注意が必要です。1 つのキャッシュビヘイビアに関連付けられる Response headers policy は 1 つです。既存のセキュリティヘッダー用ポリシーを利用している場合は、それを外して新規ポリシーへ置き換えるのではなく、既存ポリシーへ Server-Timing の設定を追加することを検討してください。
Response headers policy は、CloudFront がビューアーへ返す HTTP レスポンスにヘッダーを追加・削除するためのポリシーです。キャッシュから返されるレスポンスと、オリジンから取得したレスポンスの両方に適用されます。
設定を保存後、Distribution の反映を待ちます。CloudFront コンソールの Status が Deploying から Deployed になったことを確認してから、後続の確認を行います。

04
05

確認してみた

CloudFront Distribution のステータスが Deployed になったことを確認してから、独自ドメインに対してリクエストを実行しました。

export TARGET_URL='https://<独自ドメイン>/'

※ 独自ドメインを <独自ドメイン> と表記します。実際の検証では、自身の環境の独自ドメインを指定してください。

Pragma: server-timing を付与せずにリクエストする

はじめに、Pragma: server-timing を付与せずにリクエストします。
検証日時もあわせて出力するため、以下を実行しました。

date -u '+%Y-%m-%dT%H:%M:%SZ'

curl -sS -D - -o /dev/null \
  "${TARGET_URL}" \
  | grep -iE '^(server-timing|x-cache|age|via):'

実行結果は以下のとおりです。

2026-08-29T07:41:25Z
HTTP/2 200 
content-type: text/html
content-length: 9143
date: Sat, 29 Aug 2026 07:41:26 GMT
last-modified: Fri, 28 Aug 2026 12:13:11 GMT
etag: "c9a0cd47e5aabf9362fb6efb3e439af0"
x-amz-server-side-encryption: AES256
x-amz-version-id: EcMhfqMgi0nibVkepCsHJJ5bDHUsMEt4
accept-ranges: bytes
server: AmazonS3
x-cache: Miss from cloudfront
via: 1.1 02ed41441a9b54c4370b988e0a610cbe.cloudfront.net (CloudFront)
x-amz-cf-pop: NRT12-P1
x-amz-cf-id: j8Vw2UIbRd7hdQ9BCIQrOXCM2fUetvDKmB-Vzz_neudFIsadLwtcOQ==

Server-Timing ヘッダーは返却されませんでした。
Response headers policy では Server-Timing を有効化していますが、サンプリング率を 0 に設定しているため、Pragma: server-timing を含まない通常のリクエストでは Server-Timing ヘッダーが付与されないことを確認できました。

06

Pragma: server-timing を付与してリクエストする

次に、Pragma: server-timing を付与して同じ URL へリクエストします。

date -u '+%Y-%m-%dT%H:%M:%SZ'

curl -sS -D - -o /dev/null \
  -H 'Pragma: server-timing' \
  "${TARGET_URL}" \
  | grep -iE '^(server-timing|x-cache|age|via):'

実行結果は以下のとおりです。

2026-08-29T07:46:15Z
x-cache: Miss from cloudfront
via: 1.1 6f5c56b3519e8f4cd3e201cadf5f5b40.cloudfront.net (CloudFront)
server-timing: cdn-upstream-layer;desc="EDGE",cdn-upstream-dns;dur=0,cdn-upstream-connect;dur=6,cdn-upstream-fbl;dur=47,cdn-cache-miss,cdn-pop;desc="NRT12-P1",cdn-rid;desc="hPhKmdjV2JEUfkglSQC554WSFpNeKDcp1kEjd-a9HWIZD_x7pEC-0Q==",cdn-downstream-fbl;dur=50

Pragma: server-timing を付与したリクエストでは、Server-Timing ヘッダーが返却されました。

07

今回の Response headers policy のサンプリング率は 0 です。それでも Pragma: server-timing を明示的に指定することで、CloudFront の Server-Timing ヘッダーを取得できました。これは、サンプリング率が 100 未満の場合、Pragma: server-timing を含むリクエストに対して Server-Timing ヘッダーを返す CloudFront の仕様によるものです。サンプリング率が 0 の場合にも同様に動作します。

Server-Timing ヘッダーの内容を確認する

Pragma: server-timing を付与してリクエストしたところ、以下の Server-Timing ヘッダーが返却されました。

server-timing: cdn-upstream-layer;desc="EDGE",cdn-upstream-dns;dur=0,cdn-upstream-connect;dur=6,cdn-upstream-fbl;dur=47,cdn-cache-miss,cdn-pop;desc="NRT12-P1",cdn-rid;desc="<redacted>",cdn-downstream-fbl;dur=50

今回の実行結果では、以下のメトリクスを確認できました。

メトリクス 今回の確認結果 意味
cdn-upstream-layer EDGE CloudFront の POP からオリジンへ直接リクエストを送信したことを示します。
cdn-upstream-dns 0 ms オリジンの DNS 名前解決にかかった時間です。0 ms のため、CloudFront はキャッシュ済みの DNS 結果、または既存の接続を利用したと考えられます。
cdn-upstream-connect 6 ms オリジンへの TCP 接続(HTTPS の場合は TLS 接続を含む)にかかった時間です。
cdn-upstream-fbl 47 ms CloudFront がオリジンへリクエストを送信してから、オリジンのレスポンスの最初の 1 バイトを受信するまでにかかった時間です。
cdn-cache-miss あり CloudFront のキャッシュからレスポンスを返せず、オリジンからオブジェクトを取得したことを示します。
cdn-pop NRT12-P1 リクエストを処理した CloudFront の POP です。
cdn-downstream-fbl 50 ms CloudFront がビューアーからリクエストを受信してから、ビューアーへレスポンスの最初の 1 バイトを返すまでにかかった時間です。

また、X-Cache ヘッダーも以下の値でした。

x-cache: Miss from cloudfront

Server-Timing の cdn-cache-miss と X-Cache: Miss from cloudfront の両方から、今回のリクエストでは CloudFront のキャッシュが利用されず、S3 オリジンからコンテンツが取得されたことを確認できました。
なお、cdn-upstream-fbl が 47 ms、cdn-downstream-fbl が 50 ms でした。今回のリクエストでは、CloudFront がオリジンから最初の 1 バイトを取得した後、約 3 ms でビューアーへ最初の 1 バイトを返却したことになります。

まとめ

CloudFront のレスポンスヘッダーポリシーで Server-Timing ヘッダーを有効化し、サンプリングレートを 0 % に設定して動作を確認しました。結果は以下のとおりです。

  • Pragma: server-timing を付与しない通常のリクエストでは、Server-Timing ヘッダーは返却されませんでした。
  • Pragma: server-timing を付与したリクエストでは、サンプリングレートが 0 % でも Server-Timing ヘッダーが返却されました。
  • 今回はキャッシュミスとなり、cdn-cache-misscdn-upstream-connectcdn-upstream-fblcdn-downstream-fbl などのメトリクスを確認できました。

サンプリングレートを 0 % に設定すると、通常のレスポンスに Server-Timing ヘッダーが付与されることは抑制できます。
一方で、Pragma: server-timing はクライアントが任意に指定できるヘッダーです。そのため、本設定は Server-Timing ヘッダーを運用者だけに制限するアクセス制御には利用できません。
外部公開サイトに適用する場合は、キャッシュ状態や CloudFront の POP、オリジン応答時間といった観測情報を外部へ返却してよいか確認したうえで利用してください。

本記事がどなたかの参考になれば幸いです。

参考資料

クラスメソッドオペレーションズ株式会社について

クラスメソッドグループのオペレーション企業です。
運用・保守開発・サポート・情シス・バックオフィスの専門チームが、IT・AIをフル活用した「しくみ」を通じて、お客様の業務代行から課題解決や高付加価値サービスまでを提供するエキスパート集団です。
当社は様々な職種でメンバーを募集しています。
「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、クラスメソッドオペレーションズ株式会社 コーポレートサイト をぜひご覧ください。※2026年1月 アノテーション㈱から社名変更しました

この記事をシェアする

AWSのお困り事はクラスメソッドへ

関連記事