コンテンツにスキップ

カスタムメタデータ

ホスト名(顧客)ごとの設定を、最大125ルールの制限を超えて構成したい場合は、まずアカウントチームに連絡してカスタムメタデータへのアクセスを有効にする必要があります。カスタムメタデータを構成した後、次の方法で使用できます。

  • Cloudflare Workers からメタデータJSONを読み取って(Workersへのアクセスが必要)、ホスト名ごとの動作を定義します。
  • 異なるCloudflareセキュリティ製品のルール式でカスタムメタデータの値を使用して、ルールのスコープを定義します。

  • 顧客ごとのURLの書き換え — 例えば、顧客1-10,000はサーバーAからアセットを取得し、10,001-20,000はサーバーBから取得するなど。
  • カスタムヘッダーの追加 — 例えば、提供したメタデータに基づいて X-Customer-ID: $number を設定する。
  • 顧客ごとにHTTP Strict Transport Security(“HSTS”)ヘッダーを設定する。

追加のロジックや要件については、ソリューションエンジニアに相談してください。

カスタムメタデータの送信

カスタムホスト名APIを介してCloudflareにカスタムメタデータを追加できます。このデータは、特定のホスト名IDに対してメタデータを設定するためにPATCHリクエストを介して追加できます。例えば:

Terminal window
curl --request PATCH \
"https://api.cloudflare.com/client/v4/zones/{zone_id}/custom_hostnames/{hostname_id}" \
--header "X-Auth-Email: <EMAIL>" \
--header "X-Auth-Key: <API_KEY>" \
--header "Content-Type: application/json" \
--data '{
"ssl": {
"method": "http",
"type": "dv"
},
"custom_metadata": {
"customer_id": "12345",
"redirect_to_https": true,
"security_tag": "low"
}
}'

メタデータの変更は、30秒以内にCloudflareのエッジ全体に伝播します。


Cloudflare Workerからのカスタムメタデータへのアクセス

メタデータオブジェクトは、request.cf.hostMetadataプロパティを使用して各リクエストでアクセス可能です。データを読み取り、Workerを使用してその動作をカスタマイズできます。

以下の例では、上記のAPI呼び出しを使用して送信された"custom_metadata":{"customer_id":"12345","redirect_to_https": true,"security_tag":"low"}のuser_idをWorkerで使用し、リクエストヘッダーにcustomer_idを送信します:

addEventListener('fetch', event => {
event.respondWith(fetchAndAddHeader(event.request));
});
/**
* ホスト名に基づいてオリジンにX-Customer-Idヘッダーを追加して取得する
* @param {Request} request
*/ async function fetchAndAddHeader(request) {
let customer_id = request.cf.hostMetadata.customer_id;
let newHeaders = new Headers(request.headers);
newHeaders.append('X-Customer-Id', customer_id);
let init = {
headers: newHeaders,
method: request.method,
};
let response = await fetch(request.url, init);
return response;
}

ルール式でのカスタムメタデータへのアクセス

cf.hostname.metadataフィールドを使用して、ルール式でメタデータオブジェクトにアクセスします。JSONオブジェクトから異なる値を取得するには、lookup_json_string関数を使用します。

次のルール式は、カスタムメタデータのsecurity_tag値がlowを含む場合にルールが一致することを定義します:

lookup_json_string(cf.hostname.metadata, "security_tag") eq "low"

ベストプラクティス

  • 使用するJSONスキーマは固定されていることを確認してください:スキーマの変更がCloudflare Workersの変更なしに行われると、ウェブサイトが壊れる可能性があるか、定義された「デフォルト」動作に戻る可能性があります。
  • フラットなJSON構造を好む。
  • スネークケースの文字列キーを使用する(camelCaseやPascalCaseではなく)。
  • 適切なブール値を使用する(truefalseではなく、true10ではなく)。
  • 文字列ではなく数値で整数を表す("1""2"ではなく、12を使用)。
  • メタデータが存在しない場合のフォールバック動作を定義する。
  • メタデータ内のキーや値が不明な場合のフォールバック動作を定義する。

一般的なガイダンスとして、適切な場合はGoogleのJSONスタイルガイドに従うことをお勧めします。


制限事項

Cloudflareに提供できるメタデータにはいくつかの制限があります:

  • 有効なJSONである必要があります。
  • 任意のオリジン解決 — 例えば、特定のホスト名へのリクエストを特定のバックエンドに向けること — は、CloudflareのDNS内に存在するホスト名として提供する必要があります(非権威型セットアップの場合でも)。IPアドレスを直接提供すると、リクエストがエラーになります。
  • 合計ペイロードは4KBを超えてはいけません。
  • スキーマを処理し、内容に基づいてトリガーロジックを知っているCloudflare Workerが必要です。
  • ワイルドカードを含むカスタムホスト名にはカスタムメタデータを設定できません。

Terraformサポート

Terraformは単一タイプのマップのみを許可するため、カスタムホスト名のカスタムメタデータに対するCloudflareのTerraformサポートは文字列キーと値に制限されています。