サードパーティのオブジェクト ストレージを使用した Cloud CDN の設定

コンテンツがオンプレミスまたは別のクラウドでホストされている場合は、外部バックエンドを使用できます。外部バックエンドを使用すると、Google の Cloud CDN からコンテンツを配信できます。

このドキュメントでは、Cloud CDN の外部バックエンドとして、Amazon Simple Storage Service(Amazon S3)や Azure Blob Storage などのサードパーティのオブジェクト ストレージを設定する手順について説明します。外部バックエンドと Cloud CDN は、外部 HTTP(S) ロードバランサと連携して機能します。

アーキテクチャ

外部バックエンドを作成するには、サードパーティのストレージ サービスをロードバランサのバックエンドとしてポイントするインターネット ネットワーク エンドポイント グループ(NEG)を作成します。インターネット NEG は外部バックエンドに使用されます。

サードパーティのストレージ バケットをバックエンドとして設定するには、次のことを行う必要があります。

  1. コンテンツを配信するサードパーティのストレージ バケットを準備します。
  2. バケットの FQDN を使用するインターネット NEG を作成します。
  3. インターネット NEG をバックエンドとして使用するように外部 HTTP(S) ロードバランサを構成します。
  4. セットアップをテストします。

コンテンツを配信するためのバケットの準備

Google Cloud でのセットアップを開始する前に、バケットが正しく構成されていることを確認してください。以下の手順では Amazon S3 を使用します。このため、Amazon S3 のバケットとオブジェクトに変更を行うための権限が付与されていることを前提としています。

  1. Amazon S3 バケットとバケット内のオブジェクトが一般公開されていることを確認します。手順については、AWS のナレッジベースをご覧ください。たとえば、Amazon S3 バケットの一部のオブジェクトにパブリック読み取りアクセス権限を付与するにはどうすればよいですか?をご覧ください。

  2. コンテンツが、キャッシュに保存可能なコンテンツに記載されている要件を満たしていることを確認します。オブジェクトのメタデータを追加する必要がある場合は、AWS のナレッジベースをご覧ください。たとえば、Editing object metadata in the Amazon S3 console をご覧ください。

  3. Amazon S3 バケットのエンドポイント(FQDN)をメモします。この情報は、インターネット NEG を設定するときに必要になります。エンドポイント情報を取得するには、AWS のナレッジベースに記載されている手順で行ってください。詳しくは、Buckets overview をご覧ください。オブジェクトの概要ページから Amazon S3 エンドポイント URL を取得することもできます。

バケットのホスト名を使用するインターネット NEG を作成する

わかりやすくするために、この例では FQDN backend.example.com を使用します。これは、サードパーティのストレージ バケットの FQDN (http://unique-name-bucket.s3-us-west-1.amazonaws.com/ など)に置き換えてください。

このガイドでは、外部 HTTP(S) ロードバランサで外部バックエンド(カスタム送信元とも呼ばれます)を使用する基本的な方法について説明します。外部バックエンドは Google Cloud の外部にあるエンドポイントです。外部 HTTP(S) ロードバランサで外部バックエンドを使用する場合は、Cloud CDN キャッシュを使用してパフォーマンスを向上させることができます。

このガイドでは、外部バックエンド サーバーに backend.example.com でプロキシする Cloud CDN 対応バックエンド サービスを使用して、グローバル外部 HTTP(S) ロードバランサを構成する方法を説明します。

この例では、ロードバランサはクライアントからの HTTPS リクエストを受け入れ、HTTP/2 として外部バックエンドにプロキシします。この例では、外部バックエンドが HTTP/2 をサポートしていることを前提としています。

他のオプションとしては、HTTP や HTTP/2 のリクエストを受け入れるようにロードバランサを構成し、外部バックエンドにリクエストをプロキシする場合は HTTPS を使用します。

このガイドでは、すでにロードバランサが設定され、新しい外部バックエンドを追加していることを前提としています。

アーキテクチャのサンプルを次に示します。

外部バックエンドに S3 バケットを使用する例
外部バックエンドに S3 バケットを使用する例

図では、www.example.com に IP アドレス 120.1.1.1 のロードバランサ フロントエンドがあります。キャッシュミスが発生した場合、/cart/id/1223515 へのユーザー リクエストは外部バックエンドから HTTP/2 経由で取得されます。その他の受信トラフィックは、Compute Engine VM を使用する Google Cloud バックエンド サービスか、URL マップに基づいてバックエンド バケットに転送されます。

始める前に

このガイドに進む前に、次の内容を理解しておいてください。

権限

このガイドに記載された手順を行う前に、インターネット NEG を作成し、プロジェクト内の外部 HTTP(S) ロードバランサを作成するか、変更しておく必要があります。そのためには、プロジェクトのオーナーまたは編集者であるか、次の両方の Compute Engine IAM ロールを持っている必要があります。

タスク 必要なロール
ロードバランサ コンポーネントの作成と変更 ネットワーク管理者
NEG の作成と変更 Compute インスタンス管理者

外部バックエンドを使用したロードバランサの構成

このガイドでは、インターネット NEG を構成してテストする方法を説明します。

設定の概要

インターネット NEG の設定には、次の作業を行います。

  • インターネット NEG におけるインターネット エンドポイントを定義します。
  • インターネット NEG をバックエンドとしてバックエンド サービスに追加します。
  • 外部 HTTP(S) ロードバランサの URL マップを構成し、このバックエンド サービスにマッピングするユーザー トラフィックを定義します。
  • 必要な IP 範囲を許可リストに登録します。

この例では、次のリソースを作成します。

  • 120.1.1.1 IP アドレスの転送ルールで、受信リクエストをターゲット プロキシに転送します。
    • 転送ルールの networkTier は、PREMIUM である必要があります。
  • ターゲット プロキシによって、各リクエストが URL マップと照合され、各リクエストに適したバックエンド サービスが決定されます。
    • 外部バックエンドの場合、ターゲット プロキシは TargetHttpProxyTargetHttpsProxy である必要があります。この例では TargetHttpsProxy を使用しています。
  • バックエンド サービスで Cloud CDN を有効にすると(省略可)、Cloud CDN キャッシュからのレスポンスをキャッシュして処理できます。
  • バックエンド サービス構成により、トラフィックが 1 つのインターネット NEG に転送されます。このインターネット NEG には、Cloud CDN キャッシュミスが発生したときに外部 HTTP(S) ロードバランサがトラフィックを送信するネットワーク エンドポイントが含まれます。
  • この例には、ユーザー定義のリクエスト ヘッダーが含まれています。これは外部バックエンドが HTTP リクエスト Host ヘッダーの特定の値を想定している場合に必要です。

設定は次のようになります。

バックエンドとして Amazon S3 バケットを使用する Cloud CDN
バックエンドとして Amazon S3 バケットを使用する Cloud CDN

NEG とインターネット エンドポイントの作成

Console

  1. Google Cloud Console で、[ネットワーク エンドポイント グループ] ページに移動します。

    [ネットワーク エンドポイント グループ] ページに移動

  2. [ネットワーク エンドポイント グループを作成] をクリックします。
  3. ネットワーク エンドポイント グループの名前として「example-fqdn-neg」を入力します。
  4. [ネットワーク エンドポイント グループの種類] で、[ネットワーク エンドポイント グループ(インターネット)] を選択します。
  5. [デフォルト ポート] に「443」と入力します。
  6. [新しいネットワーク エンドポイント] で [完全修飾ドメイン名とポート] を選択します。
  7. FQDN の場合は、「backend.example.com」と入力します。
  8. [ポートタイプ] で [デフォルト] を選択し、[ポート番号] が 443 であることを確認します。
  9. [作成] をクリックします。

gcloud

  1. インターネット NEG を作成し、--network-endpoint-typeinternet-fqdn-port(外部バックエンドに到達可能なホスト名とポート)に設定します。

    gcloud compute network-endpoint-groups create example-fqdn-neg \
        --network-endpoint-type="internet-fqdn-port" --global
    
  2. エンドポイントを NEG に追加します。ポートが指定されていない場合、バックエンド サービスで構成されるプロトコルによって、デフォルトのポート選択はポート 80(HTTP)または、443(HTTPS、HTTP/2)になります。--global フラグが含まれていることを確認してください。

    gcloud compute network-endpoint-groups update example-fqdn-neg \
        --add-endpoint="fqdn=backend.example.com,port=443" \
        --global
    
  3. 作成されたインターネット NEG を一覧表示します。

    gcloud compute network-endpoint-groups list --global
    

    出力:

    NAME                LOCATION   ENDPOINT_TYPE        SIZE
    example-fqdn-neg    global     INTERNET_FQDN_PORT   1
    

  4. その NEG 内のエンドポイントを一覧表示します。

    gcloud compute network-endpoint-groups list-network-endpoints example-fqdn-neg \
        --global
    

    出力:

    INSTANCE   IP_ADDRESS   PORT   FQDN
                                   backend.example.com
    

ロードバランサへの外部バックエンドの追加

次の例では、既存のロードバランサを更新します。

既存のロードバランサのデフォルトのサービスは、Google Cloud サービスです。この例では、cart/id/1223515 へのすべてのリクエストを、インターネット NEG に関連付けられた images バックエンド サービスに送信するパスマッチャーの追加により、既存の URL マップを変更します。

Console

バックエンド サービスの作成とインターネット NEG の追加

  1. Google Cloud Console で、[負荷分散] ページに移動します。

    [負荷分散] ページに移動

  2. バックエンド サービスを既存のロードバランサに追加するには、外部 HTTP(S) ロードバランサを選択し、メニュー をクリックして [編集] を選択します。
  3. [バックエンドの構成] をクリックします。
  4. [バックエンド サービスとバックエンド バケットの作成または選択] プルダウン メニューで、[バックエンド サービス] > [バックエンド サービスを作成] の順に選択します。
  5. バックエンド サービスの名前を images に設定します。
  6. [バックエンド タイプ] で [インターネット ネットワーク エンドポイント グループ] を選択します。
  7. ロードバランサからインターネット NEG へ使用するプロトコルを選択します。この例では、[HTTP/2] を選択します。
  8. [新しいバックエンド] > [インターネット ネットワーク エンドポイント グループ] で [example-fqdn-neg] を選択し、[完了] をクリックします。
  9. [Cloud CDN を有効にする] を選択します。
  10. デフォルトのキャッシュ モードTTL の設定を維持します。
  11. [詳細構成] の [カスタム リクエスト ヘッダー] で [ヘッダーを追加] をクリックします。
    1. [ヘッダー名] に「Host」と入力します。
    2. [ヘッダーの値] に「backend.example.com」と入力します。
  12. [作成] をクリックします。
  13. ウィンドウを開いたままにして続行します。

バックエンド サービスを既存の URL マップに接続する

  1. [ホストとパスのルール] をクリックします。
  2. 先頭行または最初の数行の右側の列には Google Cloud サービスがあり、それらの 1 つに [ホスト] と [パス] へのデフォルト ルール Any unmatched (default) がすでに入力されています。
  3. 右側の列に images が選択されている行があることを確認します。存在しない場合は、[ホストとパスのルールを追加] をクリックして、images を選択します。他のフィールドには次のように入力します。
    1. [ホスト] に「*」と入力します。
    2. [パス] に「/cart/id/1223515」と入力します。

確認と完了

  1. [確認と完了] をクリックします。
  2. 現在の設定と作成しようとしている内容を比較します。
  3. すべて問題なければ、[作成] をクリックして外部 HTTP(S) ロードバランサを作成します。

gcloud

  1. NEG の新しいバックエンド サービスを作成します。

    gcloud compute backend-services create images \
       --global \
       --enable-cdn \
       --protocol=HTTP2
    
  2. バックエンド サービスを構成して、カスタム リクエスト ヘッダー Host: backend.example.com をリクエストに追加します。

    gcloud compute backend-services update images \
       --custom-request-header "Host: backend.example.com" --global
    
  3. backend-services add-backend コマンドを使用して、インターネット NEG をバックエンド サービスに追加します。

    gcloud compute backend-services add-backend images \
      --network-endpoint-group "example-fqdn-neg" \
      --global-network-endpoint-group \
      --global
    
  4. 新しいマッチング ルールを作成して、新しいバックエンド サービスをロードバランサの URL マップに接続し、バックエンドにリクエストを転送します。

    gcloud compute url-maps add-path-matcher EXAMPLE_URL_MAP \
      --default-service=GCP_SERVICE_EXAMPLE \
      --path-matcher-name=CUSTOM_ORIGIN_PATH_MATCHER_EXAMPLE \
      --backend-service-path-rules=/CART/ID/1223515=IMAGES
    

    次のように置き換えます。

    • EXAMPLE_URL_MAP: 既存の URL マップの名前
    • GCP_SERVICE_EXAMPLE: 既存のデフォルトのバックエンド サービスの名前
    • CUSTOM_ORIGIN_PATH_MATCHER_EXAMPLE: この新しいパスルールの名前
    • /CART/ID/1223515 パス
    • IMAGES: インターネット NEG が接続された新しいバックエンド サービスの名前

必要な IP 範囲を許可リストに登録する

外部 HTTP(S) ロードバランサからインターネット NEG へのリクエストの送信を許可するには、dignslookup などのツールを使用して、_cloud-eoips.googleusercontent.com DNS TXT レコードをクエリする必要があります。

たとえば、次の dig コマンドを実行します。

dig TXT _cloud-eoips.googleusercontent.com | grep -Eo 'ip4:[^ ]+' | cut -d':' -f2

出力には、次のように 2 つの IP 範囲が含まれます。

34.96.0.0/20
34.127.192.0/18

IP 範囲を書き留め、ファイアウォールまたはクラウドのアクセス制御リスト(ACL)でこれらの範囲が許可されていることを確認します。

詳細については、リクエストの認証をご覧ください。

外部 HTTP(S) ロードバランサのテスト

ロードバランサを構成したので、ロードバランサの IP アドレスにトラフィックを送信できるようになりました。ドメインを構成した場合、ドメイン名にトラフィックを送信することもできます。ただし、DNS の伝播が完了するまでに時間がかかることがあるため、テスト用の IP アドレスで始めることもできます。

  1. Google Cloud Console の [負荷分散] ページに移動します。
    [負荷分散] ページに移動
  2. 作成したロードバランサをクリックします。
  3. ロードバランサの IP アドレスをメモします。
  4. HTTP ロードバランサを作成した場合は、ウェブブラウザで http://IP_ADDRESS に移動してロードバランサをテストできます。IP_ADDRESS は、ロードバランサの IP アドレスに置き換えます。helloworld サービスのホームページが表示されます。

    HTTPS ロードバランサを作成した場合は、ウェブブラウザで https://IP_ADDRESS に移動してロードバランサをテストできます。IP_ADDRESS は、ロードバランサの IP アドレスに置き換えます。helloworld サービスのホームページが表示されます。

    結果に問題があり、Google マネージド証明書を使用している場合は、証明書リソースのステータスが ACTIVE であることを確認します。詳しくは、Google マネージド SSL 証明書リソースのステータスをご覧ください。

    あるいは、ローカルマシンのコマンドラインから curl を使用することもできます。IP_ADDRESS は、ロードバランサの IPv4 アドレスに置き換えます。

    Google マネージド証明書を使用している場合は、ロードバランサの IP アドレスを指すドメインをテストします。次に例を示します。

    curl -s 'https://backend.example.com:443' --connect-to --resolve backend.example.com:443:IP_ADDRESS
    

  5. (省略可)カスタム ドメインを使用する場合は、更新された DNS 設定が反映されるまでに時間がかかる場合があります。次に、ウェブブラウザでドメイン(backend.example.com など)をテストします。

    トラブルシューティングについては、外部バックエンドとインターネット NEG に関する問題のトラブルシューティングをご覧ください。

Cloud CDN のテスト

テスト 1: バケットのエンドポイントに直接ヒットする

このテストでは、VM から time コマンドと wget コマンドを使用します。この例では、バケット backend.example.com から /cart/id/1223515/image.jpg をダウンロードします。

出力から、リクエスト全体で 780 ミリ秒を要することがわかります。今回は、Amazon S3 から 3.3 MB のイメージを直接取得します。

time wget backend.example.com/cart/id/1223515/image.jpg
--2020-06-26 18:22:46--  backend.example.com/cart/id/1223515/image.jpg
Resolving backend.example.com (backend.example.com)... 52.219.120.233
Connecting to backend.example.com (backend.example.com)|52.219.120.233|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3447106 (3.3M) [image/jpeg]
Saving to: '/cart/id/1223515/image.jpg.47'
/cart/id/1223515/image.jpg.47                                                 100%[==============================================================================================================================================>]   3.29M  6.25MB/s    in 0.5s
2020-06-26 18:22:47 (6.25 MB/s) - '/cart/id/1223515/image.jpg.47' saved [3447106/3447106]
real    0m0.780s
user    0m0.003s
sys     0m0.012s

テスト 2: Cloud CDN を使用して最初のリクエストを行う

このテストでは、ロードバランサの IP アドレスを使用して /cart/id/1223515/image.jpg ファイルを取得します。これは最初のリクエストであるため、ミスとなり、Cloud CDN は送信元(Amazon S3)からイメージを取得します。出力から、リクエストに 844 ミリ秒かかったことがわかります。

time wget http://LOAD_BALANCER_IP_ADDRESS/cart/id/1223515/image.jpg
--2020-06-26 18:19:27--  http://LOAD_BALANCER_IP_ADDRESS/cart/id/1223515/image.jpg
Connecting to LOAD_BALANCER_IP_ADDRESS:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3447106 (3.3M) [image/jpeg]
Saving to: '/cart/id/1223515/image.jpg.44'
/cart/id/1223515/image.jpg.44                                                 100%[==============================================================================================================================================>]   3.29M  8.23MB/s    in 0.4s
2020-06-26 18:19:28 (8.23 MB/s) - '/cart/id/1223515/image.jpg.44' saved [3447106/3447106]
real    0m0.844s
user    0m0.003s
sys     0m0.012s

テスト 3: CDN から 2 回目のリクエストを行う

このロードバランサの IP を使用して、さらにリクエストを送信します。今回は、キャッシュに保存されたレスポンスが取得されるため、前の 2 つのテストよりも処理時間が短くなるはずです。

同じ LB IP LOAD_BALANCER_IP_ADDRESS を再度使用します。出力から、リクエストの処理時間がわずか 18 ミリ秒であったことがわかります。

time wget http://LOAD_BALANCER_IP_ADDRESS/cart/id/1223515/image.jpg
--2020-06-26 18:19:29--  http://LOAD_BALANCER_IP_ADDRESS/cart/id/1223515/image.jpg
Connecting to LOAD_BALANCER_IP_ADDRESS:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3447106 (3.3M) [image/jpeg]
Saving to: '/cart/id/1223515/image.jpg.45'
/cart/id/1223515/image.jpg.45                                                 100%[==============================================================================================================================================>]   3.29M  --.-KB/s    in 0.008s
2020-06-26 18:19:29 (423 MB/s) - '/cart/id/1223515/image.jpg.45' saved [3447106/3447106]
real    0m0.018s
user    0m0.001s
sys     0m0.010s

ログを使用した確認

Cloud CDN のログは、Cloud CDN 対応バックエンドが接続されている外部 HTTP(S) ロードバランサに関連付けられます。ログを使用すると、リクエストがヒットまたはミスのいずれであるかを確認できます。Cloud CDN ログの詳細については、ログの表示をご覧ください。

制限事項

  • サードパーティのバケットとオブジェクトが公開されている必要があります。外部バックエンドは、署名付き URL や署名付き Cookie をサポートしていません。

次のステップ

  • Cloud CDN がキャッシュからレスポンスを配信しているかどうかを確認するには、ログの表示をご覧ください。
  • キャッシュに保存可能なコンテンツと保存できないコンテンツについては、キャッシュの概要をご覧ください。
  • GFE の接続拠点を確認するには、キャッシュのロケーションをご覧ください。