同じ公開ドメインでの HTTP と HTTPS のコンテンツの配信

Cloud CDN の使用時には、同じホスト名で HTTP と HTTPS のコンテンツを配信するのが一般的です。多くのブラウザは、Transport Layer Security(TLS)の使用を必須としており、保護されていないコンテンツ配信を禁止していますが、保護されていない配信と保護されている配信を同じホスト名で許可する必要があるユースケースも存在します。この記事では、Cloud CDN を使用してこの機能を実行する方法について説明します。

課題

クライアントが CDN エッジサーバーとの接続を確立しているとき、エンドユーザー配信プロトコルがネゴシエートされます。従来の CDN プラットフォームではほとんどの場合、次の方法でトラフィックをそれぞれの配信フットプリントに送信します。

  1. DNS CNAME レコードを使用して、CDN に属するドメイン名を指す。
  2. そのドメイン名に対する TLS ネゴシエーションをサポートするサーバーのサブセットにトラフィックをルーティングする。

Cloud CDN は Cloud Load Balancing と統合されているため、Cloud CDN のアプローチは従来の CDN のアプローチとは異なります。Cloud CDN は、外部 HTTP(S) ロードバランサのエニーキャスト IP アドレスを利用します。Cloud CDN を構成するとき、トラフィックの送信先として特定の IP アドレスを指定します。そのため、ホスト名の CNAME レコードにホスト名を設定するのではなく、DNS レコードの A レコード(IPv4 の場合)や AAAA(IPv6 の場合)が必要になります。

デフォルトでは、ロードバランサのフロントエンドを構成するとき、Google Cloud はエフェメラル IP アドレスを動的に割り当てます。HTTP と HTTPS の構成を個別に構成する必要があるため、Cloud CDN インスタンスに 2 つの IP アドレスが必要になる場合があります。同じ A または AAAA レコードの IP アドレスは HTTP と HTTPS の両方で使用されるため、このケースを DNS で適切に処理することはできません。

解決策

同じホスト名で保護されたコンテンツと保護されていないコンテンツの両方を配信する場合、クライアントは、HTTP または HTTPS をネゴシエートできるエッジサーバーに転送されます。Cloud CDN でこれを行うには、IP アドレスを予約し、予約済みの IP アドレスを外部 HTTP(S) ロードバランサの HTTP と HTTPS の両方のフロントエンド構成にバインドします。

同じドメインの HTTP と HTTPS
同じドメインの HTTP と HTTPS

図の中で:

  • www.example.com の受信リクエストは、HTTP/2、HTTPS、HTTP を使用するクライアントから送信されます。
  • 2 つの IP アドレスが予約済みです。1 つは IPv4 用、もう 1 つは IPv6 用です。

    • 34.95.111.204
    • [2600:1901:0:b13e::]
  • これら 2 つの IP アドレスは、Cloud DNS で www.example.com にバインドされます。

  • 外部 HTTP(S) ロードバランサを構成すると、フロントエンドの構成には、予約済みの IP アドレスを使用する 4 つの転送ルールが含まれます。

    名前 プロトコル IP:ポート
    ipv4-http HTTP 34.95.111.204:80
    ipv4-https HTTPS 34.95.111.204:443
    ipv6-http HTTP [2600:1901:0:b13e::]:80
    ipv6-https HTTPS [2600:1901:0:b13e::]:443
  • Cloud CDN キャッシュミスでは、ロードバランサの URL マップで定義された設定に基づいて、ロードバランサがバックエンド送信元にリクエストを分散します。

ステップ 1: グローバル外部 IP アドレスを予約する

IPv4 または IPv6 アドレス(あるいはその両方)を作成します。IPv4 アドレスと IPv6 アドレスをサポートするには、IPv4 アドレスと IPv6 アドレスを 1 つずつ作成する必要があります。

DNS レコードで A(または AAAA)レコードを作成して、この予約済み IP アドレスにトラフィックを転送します。

Console

  1. Google Cloud Console で、[外部 IP アドレス] ページに移動します。

    [外部 IP アドレス] ページに移動

  2. [静的アドレスを予約] をクリックして、IPv4 アドレスを予約します。
  3. ipv4-address の [名前] を割り当てます。
  4. ネットワーク階層を [プレミアム] に設定します。
  5. [IP バージョン] を IPv4 に設定します。
  6. [タイプ] で [グローバル] をオンにします。
  7. [予約] をクリックします。

ロードバランサは、Cloud CDN が有効な場合、必要に応じてプレミアム ティア ネットワークを使用します。

gcloud

gcloud compute addresses create ipv4-address \
    --network-tier=PREMIUM \
    --ip-version=IPV4 \
    --global

予約されている IPv4 アドレスをメモします。

gcloud compute addresses describe lb-ipv4-1 \
    --format="get(address)" \
    --global

IPv6 に対してこの手順を繰り返します。

詳細については、新しい静的外部 IP アドレスの予約をご覧ください。

ステップ 2: 予約済み IP アドレスをロードバランサにバインドする

このセクションでは、ロードバランサに IP アドレスを割り当てる方法を説明します。この記事では、ロードバランサの設定に関する詳しい手順は説明しません。設定例については、HTTPS ロードバランサの作成をご覧ください。

フロントエンド構成セクションで、クライアントとロードバランサの間で使用するプロトコルを選択できます。

この例では、クライアントとロードバランサの間で HTTP と HTTPS の両方を使用しているため、プロキシを構成する SSL 証明書リソースが 1 つ以上必要になります。

Console

HTTP 転送ルールを構成する

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

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

  2. ロードバランサをクリックして、[編集] をクリックします。
  3. 左側のパネルで、[フロントエンドの構成] をクリックします。
  4. [名前] フィールドに「ipv4-http」と入力します。
  5. [プロトコル] フィールドで [HTTP] を選択します。
  6. [IP バージョン] を IPv4 に設定します。
  7. [IP アドレス] で、先ほど作成した ipv4-address を選択します。
  8. HTTP トラフィックを許可するように、[ポート] が 80 に設定されていることを確認します。
  9. [完了] をクリックします。

HTTPS 転送ルールを構成する

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

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

  2. ロードバランサをクリックして、[編集] をクリックします。
  3. 左側のパネルで、[フロントエンドの構成] をクリックします。
  4. [名前] フィールドに「ipv4-https」と入力します。
  5. [プロトコル] フィールドで [HTTPS] を選択します。
  6. [IP バージョン] を IPv4 に設定します。
  7. [IP アドレス] で、先ほど作成した ipv4-address を選択します。
  8. HTTP トラフィックを許可するように、[ポート] が 443 に設定されていることを確認します。
  9. [証明書] プルダウン リストをクリックします。
    1. プライマリ SSL 証明書として使用しようとしているセルフマネージド SSL 証明書リソースがすでにある場合は、プルダウン メニューから選択します。
    2. そうでない場合は、[新しい証明書の作成] を選択します。
    3. [証明書をアップロード] または [Google マネージド証明書を作成] を選択します。
    4. [証明書をアップロードする] を選択した場合は、次の手順を行います。
      1. [名前] に「www-ssl-cert」と入力します。
      2. 該当するフィールドに、公開鍵証明書(.crt ファイル)、証明書チェーン(.csr ファイル)、秘密鍵(.key ファイル)をアップロードします。
      3. [作成] をクリックします。
    5. [Google 管理の証明書を作成する] を選択した場合は、ドメインを入力します。
    6. プライマリ SSL 証明書リソースに加えて証明書リソースを追加するには、次の手順に沿って操作します。
      1. [証明書を追加] をクリックします。
      2. [証明書] リストから証明書を選択するか、[新しい証明書の作成] をクリックし、上記の手順を行います。
  10. [完了] をクリックします。

IPv6 に対して上記の手順を繰り返します。

確認と完了

  1. 左側のパネルで、[確認と完了] をクリックします。
  2. 現在の設定と作成しようとしている内容を比較します。
  3. すべて問題なければ、[更新] をクリックします。

gcloud

  1. URL マップにリクエストをルーティングするターゲット HTTP プロキシを作成します。

    gcloud compute target-http-proxies create http-lb-proxy \
      --url-map=web-map
    
  2. URL マップにリクエストをルーティングするターゲット HTTPS プロキシを作成します。プロキシはロードバランサの一部であり、HTTPS 負荷分散用の SSL 証明書を保持するため、この手順で証明書も読み込みます。

    gcloud compute target-https-proxies create https-lb-proxy \
      --url-map=web-map --ssl-certificates=www-ssl-cert
    
  3. 2 つのグローバル転送ルールを作成して、作成した IP アドレスごとに受信したリクエストをプロキシに転送します。

    • グローバル外部 HTTP(S) ロードバランサ(プレビュー)の場合は、gcloud ツールコマンドの beta バージョンと load-balancing-scheme=EXTERNAL_MANAGED を使用します。この設定では、高度なトラフィック管理機能が提供されます。
    • グローバル外部 HTTP(S) ロードバランサ(従来)の場合は、load-balancing-scheme=EXTERNAL を使用します。
    gcloud compute forwarding-rules create ipv4-http \
      --load-balancing-scheme=LOAD_BALANCING_SCHEME \
      --network-tier=PREMIUM \
      --address=ipv4-address \
      --global \
      --target-http-proxy=http-lb-proxy \
      --ports=80
    
    gcloud compute forwarding-rules create ipv4-https \
      --load-balancing-scheme=LOAD_BALANCING_SCHEME \
      --network-tier=PREMIUM \
      --address=ipv4-address  \
      --global \
      --target-https-proxy=https-lb-proxy \
      --ports=443
    

グローバル転送ルールの作成後、構成が全世界に反映されるまで数分かかることがあります。

ステップ 3: DNS ゾーンファイルで A または AAAA レコードを作成する

このプロセスの最後のステップは、Cloud CDN をポイントするために DNS ゾーンファイルに A または AAAA レコード(あるいはその両方)を作成することです。Cloud CDN では、ホスト名の値にロードバランサに割り当てられた予約済み IP アドレスが付加されます。

これにより、Cloud CDN を介して同じホスト名で HTTP と HTTPS の両方を提供できるようになります。

省略可: HTTP から HTTPS へのリダイレクト

HTTP リクエストを HTTPS ロードバランサにリダイレクトする場合は、フロントエンドはあってもバックエンドがない部分的な HTTP ロードバランサを追加する必要があります。フロントエンドは、受信したリクエストを HTTPS ロードバランサにリダイレクトします。この処理では次のものが使用されます。

サポートの利用

Google Cloud と Cloud CDN についてご不明な点がある場合は、Google Cloud セールスチームにお問い合わせいただくか、Google Cloud コミュニティ Slack チャンネルから #cloud-cdn チャンネルにメモを投稿してお問い合わせください。

次のステップ