カスタム ヘッダーの作成

カスタム リクエスト ヘッダーとカスタム レスポンス ヘッダーを使用すると、外部 HTTP(S) ロードバランサがリクエストとレスポンスに追加するヘッダーをさらに指定できます。この 2 つのヘッダーには、クライアントへのレイテンシ、クライアントの IP アドレスの地理的なロケーション、TLS 接続のパラメータなど、クライアント接続に関してロードバランサで検出される情報を含めることができます。

カスタム リクエスト ヘッダーはバックエンド サービスでサポートされていますが、カスタム レスポンス ヘッダーはバックエンド サービスとバックエンド バケットでサポートされています。

HTTP(S) 負荷分散は、バックエンドとクライアントの間でプロキシするすべての HTTP(S) リクエストとレスポンスに、デフォルトで特定のヘッダーを追加します。詳細については、ターゲット プロキシをご覧ください。

始める前に

  • 必要に応じて、Cloud SDK を最新バージョンに更新します。

    gcloud components update
    

カスタム ヘッダーの動作

カスタム ヘッダーは次のように動作します。

  • 外部 HTTP(S) ロードバランサがバックエンドにリクエストを行うと、ロードバランサはリクエスト ヘッダーを追加します。

  • 外部 HTTP(S) ロードバランサはレスポンス ヘッダーを設定してから、クライアントにレスポンスを返します。

リクエスト ヘッダーとレスポンス ヘッダーは、キャッシングやロードバランサの動作に影響しません。

カスタム ヘッダーを有効にするには、バックエンド サービスまたはバックエンド バケットのプロパティにヘッダーのリストを指定します。

各ヘッダーを header-name:header-value 文字列として指定します。ヘッダーには、ヘッダー名とヘッダー値を区切るコロンを含める必要があります。ヘッダー名のプロパティは次のとおりです。

  • ヘッダー名は、有効な HTTP ヘッダー フィールド名の定義でなければなりません(RFC 7230 を遵守)。
  • ヘッダー名を X-User-IP または CDN-Loop にすることはできません。
  • ヘッダー名を X-GoogleX-Goog-X-GFE、または X-Amz- で始めることはできません。
  • 追加されたヘッダーのリストに、ヘッダー名を複数回使用することはできません。

ヘッダー値のプロパティは次のとおりです。

  • ヘッダー値は、HTTP ヘッダー フィールドで有効な定義でなければなりません(RFC 7230 に準拠、古いフォームは使用不可)。
  • ヘッダー値は空白にできます。
  • ヘッダー値には、中括弧で囲まれた 1 つ以上の変数を含めることができます。この変数は、ロードバランサで提供される値に展開されます。ヘッダー値に使用できる変数のリストについては、次のセクションで説明します。

たとえば、クライアントのリージョンとクライアントの都市に対して、2 つの変数名を含む 1 つのヘッダーを指定できます。gcloud コマンドライン ツールには、リクエスト ヘッダーを指定するフラグ --custom-request-header があります。例:

    --custom-request-header 'X-Client-Geo-Location:{client_region},{client_city}'

カリフォルニア州のマウンテン ビューに存在するクライアントの場合、ロードバランサにより次のようなヘッダーが追加されます。

X-Client-Geo-Location:US,Mountain View

フラグの一般的な形式は次のとおりです。

    --custom-request-header='HEADER_NAME:[HEADER_VALUE]'

ヘッダー値は中かっこで囲む必要があります。例:

    --custom-request-header='X-PLACE:{client_city},{client_city_lat_long}'

このコマンドでは一重引用符(')のみ使用してください。

ヘッダー値に使用可能な変数

カスタム ヘッダー値には、以下の変数を使用できます。

変数 説明
cdn_cache_id リクエストの処理に使用されるキャッシュ インスタンスのロケーション コードと ID。これは、Logging の Cloud CDN リクエストログの jsonPayload.cacheId フィールドに入力されている値と同じです。
cdn_cache_status 現在のキャッシュ ステータス。Cloud CDN 対応のバックエンドから提供されるオブジェクトでは、hitmissrevalidatedstaleuncacheabledisabled のいずれかとなります。
origin_request_header クロスオリジン リソース シェアリング(CORS)のユースケースのリクエストに含まれる Origin ヘッダーの値を反映したものになります。
client_rtt_msec ロードバランサと HTTP(S) クライアント間の推定ラウンドトリップ送信時間(ミリ秒単位)。これは、ロードバランサの TCP スタックによって測定される平滑化されたラウンドトリップ時間(SRTT)パラメータです(RFC 2988 を遵守)。
client_region クライアントの IP アドレスに関連付けられる国(またはリージョン)。これは、USFR などの Unicode CLDR リージョン コードです。(ほとんどの国では、このコードが ISO-3166-2 コードに直接対応しています)。
client_region_subdivision 都道府県や州など、クライアントの IP アドレスに関連付けられる国の下位地域区分。これは Unicode CLDR サブディビジョン ID です(USCACAON など)。(この Unicode コードは、ISO-3166-2 標準で定義されている下位地域区分から派生しています)。
client_city リクエスト送信元の市区町村の名前です。たとえば、カリフォルニアの Mountain View は Mountain View です。この変数について有効な値の正規リストはありません。都市名には、US-ASCII 文字、数字、スペース、および !#$%&'*+-.^_`|~ を含めることができます。
client_city_lat_long リクエスト送信元の都市の緯度と経度です。たとえば、Mountain View からのリクエストの場合には 37.386051,-122.083851 となります。
tls_sni_hostname RFC 6066 で定義されたサーバー名表示(TLS または QUIC handshake 中にクライアントによって提供された場合)。ホスト名は小文字に変換され、末尾のドットはすべて削除されます。
tls_version SSL handshake 中にクライアントとロードバランサの間でネゴシエートされた TLS バージョン。可能な値は TLSv1TLSv1.1TLSv1.2TLSv1.3 です。クライアントが TLS ではなく QUIC を使用して接続した場合、値は QUIC です。
tls_cipher_suite TLS handshake 中にネゴシエートされた暗号スイート。値は、IANA TLS Cipher Suite Registry で定義された 4 桁の 16 進数です。たとえば、TLS_RSA_WITH_AES_128_GCM_SHA256 の場合は 009C となります。この値は、QUIC と暗号化されていないクライアント接続の場合には空です。

ロードバランサで値を決定できない場合、変数は空の文字列に展開されます。例:

  • IP アドレスのロケーションが不明な場合の地理的なロケーションの変数
  • TLS が使用されていない場合の TLS パラメータ
  • リクエストに Origin ヘッダーが含まれていない場合の {origin_request_header}
  • リクエスト ヘッダーに含まれている場合の {cdn_cache_status} ヘッダー

地理的な値(リージョン、下位地域区分、都市)は、クライアントの IP アドレスに基づく推定値です。Google では、正確性を高め、地理的、政治的な変化を反映させるため、これらの値を提供するデータを更新しています。

ロードバランサによって追加されたヘッダーにより、同じ名前の既存のヘッダーはすべて上書きされます。ヘッダー名では、大文字と小文字は区別されません。ヘッダー名が HTTP/2 バックエンドに渡されると、HTTP/2 プロトコルによりヘッダー名は小文字としてエンコードされます。

ヘッダー値では、先頭の空白と末尾の空白は重要ではなく、バックエンドには渡されません。ヘッダー値で中括弧を許可するために、ロードバランサでは 2 つの左中括弧({{)を単一の左中括弧({)に変換し、2 つの右中括弧(}})を単一の右中括弧(})に変換します。

カスタム リクエスト ヘッダーの操作

Console

既存のバックエンド サービスにカスタム リクエスト ヘッダーを追加するには:

  1. 負荷分散の概要ページに移動します。
    [負荷分散] ページに移動
  2. [バックエンド] をクリックします。
  3. バックエンド サービスの名前をクリックします。
  4. [編集]()をクリックします。
  5. [高度な構成(セッション アフィニティ、コネクション ドレインのタイムアウト、セキュリティ ポリシー)] をクリックします。
  6. [カスタム リクエスト ヘッダー] で、[ヘッダーを追加] をクリックします。
  7. カスタム リクエスト ヘッダーのヘッダー名ヘッダー値を入力します。
  8. その他のカスタム リクエスト ヘッダーを入力します。
  9. [保存] をクリックします。

カスタム リクエスト ヘッダーをバックエンド サービスから削除するには:

  1. 負荷分散の概要ページに移動します。
    [負荷分散] ページに移動
  2. [バックエンド] をクリックします。
  3. バックエンド サービスの名前をクリックします。
  4. [編集]()をクリックします。
  5. [高度な構成(セッション アフィニティ、コネクション ドレインのタイムアウト、セキュリティ ポリシー)] をクリックします。
  6. 削除するカスタム リクエスト ヘッダーの名前の横にある X をクリックします。
  7. [保存] をクリックします。

gcloud

カスタム リクエスト ヘッダーを使用してバックエンド サービスを作成するには:

gcloud beta compute backend-services create BACKEND_SERVICE_NAME \
  --global-health-checks \
  --global \
  --protocol HTTPS \
  --health-checks https-basic-check \
  --custom-request-header 'HEADER_NAME:[HEADER_VALUE]'

リクエスト ヘッダーをさらに追加するには、--custom-request-header フラグを繰り返して、固有のヘッダー名と値を指定します。

既存のバックエンド サービスにカスタム ヘッダーを追加するには:

gcloud beta compute backend-services update BACKEND_SERVICE_NAME \
  --global \
  --custom-request-header 'HEADER_NAME:[HEADER_VALUE]' \
  --custom-request-header 'HEADER_NAME:[HEADER_VALUE]'

上記では、コマンドで指定したリクエスト ヘッダーでバックエンド サービス内のヘッダーを置き換えています。

バックエンド サービスからすべてのヘッダーを削除するには:

gcloud beta compute backend-services update BACKEND_SERVICE_NAME \
  --global \
  --no-custom-request-headers

API

backendServices.patch メソッドに PATCH リクエストを送信します。

PATCH https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE_NAME
"customRequestHeaders": [
   "client_city:Mountain View"
]

カスタム レスポンス ヘッダーの操作

Console

既存のバックエンド サービスにカスタム レスポンス ヘッダーを追加するには:

  1. 負荷分散の概要ページに移動します。
    [負荷分散] ページに移動
  2. [バックエンド] をクリックします。
  3. バックエンド サービスの名前をクリックします。
  4. [編集]()をクリックします。
  5. [高度な構成(セッション アフィニティ、コネクション ドレインのタイムアウト、セキュリティ ポリシー)] をクリックします。
  6. [カスタム レスポンス ヘッダー] で、[ヘッダーを追加] をクリックします。
  7. カスタム レスポンス ヘッダーのヘッダー名ヘッダー値を入力します。
  8. 追加のカスタム レスポンス ヘッダーを入力します。
  9. [保存] をクリックします。

カスタム レスポンス ヘッダーをバックエンド サービスから削除するには:

  1. 負荷分散の概要ページに移動します。
    [負荷分散] ページに移動
  2. [バックエンド] をクリックします。
  3. バックエンド サービスの名前をクリックします。
  4. [編集]()をクリックします。
  5. [高度な構成(セッション アフィニティ、コネクション ドレインのタイムアウト、セキュリティ ポリシー)] をクリックします。
  6. 削除するカスタム レスポンス ヘッダーの名前の横にある X をクリックします。
  7. [保存] をクリックします。

gcloud

バックエンド サービスには、--custom-response-header フラグを指定して gcloud compute backend-services create コマンドまたは gcloud compute backend-services update コマンドを使用します。

バックエンド バケットには、--custom-response-header フラグを指定して gcloud compute backend-buckets create コマンドまたは gcloud compute backend-buckets update コマンドを使用します。

gcloud compute backend-services (create | update) BACKEND_SERVICE_NAME
    --custom-response-header='HEADER_NAME:[HEADER_VALUE]'
gcloud compute backend-buckets (create | update) BACKEND_BUCKET_NAME
    --custom-response-header='HEADER_NAME:[HEADER_VALUE]'

例:

gcloud compute backend-buckets update gaming-lab \
    --custom-response-header='X-Frame-Options: DENY'

API

バックエンド バケットには、Method: backendBuckets.insert API 呼び出しまたは Method: backendBuckets.update API 呼び出しを使用します。

バックエンド サービスには、Method: backendServices.insert API 呼び出しまたは Method: backendServices.update API 呼び出しを使用します。

次のいずれかの API 呼び出しを使用します。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendBuckets

PUT https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendBuckets/BACKEND_BUCKET_NAME

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices

PUT https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE_NAME

JSON リクエストの本文に次のスニペットを追加します。

"cdnPolicy": {
  "customResponseHeaders":HEADER_NAME:[HEADER_VALUE]
}

Cloud Storage のレスポンス ヘッダーの設定

Cloud Storage からのレスポンスに、他の HTTP ヘッダー(クロスオリジン リソース ポリシー、X-Frame-Options ヘッダー、X-XSS-Protection ヘッダーなど)を設定する必要がある場合、Google Cloud には Cloud Storage を使用して Cloud CDN のカスタム ヘッダーを設定するオプションが用意されています。この設定を行うには、このページで説明するように、ロードバランサのバックエンド バケットレベルでカスタム ヘッダーを構成します。

制限事項

カスタム ヘッダーには次の制限が適用されます。

  • 各バックエンド サービスに対して最大 16 個のカスタム リクエスト ヘッダーを指定できます。
  • 各バックエンド サービスに対して最大 16 個のカスタム レスポンス ヘッダーを指定できます。
  • バックエンド サービスごとのすべてのカスタム リクエスト ヘッダーの合計サイズ(変数を展開する前の名前と値の組み合わせ)は、8 KB を超えることはできません。
  • バックエンド サービスごとのすべてのカスタム レスポンス ヘッダーの合計サイズ(変数を展開する前の名前と値の組み合わせ)は、8 KB を超えることはできません。

次のステップ