サービスルートを構成する

メディア CDN は、トラフィックを特定のエッジ構成と送信元にきめ細かいレベルでマッピングできる高度な HTTP ルーティング機能を提供します。

一致したリクエスト数

Media CDN 構成には、EdgeCacheService リソースのルーティングセクションで定義されるルートのセットが含まれます。これらのルートは、(少なくとも)ホストに基づいてリクエストと一致します。トラフィックが送信元に転送される仕組みについて詳しくは、HostRulePathMatcher をご覧ください。各ルートでは、独自の CDN 構成、書き換え、リダイレクト、CORS ポリシー、カスタム HTTP ヘッダー、送信元マッピングを定義できます。 ルートは送信元を共有できます。

たとえば、マニフェストに対するリクエストを特定の送信元にルーティングし、有効期間が短いキャッシュ TTLネガティブ キャッシュ ポリシーを定義できます。ヘッダーとクエリ パラメータを使用して特定のマニフェスト タイプやユーザーを分割して、セグメントに対するリクエストを別の送信元に分割できます。

次の例は、ホスト media.example.com の特定のヘッダー、クエリ パラメータ、パス接頭辞に一致するリクエストをルーティングする方法を示しています。

name: prod-service
routing:
  hostRules:
  - hosts:
    - media.example.com
    pathMatcher: example_routes
  pathMatchers:
  - name: example_routes
    routeRules:
    - priority: 10
      origin: staging-live-origin
      matchRules:
      - prefixMatch: /vod/
        headerMatches:
        - headerName: "x-staging-client"
          presentMatch: true
        queryParameterMatches:
        - name: "live"
          exactMatch: "yes"
      routeAction:
        cdnPolicy:
          defaultTtl: 5s

パスマッチング

Media CDN は、完全(正確な)マッチング、プレフィックス マッチング、ワイルドカード パス マッチングをサポートしています。 パスのマッチングをホスト、ヘッダー、クエリ パラメータ ベースのマッチングと組み合わせることで、きめ細かいリクエスト ルーティング ルールを構築できます。

URL パスでマッチングする方法は、次の 3 つです。

フィールド 説明
matchRules[].fullPathMatch fullPathMatch 条件は、クエリ文字列を含まない完全な URL パスと一致します。必要に応じて、末尾のスラッシュを指定する必要があります。

一致ルールが fullPathMatch: "/stream/" であるルートは、/stream/ と一致しますが、/stream/stream/us/hls/1234.ts とは一致しません。

fullPathMatch は明示的な(完全)一致です。

matchRules[].prefixMatch prefixMatch 条件は URL パスの接頭辞、すなわち同じ文字列で始まる URL と一致します。

prefixMatch: "/videos/" のルールを持つルートは、/videos/hls/58481314/manifest.m3u8/videos/dash/videos/ 接頭辞が含まれているため、両方に一致します。

matchRules[].pathTemplateMatch pathTemplateMatch 条件ではワイルドカード演算子がサポートされます。これにより、複雑な URL パターンやパスセグメントを照合したり、URL を書き換えるための名前付き変数をキャプチャしたりできます。

pathTemplateMatch: "/**.m3u8" の一致ルールを持つルートは、.m3u8 で終わるすべての URL パスに一致します。

/content/en-GB/13/51491/manifest_193193.m3u8/p/abc/1234/manifest_1080p5000.m3u8 はどちらもこのパターンに一致します。

その他の例については、パターン マッチングのセクションをご覧ください。

詳細については、MatchRule の API 仕様をご覧ください。

たとえば、/stream/ で始まるすべてのリクエストを照合するには、次のようなルートルールを作成します。

name: prod-service
routing:
  hostRules:
  - hosts:
    - media.example.com
    - *.vod.example.com
    pathMatcher: example_routes
  pathMatchers:
  - name: example_routes
    routeRules:
    - priority: 1
      matchRules:
      - prefixMatch: /stream/

この例では、一致ルールの末尾にスラッシュが明示的に含まれています。

  • media.example.com/stream/id/1234/hls/manifest.m3u8 へのリクエストは、このルートと一致します。
  • media.example.com/stream-eu/id/4567/hls/manifest.m3u8 へのリクエストはこのルートと一致しません。

2 番目のケースでは、別のルートやキャッチオール ルートが構成されていない限り、Media CDN は HTTP 404 エラーを返します。

類似した接頭辞を持つルートの優先順位が機能する仕組みについては、ルートの優先度と順序指定をご覧ください。

パターン(ワイルドカード)のマッチング

パターン マッチングでは、ワイルドカード構文を使用して、部分的な URL や接尾辞(ファイル拡張子)など、URL の複数の部分を照合できます。

また、1 つ以上のパス コンポーネントを pathTemplateMatch フィールドで名前付き変数に関連付けて、pathTemplateRewrite フィールドで URL を書き換える際にそれらの変数を参照できます。これにより、リクエストが送信元に送信される前に、URL コンポーネントの順序を変更して削除できます。

次の例は、2 つの異なる URL 接尾辞に対する照合方法を示しています。

# EdgeCacheService.routing.pathMatchers[]
    routeRules:
    - priority: 1
      description: "Match video segments"
      matchRules:
      - pathTemplateMatch: "/**.ts"
      - pathTemplateMatch: "/**.m4s"
      origin: prod-video-storage

サポートされている構文は次のとおりです。

演算子 一致する
* 次のパス区切り文字 / までの 1 つのパス コンポーネントと一致します。 /videos/*/*/*.m4s matches /videos/123414/hls/1080p5000_00001.m4s.
** 0 個以上のパスセグメントを照合します。存在する場合は、最後の演算子にする必要があります。 /**.mpd matches /content/123/india/dash/55/manifest.mpd.
{name} or {name=*}

1 つのパスセグメントに一致する名前付き変数。

次のパス区切り文字 / までの 1 つのパス コンポーネントと一致します。

/content/{format}/{lang}/{id}/{file}.vtt/content/hls/en-us/12345/en_193913.vtt と一致し、format="hls"lang="en-us"id="12345"file="en_193913" を変数としてキャプチャします。
{name=videos/*} 複数のパスセグメントに一致する名前付き変数。videos/* に一致するパス コンポーネントは、名前付き変数としてキャプチャされます。 /videos/{language=lang/*}/*/videos/lang/en/video.m4s と一致し、パス変数 language に値 lang/en を入力します。
{name=**}

0 個以上のパスセグメントに一致する名前付き変数。

存在する場合は、最後の演算子にする必要があります。

/**.m3u8 または /{path=**}.m3u8 は、拡張子までのすべてのパスセグメントを照合します。

/videos/{file=**} は、拡張子を含む /videos/en-GB/def566/manifest.m3u8 と一致し、パス変数 file="en-GB/def566/manifest.m3u8 をキャプチャします。

注:

  • URL を書き換えない場合は、よりシンプルな * 演算子と ** 演算子を使用します。
  • 変数を使用してパス コンポーネントを取得する場合、変数によってキャプチャされない URL の部分は、後続の pathTemplateRewrite で参照できません。例については、パス変数のキャプチャのセクションをご覧ください。
  • 同じルートの pathTemplateMatch に存在しない、後続の pathTemplateRewrite の変数は参照できません。
  • 変数では大文字と小文字が区別され、{FORMAT}{forMAT}{format} は異なる変数と値を表します。
  • 1 つの一致で最大 10 個の演算子(ワイルドカードまたは変数)を指定できます。pathTemplateMatch フィールドと pathTemplateRewrite フィールドは 255 文字以下にする必要があります。

例: ファイル拡張子の一致

次の例は、ワイルドカード演算子の一般的なユースケース(接尾辞までのすべてのパス コンポーネントを照合)を示しています。

この場合は、次の操作を行います。

  • マニフェストの送信元から .m3u8.mpd で終わる動画マニフェスト(再生リスト)を取得します。これらのレスポンスは定期的に変更されるため、短い(5 秒)TTL を適用します。
  • セグメントの送信元から .ts.m4s で終わる動画セグメントを取得し、これらのレスポンスに、より長い(1 日)TTL を適用します。

このアプローチは、SSAI(サーバーサイド広告インジェクション)や DAI(ダイナミック広告挿入)サービスを使用する場合や、マニフェストが数秒ごとに更新されるライブ動画などでよく利用されます。

次の構成は、これをサポートするように Media CDN ルーティングを構成する方法を示しています。

name: prod-service
routing:
  hostRules:
  - hosts:
    - media.example.com
    pathMatcher: example_routes
  pathMatchers:
  - name: example_routes
    routeRules:
    # the first route only matches video manifests
    - priority: 1
      matchRules:
      - pathTemplateMatch: "/**.m3u8" # "**" matches all path segments
      - pathTemplateMatch: "/**.mpd"
      origin: manifest-origin
      routeAction:
        cdnPolicy:
          cacheMode: FORCE_CACHE_ALL
          defaultTtl: 5s
    # the second route matches video segments, fetches them
    # from a separate origin server, caching them for a longer
    # duration (1 day).
    - priority: 2
      matchRules:
      - pathTemplateMatch: "/**.ts"
      - pathTemplateMatch: "/**.m4s"
      origin: segment-origin
      routeAction:
        cdnPolicy:
          cacheMode: FORCE_CACHE_ALL
          defaultTtl: 86400s

例: パス変数をキャプチャする

次の例は、名前付き変数を使用して 1 つ以上のパス コンポーネントを記述する方法を示しています。

これらの変数を pathTemplateRewrite で使用して、リクエストが送信元に送信される前のパスを書き換えたり、複雑な pathTemplateMatch 自己記述型を作成したりできます。

routing:
  hostRules:
  - hosts:
    - media.example.com
    pathMatcher: example_routes
  pathMatchers:
  - name: example_routes
    routeRules:
    - priority: 1
      matchRules:
      # Matches a request of "/us/en/hls/123139139/segments/00001.ts"
      - pathTemplateMatch: "/{country}/{lang}/{format}/{id}/{file=**}"
      origin: my-origin
      routeAction:
        urlRewrite:
          # Rewrites to "/123139139/hls/segments/00001.ts"
          pathTemplateRewrite: "/{id}/{format}/{file}"

特に、以下の点に注意してください。

  • {name} 変数は、1 つのパスセグメントをキャプチャします。パスセグメントは、URL パス内の / のペア(「スラッシュ」)の間のすべての文字です。
  • {name=**} の変数は、残りのパスセグメントをすべてキャプチャします。この場合、segments/00001.tsmaster.m3u8 の両方に一致します。
  • 同じルートpathTemplateRewrite で、pathTemplateMatch でキャプチャした変数の一部を参照します。{country} 変数と {lang} 変数は送信元のディレクトリ構造と一致しないため、明示的に省略します。

この例では、次のようになります。

  • 受信リクエスト URL /us/en/hls/123139139/segment_00001.tspathTemplateMatch と一致し、送信元に送信される前に /123139139/hls/segment_00001.ts に書き換えられます。
  • 受信リクエスト URL /us/123139139/master.m3u8pathTemplateMatch と一致せず、HTTP 404 (Not Found) レスポンスを受信します。
  • 受信リクエスト URL /br/es/dash/c966cbbe6ae3/subtitle_00001.vttpathTemplateMatch と一致し、送信元に送信される前に /c966cbbe6ae3/dash/subtitle_00001.vtt に書き換えられます。

ワイルドカード マッチングと URL の書き換えの相互運用の詳細については、書き換えのセクションをご覧ください。

ホスト マッチング

各サービスは複数のホスト名で照合できます。各ホスト名には、独自のルートグループ(パスマッチャー)が含まれています。最も一般的なケースでは、サービスのすべてのホスト名が、単一のホストリストと 1 つのパスマッチャーを使用した単一の共有ルートセットにマッピングされます。

name: prod-service
routing:
  hostRules:
  - hosts:
    - media.example.com
    - *.vod.example.com
    pathMatcher: example_routes
  pathMatchers:
  - name: example_routes
    routeRules:
    # list of routes for the configured hosts
    - priority: 999
      matchRules:
      - prefixMatch: /
      origin: DEFAULT_ORIGIN

一致しないホストには、デフォルトの HTTP 404 ページが表示されます。任意のホストを受け入れるには、ワイルドカード文字 *hostRules[].hosts[] エントリとして含めることができます。

ルートのグループを定義することもできます(例: 国別またはライブとオンデマンドの比較)。各サービスには 1 つのセキュリティ ポリシーがあるため、通常は、マーケット(地域)またはワークロードごとに 1 つのサービスを用意することをおすすめします。

注:

  • ポートを含むホスト(または HTTP/2 :authority)ヘッダーは、構成されたホストと暗黙的に照合されます。ポートを明示的に指定する必要はありません。
  • リクエストが HTTP 経由の場合、*.vod.example.comhostRules[].hosts[] エントリは us.vod.example.comus.vod.example.com:80 と一致します。
  • リクエストが HTTPS(TLS)経由の場合、*.vod.example.comhostRules[].hosts[] エントリは us.vod.example.com:443 と一致します。

詳細については、HostRule の API 仕様をご覧ください。

ヘッダーとクエリ パラメータの一致

特定のヘッダー名とクエリ パラメータ名、またはヘッダー値の有無(接頭辞、接尾辞、完全一致)と一致するようにルートを構成できます。

クエリ パラメータとヘッダーのマッチングは論理「AND」です。つまり、リクエストは、指定されたルートに一致するすべてのクエリ パラメータとヘッダーキー(および指定されている場合は値)に一致する必要があります。

たとえば、特定のヘッダー フィールド名とヘッダー値を含むリクエストを alternate-origin という名前の送信元にルーティングする場合は、routeRules[].matchRules[].headerMatches[] 内で一致条件を構成します。

name: prod-service
routing:
  hostRules:
  - hosts:
    - media.example.com
    pathMatcher: example_routes
  pathMatchers:
  - name: example_routes
    routeRules:
    - priority: 1
      origin: alternate-origin
      matchRules:
      - prefixMatch: "/videos/"
        headerMatches:
        - headerName: "x-device-name"
          exactMatch: "roku"

この例では、URL の先頭が /videos/ で、x-device-name: roku ヘッダーを持つリクエストがこのルートと一致します。このヘッダー名がないリクエスト、または値が異なるリクエストは、このルートと一致しません。

詳細については、HeaderMatch の API 仕様をご覧ください。

同様に、クエリ パラメータと照合するには、次のように 1 つ以上の queryParameterMatches を指定します。

name: prod-service
routing:
  hostRules:
  - hosts:
    - media.example.com
    pathMatcher: example_routes
  pathMatchers:
  - name: example_routes
    routeRules:
    - priority: 1
      origin: eu-live-origin-prod
      matchRules:
      - prefixMatch: "/videos/"
        queryParameterMatches:
        - name: "playback_type"
          exactMatch: "live"
        - name: "geo"
          exactMatch: "eu"

この例では、クライアント リクエストの https://cdn.example.com/videos/1234/abcd/xyz.m3u8?playback_type=live&geo=eu がこのルートと一致します。

詳細については、QueryParameterMatcher の API 仕様をご覧ください。

キャッチオール(デフォルト)ルートを定義する

デフォルトでは、リクエストが構成済みのルートと一致しない場合、Media CDN は HTTP 404 (Not Found) エラーを返します。

特定の pathMatcher(ルートのコレクション)に対してキャッチオールルートを構成するには、次の手順を行います。

  • 最も低い優先度(最も高い数字)の routeRule を作成します(たとえば、可能な限り最も低いルート優先度である 999)。
  • 接頭辞が / と一致する matchRule を構成します(すべてのリクエストパスに一致します)。
  • ルートに origin または urlRedirect のいずれかを構成します。

たとえば、一致しないすべてのリクエストを my-origin という名前のデフォルトの送信元に転送するキャッチオール ルートを構成するには、次のように priority: 999/matchRules[].prefixMatch を含む新しいルートを作成します。

name: prod-service
routing:
  hostRules:
  - hosts:
    - cdn.example.com
    pathMatcher: example_routes
  pathMatchers:
  - name: example_routes
    routeRules:
    - priority: 999
      origin: my-origin
      matchRules:
      - prefixMatch: /

必要に応じて、送信元の取得前に URL を書き換えたり、リクエストをそのまま送信元に送信する代わりに、デフォルトのページ(ランディング ページなど)にリダイレクトしたりできます。

ルートの優先度と順序指定

routeRules[] の配列内の各ルートには、priority が関連付けられている必要があります。

より具体的なルートには、高い優先度(小さい数値)を設定する必要があります。優先度 1 を持つ /stream/ の接頭辞と一致するルートにより、より具体的な優先度 5 を持つ /stream/live/eu/ のルートは、どのリクエストとも一致しません。

  • 優先度が最も高いルートは「1」、最も優先度の低いルートは「999」です。
  • 同じ優先度のルートルールを複数構成することはできません。各ルールの優先度は、0~2147483647 の番号に設定する必要があります。
  • キャッチオールルートを定義すると、一致しないすべてのリクエストをデフォルトの送信元に送信するか、ランディング ページやエンドポイントにリダイレクトできます。

次の例では、/live/ ルートの優先度が高いため、/live/us/ ルートが決して一致しないことがわかります。

routeRules:
- priority: 1
  description: "Live routes"
  matchRules:
  - prefixMatch: /live/
  routeAction:
    cdnPolicy:
      defaultTtl: 5s
- priority: 2
  description: "U.S based live streams"
  matchRules:
  # This would never be matched, as the /live/ prefixMatch at priority 1
  # would always take precedence.
  - prefixMatch: /live/us/
  routeAction:
    cdnPolicy:
      defaultTtl: 5s
- priority: 999
  description: "Catch-all route"
  matchRules:
  - prefixMatch: /

この問題に対処するには、より高い優先度でより具体的な(長い)ルートを設定します。

routeRules:
- priority: 1
  description: "U.S based live streams"
  matchRules:
  # The more specific (longer) match is at a higher priority, and now
  # matches requests as expected.
  - prefixMatch: /live/us/
  routeAction:
    cdnPolicy:
      defaultTtl: 5s
- priority: 2
  description: "Live routes"
  matchRules:
  - prefixMatch: /live/
  routeAction:
    cdnPolicy:
      defaultTtl: 5s
- priority: 999
  description: "Catch-all route"
  matchRules:
  - prefixMatch: /

これにより、より具体的なルートでリクエストを正しく照合できます。/live/eu/ の接頭辞が付いたリクエストは、引き続き優先度 2 で /live/ ルートに適用されます。

メソッドのフィルタリング

デフォルトでは、Media CDN は GETHEADOPTIONS の各メソッドのみを送信元にプロキシし、送信元を変更できるメソッドは除外します。

プレビューでは、送信元にプロキシするメソッドを指定することで、特定のルートルールに対するこのデフォルトの動作をオーバーライドできます。GETHEADOPTIONS に加えて、Media CDN は PUTPOSTDELETEPATCH をサポートしています。

ルートルールの一連のメソッドのサポートを構成するには、各メソッドに allowed_methods 値を持つ routeMethods セクションを指定します。

routeRules:
- priority: 5
  description: "Video uploads"
  routeMethods:
    allowedMethods: ["PUT", "POST", "OPTIONS"]
  matchRules:
  - pathTemplateMatch: "/uploads/**.ts"
  origin: prod-video-storage
- priority: 10
  description: "Video serving"
  routeMethods:
    allowedMethods: ["GET", "HEAD"]
  matchRules:
  - pathTemplateMatch: "/videos/**.ts"
  origin: prod-video-storage

プレビューでは、Media CDN は v1alpha1 Network Services API を使用してこの構成を更新および表示できます。または、gcloud alpha edge-cache services export コマンドおよび gcloud alpha edge-cache services import コマンドを使用して、サービス構成の YAML ファイルを更新するします。

パスの正規化

パスの正規化は、Media CDN が特定のシナリオで URL の複数の表現を単一の正規表現に結合する方法を表します。

パスの正規化では、同じコンテンツを表すリクエスト URL の数を減らし、正規化されたパスを想定する送信元のエラーが軽減されるため、キャッシュ ヒット率を直接改善できます。

受信リクエストは次のように正規化されます。

  • 複数の連続スラッシュは単一のスラッシュに統合されます。たとえば、/videos///12345/manifest.mpd という URL パスは /videos/12345/manifest.mpd に正規化されます。
  • パスセグメントは、RFC 3986 セクション 6.2.2.3 に従って正規化されます。 たとえば、パス /a/b/c/./../../g は、RFC 3986 で定義された「ドット セグメントの削除」アルゴリズムに基づいて /a/g に正規化されます。この正規化は、キャッシュを確認する前、またはリクエストを送信元に転送する前に行われます。
  • リクエストはパーセントで正規化されません。たとえば、パーセントでエンコードされたスラッシュ文字(%2F)を含む URL は未エンコード形式にデコードされません。

URL の大文字と小文字は区別されません。多くの URL には、署名付きリクエストトークンを含む URL など、大文字と小文字が区別される base64 エンコードが含まれています。

書き換えとリダイレクト

以降のセクションでは、リクエストの書き換え方法とリダイレクトの構成方法の例を示します。

リクエスト URL の書き換え

Media CDN は、ホストとパスの書き換えをサポートしています。書き換えによって、送信元に送信された URL が変更され、必要に応じてホストとパスを変更できるようになります。ホストとパスの書き換えはルートレベルで行うため、パス、クエリ パラメータ、リクエスト ヘッダーなど、任意のマッチャーに基づいて書き換える特定のリクエストを定義できます。

詳細については、RouteAction.UrlRewrite の API 仕様をご覧ください。

リクエストを書き換えるには、次の 3 つの方法があります。

フィールド 説明
urlRewrite.pathPrefixRewrite

パスを書き換え、リクエストに一致する prefixMatch で指定された接頭辞を削除します。

1 つのルートルールで指定できるのは、pathPrefixRewrite または pathTemplateRewrite のいずれか 1 つのみです。

urlRewrite.pathTemplateRewrite

pathTemplateRewrite は、同じルートの対応する pathTemplateMatch 一致ルールでのみ使用できます。

1 つのルートルールで指定できるのは、pathPrefixRewrite または pathTemplateRewrite のいずれか 1 つのみです。

urlRewrite.hostRewrite リクエストを送信元サーバーに送信する前にホストを書き換えます。

注:

  • 書き換えられた URL ではキャッシュキーは変更されません。キャッシュキーは、クライアントが送信したリクエスト URL に基づきます。
  • 書き換えは、ルートとの照合と署名付きリクエストの検証の後に行われます。ルートが別の一致ルールと再照合されることはありません。

例: パス接頭辞を削除する

たとえば、クライアント リクエスト URL を /vod/videos/hls/1234/abc.ts から /videos/hls/1234/abc.ts に書き換える(パスから /vod を削除する)には、pathPrefixRewrite 機能を使用します。

name: prod-service
routing:
  hostRules:
  - hosts:
    - cdn.example.com
    pathMatcher: example_routes
  pathMatchers:
  - name: example_routes
    routeRules:
    - priority: 1
      origin: my-origin
      matchRules:
      - prefixMatch: "/vod/videos/"
      routeAction:
        urlRewrite:
          pathPrefixRewrite: "/videos/"

pathPrefixRewrite は、matchRules[].prefixMatch に一致するパス コンポーネント全体を pathPrefixRewrite の値に置き換えることによって機能します。

ホスト名を書き換える(たとえば、cdn.example.commy-bucket.s3.us-west-2.amazonaws.com に書き換える)には、次のように構成します。

name: prod-service
routing:
  hostRules:
  - hosts:
    - cdn.example.com
    pathMatcher: example_routes
  pathMatchers:
  - name: example_routes
    routeRules:
    - priority: 1
      origin: my-origin
      matchRules:
      - prefixMatch: "/videos/"
      routeAction:
        urlRewrite:
          hostRewrite: "my-bucket.s3.us-west-2.amazonaws.com"

この場合、送信元のリクエスト URL は cdn.example.com/videos/* から my-bucket.s3.us-west-2.amazonaws.com/videos/* に変更されます。 また、1 つのルート内でホストの書き換えとパスの書き換えの両方を組み合わせることもできます。

例: 変数を使用して URL を書き換える

pathTemplateMatchpathTemplateRewrite を使用して受信リクエスト URL の一部を書き換えるには、変数のキャプチャ セクションをご覧ください。

リクエストをリダイレクトする

Media CDN は、次の 3 種類のリダイレクトをサポートしています。

  • ホスト リダイレクト。ホスト(ドメイン)のみにリダイレクトします。パスとクエリ パラメータは変更しません。
  • パスのリダイレクト。パスが完全に置き換えられます。
  • パス接頭辞のリダイレクト。一致する接頭辞のみが置き換えられます。

リダイレクトはデフォルトで HTTP 301 (Moved Permanently) になりますが、ルートごとに異なるリダイレクト ステータス コードを返すように構成できます。

次の構成は接頭辞ベースのリダイレクトの例です。https://cdn.example.com/on-demand/* にアクセスしたユーザーを https://cdn.example.com/streaming/* にリダイレクトします。

name: prod-service
routing:
  hostRules:
  - hosts:
    - cdn.example.com
    pathMatcher: example_routes
  pathMatchers:
  - name: example_routes
    routeRules:
    - priority: 10
      matchRules:
      - prefixMatch: "/on-demand/"
      urlRedirect:
        # The prefix matched in matchRules.prefixMatch is replaced
        # by this value
        prefixRedirect: "/streaming/"
        redirectResponseCode: TEMPORARY_REDIRECT # corresponds to a HTTP 307

この例では、リダイレクトを一時的なリダイレクトに変更し、クライアント(ブラウザなど)がキャッシュに保存できないようにします。これは、近い将来に変更されることが予想される場合に便利です。

サポートされている redirectResponseCode の値を次の表に示します。

リダイレクトのレスポンス コード HTTP ステータス コード
MOVED_PERMANENTLY_DEFAULT HTTP 301(恒久的に移動)
FOUND HTTP 302 (Found)
SEE_OTHER HTTP 303(他を参照)
TEMPORARY_REDIRECT HTTP 307(一時的リダイレクト)
PERMANENT_REDIRECT HTTP 308(永続的なリダイレクト)

注:

  • ルートは、トラフィックを送信元に転送するか、クライアントにリダイレクトを返すことができます。origin フィールドと urlRedirect フィールドの両方を同時に設定することはできません。
  • HTTPS にリダイレクトするルートには、少なくとも 1 つの SSL 証明書がサービスにアタッチされている必要があります。

詳細については、RouteRule.UrlRedirect の API 仕様をご覧ください。

すべてのリクエストを HTTPS にリダイレクトする

すべてのリクエストを(HTTP ではなく)HTTPS にリダイレクトするには、すべてのクライアント リクエストを HTTPS に自動的にリダイレクトするように各サービスを構成します。HTTP 経由で接続しているクライアントは、「http://」の代わりに「https://」を使用して同じ URL に設定した Location ヘッダーで HTTP 301 (Permanent Redirect) レスポンスを送信します。

gcloud

gcloud edge-cache services update MY_SERVICE \
    --require-tls
Request issued for: [MY_SERVICE]
Updated service [MY_SERVICE].

このコマンドは、サービスの説明を返します。requireTlstrue に設定されます。

  name: MY_SERVICE
  requireTls: true

Strict-Transport-Security ヘッダーをレスポンス ヘッダーとして設定し、クライアントが常に HTTPS 経由で直接接続するように指示することもできます。

サードパーティのストレージ バックエンドを使用する

Media CDN は、Google Cloud の外部にあり、AWS S3 ストレージ バケット、Azure Blob Storage、その他のストレージ プロバイダなど、一般公開された HTTP エンドポイントへの接続をサポートしています。これは、マルチクラウド アーキテクチャを使用している場合や、まだ Storage Transfer Service を使用して Cloud Storage にデータを移行していない場合に有用です。

AWS S3 で仮想ホストバケットを構成する最小限の送信元構成:

name: MY_S3_ORIGIN
originAddress: BUCKET-NAME.s3.REGION.amazonaws.com

EdgeCacheService リソースに構成されたホスト名と一致するバケット名を使用していない場合は、この送信元(または送信元)に関連付けられたルートにホストの書き換えも構成する必要があります。それ以外の場合、送信元から取得するときに、クライアント リクエストによって設定された Host ヘッダーが使用されます。

たとえば、パス接頭辞が /legacy/ のすべてのリクエストを外部バケットにマッピングするには、送信元リクエストからこの接頭辞を削除するように hostRewritepathPrefixRewrite の両方を構成します。

routeRules:
  - description: legacy backend
    matchRules:
    - prefixMatch: "/legacy/"
    routeAction:
      urlRewrite:
        hostRewrite: BUCKET-NAME.s3.REGION.amazonaws.com
        pathPrefixRewrite: /
      cdnPolicy:
        cacheMode: CACHE_ALL_STATIC
        defaultTtl: 3600s

送信元のリクエストでホストヘッダーを設定する方法の詳細については、送信元のリクエスト ヘッダーのドキュメントをご覧ください。

クロスオリジン リソース シェアリング(CORS)

クロスオリジン リソース シェアリング(CORS)は、クロスオリジン リクエストを安全に行うためのブラウザを中心としたアプローチです。CORS ポリシーを使用すると、ルートごとのポリシーに基づいて、Access-Control-Allow-Origins などの CORS ヘッダーを自動的に設定できます。

CORS の構成

Media CDN では、EdgeCacheService のルートに CORS ポリシーを定義できます。

CORS ポリシーでは、共通の HTTP ヘッダーのセットを使用してこれらのルールを定義します。Access-Control-Allow-OriginAccess-Control-Max-AgeAccess-Control-Allow-Headers などの共通の CORS ヘッダーをレスポンスに設定できます。これらのヘッダーを使用すると、メディア CD サービスへのクロスオリジン呼び出しが可能になります。これらは、ウェブサイトのフロントエンドとは異なるドメイン(オリジン)でホストされている可能性があるため、明示的に許可されないクロスオリジン リクエストが阻止される場合があります。

たとえば、player.example.comapi.example.com は(ブラウザの意味で)異なる送信元であり、フロントエンド アプリケーションに api.example.com にリクエストを送信して次の再生リストを取得するか、関連コンテンツのリストを更新するようリクエストできます。同様に、player.example.comcdn.example.com に連絡して動画再生リストと動画セグメントを取得する必要があります。 cdn.example.com はこれが問題ないこと、および player.example.comallowed origin および他のルール(許可されるヘッダー、Cookie を含めるかどうか)であることを示す必要があります。

別の例として、CORS リクエストで stream.example.com を送信元として、X-Client-ID ヘッダーを許可する場合、次のようにルートに corsPolicy を構成できます。

corsPolicy: maxAge: 600 allowOrigins: ["stream.example.com"] allowHeaders:
["X-Client-ID"]

corsPolicy は、EdgeCacheService 内の routing.pathMatchers[].routeRules[].routeAction.corsPolicy で構成されます。各 routeRule は、必要に応じて異なる corsPolicy を定義することも、まったく定義しないこともできます。

corsPolicy 値を定義し、同じ名前のルートで responseHeadersToAdd フィールドを使用してカスタム レスポンス ヘッダーも設定すると、カスタム レスポンス ヘッダーが優先され、corsPolicy の値の代わりに使用されます。

送信元のレスポンスで HTTP ヘッダーが設定され、corsPolicy 値が設定されている場合は、代わりに corsPolicy 値が使用されます。無効なヘッダー値をクライアントに送信することや、意図せずに制限の緩いポリシーを設定することを避けるために、値は折りたたまれたり結合されたりすることはありません。

特別な {origin_request_header} には、クライアント リクエストの Origin HTTP ヘッダーが入力されます。これは、ルートの Access-Control-Allow-Origin ヘッダーのカスタム レスポンス ヘッダー値として設定できます。

詳細については、RouteAction.CORSPolicy の API 仕様をご覧ください。

CORS ポリシー フィールド

次の表に、CORS ポリシーに含まれるフィールドを示します。

フィールド 説明
allowOrigins

Access-Control-Allow-Origins レスポンス ヘッダーを設定します。これにより、ブラウザ環境でクロスオリジン リクエストを送信できる送信元が指定されます。

たとえば、動画コンテンツが https://video.example.com から提供され、ユーザー向けのポータルが https://stream.example.com から提供されている場合、https://stream.example.com を許可される送信元として追加します。

Access-Control-Allow-Origins: https://stream.example.com
maxAge

Access-Control-Max-Age レスポンス ヘッダーを設定します。これは、ブラウザ クライアントが CORS プリフライト リクエストに対するレスポンスをキャッシュに保存する時間を秒単位で指定します。

一部のブラウザでは、最大値(86400s)が指定されていても、2 時間以内に制限されています。

Access-Control-Max-Age: 7200
allowMethods

Access-Control-Allow-Methods レスポンス ヘッダーを設定します。これは、リソースへのアクセスが許可される HTTP メソッドを指定します。

デフォルトでは、Media CDN は GETHEADOPTIONS の各メソッドのみをサポートしています。プレビューで他のメソッドのサポートを構成するには、ルート メソッドをご覧ください。

Access-Control-Allow-Methods: GET, OPTIONS, HEAD
allowHeaders

Access-Control-Allow-Headers ヘッダーを設定します。これにより、CORS リクエストで送信できるヘッダーが決まります。

動画プレーヤーは、クロスオリジンで動画コンテンツをリクエストするときに一部のレスポンス ヘッダーにアクセスする必要があるため、多くの場合これが必須です。

Access-Control-Allow-Headers: Content-Type, If-Modified-Since, Range, User-Agent
exposeHeaders

Access-Control-Expose-Headers レスポンス ヘッダーを設定します。これにより、クライアントサイドの JavaScript がアクセスできるヘッダーが決まります。

動画プレーヤーは、クロスオリジンでコンテンツをリクエストするときに、動画コンテンツの特定のレスポンス ヘッダーにアクセスする必要がある場合があるため、多くの場合これが必須です。

Access-Control-Expose-Headers: Date, Cache-Status, Content-Type, Content-Length
allowCredentials

Access-Control-Allow-Credentials レスポンス ヘッダーを設定します。これにより、クライアントサイドの JavaScript で、認証情報を含むリクエストのレスポンスを検査できます。

false に設定すると、このヘッダーは省略されます。

Access-Control-Allow-Credentials: true
disabled corsPolicy を削除せずに無効にします。プリフライトの OPTIONS リクエストは、送信元にプロキシされます。 該当なし

corsPolicy の例

次の構成例では、基本的な corsPolicy 構成を示します。

routeRules:
- priority: 1
  matchRules:
  - prefixMatch: /stream/
  routeAction:
    cdnPolicy:
      defaultTtl: 3600s
    corsPolicy:
      allowOrigins:
      - "https://stream.example.com"
      - "https://stream-staging.example.com"
      maxAge: 86400s # some browsers might only honor up to 7200s or less
      allowMethods:
      - "GET"
      - "HEAD"
      - "OPTIONS"
      allowHeaders:
      - "Content-Type"
      - "If-Modified-Since"
      - "Range"
      - "User-Agent"
      exposeHeaders:
      - "Content-Type"
      - "Content-Length"
      - "Date"

ルーティングのトラブルシューティング

一致する結果を取得できないリクエストやエラーが返されるリクエストがある場合は、次の点を確認してください。

  • ルートには、prefixMatchfullPathMatchpathTemplateMatch のいずれか 1 つのみが定義された matchRule が必要です。これらのフィールドのいずれかを含めない場合、API はエラーを返します。
  • 各ルートの priority が正しく設定されていることを確認します。より具体的な(長い)ルートには、短く、広い範囲のルートよりも優先順位を高くする必要があります。
  • デフォルトでは、GETHEADOPTIONS リクエストのみがサポートされます。 プレビューで他のメソッドのサポートを構成するには、ルート メソッドをご覧ください。 特定のルートで有効になっていないメソッドは、HTTP 405 (Method Not Allowed) エラーで拒否されます。
  • 本文付きの HTTP GET リクエストや、トレーラー付きのリクエストは、リクエスト本文が GET リクエストで許可されていないため、HTTP 400 エラーで拒否されます。
  • クエリ パラメータとヘッダーのマッチングは論理「AND」です。つまり、リクエストは、指定されたルートに一致するすべてのクエリ パラメータまたはヘッダーキー(および指定されている場合は値)に一致する必要があります。

次のステップ