SSL プロキシ負荷分散の設定

このドキュメントでは、SSL プロキシ負荷分散の設定手順を説明します。開始する前に、SSL プロキシ負荷分散の概要で SSL プロキシ負荷分散の仕組みについて確認してください。

SSL プロキシ負荷分散の設定

この例では、us-central1us-east1 の 2 つのリージョンに存在する単純なサービスにグローバル SSL プロキシ負荷分散を設定する方法を示しています。次の要素を構成します。

  1. 2 つのリージョンに分散している 4 つのインスタンス
  2. インスタンスを保持するインスタンス グループ
  3. バックエンド コンポーネント。次のものが含まれます。
    • ヘルスチェック - インスタンスの正常性をモニタリングします。
    • バックエンド サービス - インスタンス グループをモニタリングし、構成された使用量を超過するのを防止します。
    • バックエンド - インスタンス グループを保持します。
  4. フロントエンド コンポーネント。次のものが含まれます。
    • SSL 証明書リソース。独自の SSL 証明書を指定するセルフマネージド証明書、またはすべてのドメインに有効な Google が発行する Google マネージド証明書を使用できます。詳しくは、SSL 証明書のタイプをご覧ください。
    • SSL 証明書を使用する SSL プロキシ自体
    • ユーザーのトラフィックをプロキシに送信する外部静的 IPv4 アドレスと転送ルール
    • ユーザーのトラフィックをプロキシに送信する外部静的 IPv6 アドレスと転送ルール
  5. ロードバランサおよびヘルス チェッカーからインスタンスへのトラフィックを許可するファイアウォール ルール
  6. SSL ポリシー(省略可)。SSL プロキシのロードバランサとクライアント間でネゴシエートされる SSL の機能を制御します

構成が完了したら、その構成をテストします。

権限

このガイドに従うには、プロジェクト内でインスタンスを作成してネットワークを変更できる必要があります。そのためにはプロジェクトのオーナーまたは編集者であるか、または次の Compute Engine IAM のロールをすべて持っている必要があります。

タスク 必要な役割
ネットワーク、サブネット、負荷分散コンポーネントの作成 ネットワーク管理者
ファイアウォール ルールの追加と削除 セキュリティ管理者
インスタンスの作成 Compute インスタンス管理者

詳細については、次のガイドをご覧ください。

インスタンスとインスタンス グループの構成

このセクションでは、インスタンスおよびインスタンス グループを作成し、インスタンス グループにインスタンスを追加する方法を説明します。本番環境システムであれば、通常はインスタンス テンプレートに基づくマネージド インスタンス グループが使用されますが、初期テストを行う場合にはこの設定を使用した方が迅速に行えます。

インスタンスの作成

テスト目的で、4 つのインスタンスに Apache をインストールしてから、2 つのインスタンス グループを作成し、各グループにインスタンスを 2 つずつ含めます。通常、HTTP トラフィックには SSL プロキシ負荷分散を使用しませんが、Apache は一般的に使用されており、テスト用の設定が簡単です。

これらのインスタンスを作成する際にタグ ssl-lb を指定してください。タグは、後でファイアウォール ルールを定義するときに使用します。

Console

インスタンスの作成

  1. Google Cloud Console の [VM インスタンス] ページに移動します。

    [VM インスタンス] ページに移動

  2. [インスタンスを作成] をクリックします。

  3. [名前] を ig-us-central1-1 に設定します。

  4. [ゾーン] を us-central1-b に設定します。

  5. [管理、セキュリティ、ディスク、ネットワーク、単一テナンシー] をクリックして、詳細設定を表示します。

  6. [管理] で、[タグ] フィールドに「ssl-lb」と入力します。

  7. [起動スクリプト] を次のように設定します。

    sudo apt-get update
    sudo apt-get install apache2 -y
    sudo a2ensite default-ssl
    sudo a2enmod ssl
    sudo service apache2 restart
    echo '<!doctype html><html><body><h1>ig-us-central1-1</h1></body></html>' | sudo tee /var/www/html/index.html

  8. 残りのフィールドはデフォルト値をそのまま使用します。

  9. [作成] をクリックします。

  10. 同じ設定で ig-us-central1-2 を作成します。ただし、[起動スクリプト] は次のように設定します。

    sudo apt-get update
    sudo apt-get install apache2 -y
    sudo a2ensite default-ssl
    sudo a2enmod ssl
    sudo service apache2 restart
    echo '<!doctype html><html><body><h1>ig-us-central1-2</h1></body></html>' | sudo tee /var/www/html/index.html

  11. 同じ設定で ig-us-east1-1 を作成します。ただし、[ゾーン] には us-east1-b を設定し、[起動スクリプト] は次のように設定します。

    sudo apt-get update
    sudo apt-get install apache2 -y
    sudo a2ensite default-ssl
    sudo a2enmod ssl
    sudo service apache2 restart
    echo '<!doctype html><html><body><h1>ig-us-east1-1</h1></body></html>' | sudo tee /var/www/html/index.html

  12. 同じ設定で ig-us-east1-2 を作成します。ただし、[ゾーン] には us-east1-b を設定し、[起動スクリプト] は次のように設定します。

    sudo apt-get update
    sudo apt-get install apache2 -y
    sudo a2ensite default-ssl
    sudo a2enmod ssl
    sudo service apache2 restart
    echo '<!doctype html><html><body><h1>ig-us-east1-2</h1></body></html>' | sudo tee /var/www/html/index.html

gcloud

  1. ゾーン us-central1-big-us-central1-1 を作成します

    gcloud compute instances create ig-us-central1-1 \
        --image-family debian-9 \
        --image-project debian-cloud \
        --tags ssl-lb \
        --zone us-central1-b \
        --metadata startup-script="#! /bin/bash
          sudo apt-get update
          sudo apt-get install apache2 -y
          sudo a2ensite default-ssl
          sudo a2enmod ssl
          sudo service apache2 restart
          echo '<!doctype html><html><body><h1>SSL load balanced instance - US central 1</h1></body></html>' | tee /var/www/html/index.html
          EOF"
    
    Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/instances/ig-us-central1-1].
    NAME             ZONE          MACHINE_TYPE  PREEMPTIBLE INTERNAL_IP EXTERNAL_IP    STATUS
    ig-us-central1-1 us-central1-b n1-standard-1             10.240.0.8  23.251.150.133 RUNNING
  2. ゾーン us-central1-big-us-central1-2 を作成します

    gcloud compute instances create ig-us-central1-2 \
        --image-family debian-9 \
        --image-project debian-cloud \
        --tags ssl-lb \
        --zone us-central1-b \
         --metadata startup-script="#! /bin/bash
          sudo apt-get update
          sudo apt-get install apache2 -y
          sudo a2ensite default-ssl
          sudo a2enmod ssl
          sudo service apache2 restart
           echo '<!doctype html><html><body><h1>SSL load balanced instance - US central 2</h1></body></html>' | tee /var/www/html/index.html
           EOF"
    
    Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/instances/ig-us-central1-2].
    NAME             ZONE          MACHINE_TYPE  PREEMPTIBLE INTERNAL_IP EXTERNAL_IP    STATUS
    ig-us-central1-2 us-central1-b n1-standard-1             10.240.0.11 23.251.148.160 RUNNING
  3. ゾーン us-east1-big-us-east1-1 を作成します

    gcloud compute instances create ig-us-east1-1 \
        --image-family debian-9 \
        --image-project debian-cloud \
        --tags ssl-lb \
        --zone us-east1-b \
        --metadata startup-script="#! /bin/bash
          sudo apt-get update
          sudo apt-get install apache2 -y
          sudo a2ensite default-ssl
          sudo a2enmod ssl
          sudo service apache2 restart
          echo '<!doctype html><html><body><h1>SSL load balanced instance - US east 1</h1></body></html>' | tee /var/www/html/index.html
          EOF"
    
    Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-east1-b/instances/ig-us-east1-1].
    NAME          ZONE       MACHINE_TYPE  PREEMPTIBLE INTERNAL_IP EXTERNAL_IP    STATUS
    ig-us-east1-1 us-east1-b n1-standard-1             10.240.0.12 104.196.31.214 RUNNING
  4. ゾーン us-east1-big-us-east1-2 を作成します

    gcloud compute instances create ig-us-east1-2 \
        --image-family debian-9 \
        --image-project debian-cloud \
        --tags ssl-lb \
        --zone us-east1-b \
        --metadata startup-script="#! /bin/bash
          sudo apt-get update
          sudo apt-get install apache2 -y
          sudo a2ensite default-ssl
          sudo a2enmod ssl
          sudo service apache2 restart
          echo '<!doctype html><html><body><h1>SSL load balanced instance - US east 2</h1></body></html>' | tee /var/www/html/index.html
          EOF"
    
    Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-east1-b/instances/ig-us-east1-2].
    NAME          ZONE       MACHINE_TYPE  PREEMPTIBLE INTERNAL_IP EXTERNAL_IP    STATUS
    ig-us-east1-2 us-east1-b n1-standard-1             10.240.0.13 104.196.25.101 RUNNING

各ゾーンでのインスタンス グループの作成とインスタンスの追加

Console

  1. Google Cloud Console の [インスタンス グループ] ページに移動します。

    [インスタンス グループ] ページに移動

  2. [インスタンス グループを作成] をクリックします。

  3. [名前] を us-ig1 に設定します。

  4. [ゾーン] を us-central1-b に設定します。

  5. [ポート名のマッピングを指定する] をクリックします。ロードバランサは、名前付きポートを介してインスタンス グループにトラフィックを送信します。名前付きポートを作成し、受信トラフィックを特定のポート番号にマッピングします。

    1. [ポート名のマッピング] で [項目を追加] をクリックします。
    2. [ポート名] に「ssl-lb」を入力し、[ポート番号] に「443」を入力します。
  6. [インスタンスの定義] で [既存のインスタンスを選択] をクリックします。

  7. [VM インスタンス] で、ig-us-central1-1ig-us-central1-2 を選択します。

  8. その他の設定はそのまま使用します。

  9. [作成] をクリックします。

  10. 上記のステップを繰り返します(次のように設定します)。

    • 名前: us-ig2
    • ゾーン: us-east1-b
    • ポート名: ssl-lbポート番号: 443
    • インスタンス: ig-us-east1-1ig-us-east1-2
  11. 2 つのインスタンス グループが作成され、各インスタンス グループに 2 つのインスタンスが含まれることを確認します。

gcloud

  1. us-ig1 インスタンス グループを作成します。

    gcloud compute instance-groups unmanaged create us-ig1 --zone us-central1-b
    
    Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/instanceGroups/us-ig1].
    NAME   ZONE          NETWORK MANAGED INSTANCES
    us-ig1 us-central1-b                 0
  2. インスタンス グループの名前付きポートを設定します。

    gcloud compute instance-groups set-named-ports us-ig1 \
        --named-ports ssl-lb:443 \
        --zone us-central1-b
    
  3. ig-us-central1-1ig-us-central1-2us-ig1 に追加します。

    gcloud compute instance-groups unmanaged add-instances us-ig1 \
        --instances ig-us-central1-1,ig-us-central1-2 \
        --zone us-central1-b
    
    Updated [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/instanceGroups/us-ig1].
  4. us-ig2 インスタンス グループを作成します。

    gcloud compute instance-groups unmanaged create us-ig2 --zone us-east1-b
    
    Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-east1-b/instanceGroups/us-ig2].
    NAME   ZONE       NETWORK MANAGED INSTANCES
    us-ig2 us-east1-b                 0
  5. インスタンス グループの名前付きポートを設定します。

    gcloud compute instance-groups set-named-ports us-ig2 \
        --named-ports ssl-lb:443 \
        --zone us-east1-b
    
  6. ig-us-east1-1ig-us-east1-2us-ig2 に追加します。

    gcloud compute instance-groups unmanaged add-instances us-ig2 \
         --instances ig-us-east1-1,ig-us-east1-2 \
         --zone us-east1-b
    
    Updated [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-east1-b/instanceGroups/us-ig2].

これで、2 つのインスタンスを持つインスタンス グループが 2 つのリージョンそれぞれにできました。

ロードバランサの構成

Console

ロードバランサの作成とバックエンド サービスの構成

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

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

  2. [ロードバランサを作成] をクリックします。

  3. [TCP 負荷分散] で [設定を開始] をクリックします。

  4. [インターネット接続または内部専用] で [インターネットから自分の VM へ] を選択します。

  5. [マルチ リージョンまたはシングル リージョン] を [マルチ リージョン(または不明)] に設定します。

  6. ロードバランサの [名前] を my-ssl-lb に設定します。

  7. [バックエンドの設定] をクリックします。

  8. [プロトコル] は TCP のままにして、[*SSL] をクリックします。

  9. [名前付きポート] と [タイムアウト] のデフォルト値を受け入れます。

  10. [バックエンド タイプ] を [インスタンス グループ] に設定したままにします。

  11. [新しいバックエンド] で、インスタンス グループ us-ig1 を選択します。

  12. [ポート番号] を 443 に設定します。

  13. その他の設定はそのまま使用します。

  14. [新しいバックエンド] で、インスタンス グループ us-ig2 を選択します。

  15. [ポート番号] を 443 に設定します。

  16. その他の設定はそのまま使用します。

  17. [完了] をクリックします。

  18. [ヘルスチェック] で [ヘルスチェックを作成] を選択します。

    1. ヘルスチェックの [名前] を my-ssl-health-check に設定します。
    2. [プロトコル] を SSL に設定します。
    3. 他の設定はそのままにします。
    4. [保存して次へ] をクリックします。
  19. Google Cloud Console で [バックエンドの構成] の横に緑色のチェックマークが付いていることを確認します。表示されていない場合には、上のすべての手順が完了していることを再度確認してください。

フロントエンド サービスの構成

  1. [フロントエンドの構成] をクリックします。
  2. [新しいフロントエンドの IP とポート] の [名前] に「my-ssl-lb-forwarding-rule」と入力します。
  3. [プロトコル] を SSL に設定します。
  4. [IP アドレス] で [IP アドレスを作成] を選択します。
    1. [名前] に「ssl-lb-static-ip」と入力します。
    2. [予約] をクリックします。
  5. [証明書] の下で、[新しい証明書の作成] を選択します。
  6. [名前] に「my-ssl-cert」と入力します。
  7. [証明書をアップロードする] を選択した場合は、次の手順を行います。
    1. 適切なフィールドに、以下のものをアップロードします。
      • 公開鍵証明書(crt ファイル)
      • 証明書チェーン(csr ファイル)
      • 秘密鍵(.key ファイル)
    2. 別の SSL 証明書を追加するには、[証明書を追加] をクリックし、[証明書] プルダウン メニューから証明書を選択するか、[新しい証明書の作成] を選択して上記の手順に従います。
    3. 必要に応じてプロキシ プロトコルをオンにします。
    4. [作成] をクリックします。
  8. [Google マネージド証明書を作成する] を選択した場合は、[ドメイン] を入力します。Enter を押すたびに、空のフィールドが表示されます。これらのフィールドに追加のドメインを入力できます。
  9. [完了] をクリックします。
  10. [フロントエンド IP とポートの追加] をクリックします。
  11. [名前] に「my-ssl-lb-ipv6-forwarding-rule」と入力します。
  12. [IP バージョン] を IPv6 に設定します。
  13. [IP アドレス] で [IP アドレスを作成] を選択します。
    1. [名前] に「ssl-lb-static-ipv6」と入力します。
    2. [予約] をクリックします。
  14. [証明書] の下で my-ssl-cert を選択します。
  15. [完了] をクリックします。
  16. プライマリ SSL 証明書リソースに加えて証明書リソースを追加するには、次の手順を行います。
    1. [証明書] リストから証明書を選択するか、[新しい証明書の作成] をクリックし、上記の手順を行います。
  17. [完了] をクリックします。
  18. オプションで SSL ポリシーを作成するには、次の手順に沿って操作します。
    1. [SSL ポリシー] で、[ポリシーを作成] を選択します。
    2. [名前] に「my-ssl-policy」と入力します。
    3. [TLS の最小バージョン] で [TLS 1.0] を選択します。
    4. [プロファイル] で [モダン] を選択します。[有効な機能] と [無効な機能] が表示されます。
    5. [作成] をクリックします。
  19. Google Cloud Console で [フロントエンドの構成] の横に緑色のチェックマークが付いていることを確認します。表示されていない場合には、上のすべての手順が完了していることを再度確認してください。

確認と完了

  1. [確認と完了] をクリックします。
  2. 設定を再度確認します。
  3. [作成] をクリックします。

gcloud

ヘルスチェックの作成

gcloud compute health-checks create ssl my-ssl-health-check --port 443
Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/healthChecks/my-ssl-health-check].
NAME                PROTOCOL
my-ssl-health-check SSL

バックエンド サービスの作成

gcloud compute backend-services create my-ssl-lb \
    --global-health-checks \
    --protocol SSL \
    --health-checks my-ssl-health-check \
    --timeout 5m \
    --global
Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/backendServices/my-ssl-lb].
NAME      BACKENDS PROTOCOL
my-ssl-lb          SSL

あるいは、--protocol TCP を使用して、ロードバランサからインスタンスへの暗号化されていない通信を構成することもできます。

バックエンド サービスへのインスタンス グループの追加

gcloud compute backend-services add-backend my-ssl-lb \
    --instance-group us-ig1 \
    --instance-group-zone us-central1-b \
    --balancing-mode UTILIZATION \
    --max-utilization 0.8 \
    --global
Updated [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/backendServices/my-ssl-lb].
gcloud compute backend-services add-backend my-ssl-lb \
    --instance-group us-ig2 \
    --instance-group-zone us-east1-b \
    --balancing-mode UTILIZATION \
    --max-utilization 0.8 \
    --global
Updated [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/backendServices/my-ssl-lb].

SSL 証明書リソースの構成

セルフマネージド証明書を使用する場合は、少なくともアップロードする SSL 証明書が 1 つ存在している必要があります。存在していない場合は、SSL 証明書を参照してください。複数の SSL 証明書を使用する場合は、一度に 1 つずつ作成する必要があります。

セルフマネージド SSL 証明書を使用していて、秘密鍵と署名済み証明書がない場合は、テスト用に自己署名証明書を作成して使用できます。

セルフマネージド SSL 証明書リソースを作成するには、次のコマンドを実行します。

gcloud compute ssl-certificates create my-ssl-cert \
    --certificate [CRT_FILE_PATH] \
    --private-key [KEY_FILE_PATH]
Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/sslCertificates/my-ssl-cert].
NAME      CREATION_TIMESTAMP
my-ssl-cert 2016-02-20T20:53:33.584-08:00

Google マネージド SSL 証明書リソースを作成するには、次のコマンドを実行します。

    gcloud beta compute ssl-certificates create www-ssl-cert \
      --domains [DOMAIN_1],[DOMAIN_2]

ターゲット SSL プロキシの構成

SSL プロキシ負荷分散は、1~15 件の SSL 証明書を持つターゲット SSL プロキシの作成をサポートしています。次のコマンドを実行する前に、SSL 証明書ごとにそのリソースを作成する必要があります。

プロキシ ヘッダーをオンにする場合は、none ではなく PROXY_V1 に設定します。オプションで、ターゲット プロキシに SSL ポリシーを関連付けることができます。まず、ポリシーを作成します。

gcloud compute ssl-policies create my-ssl-policy \
    --profile MODERN --min-tls-version 1.0

次に、ポリシーをターゲット プロキシに関連付けます。

gcloud compute target-ssl-proxies create my-ssl-lb-target-proxy \
    --backend-service my-ssl-lb \
    --ssl-certificates [SSL_CERT_1][,[SSL_CERT_2],...] \
    --ssl-policy my-ssl-policy \
    --proxy-header NONE
Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/targetSslProxies/my-ssl-lb-target-proxy].
NAME                   PROXY_HEADER SERVICE   SSL_CERTIFICATES
my-ssl-lb-target-proxy NONE         my-ssl-lb my-ssl-cert

グローバル静的 IP アドレスの予約

お客様が負荷分散されたサービスにアクセスする際には、これらの IP アドレスを使用します。

gcloud compute addresses create ssl-lb-static-ipv4 \
        --ip-version=IPV4 \
        --global
Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/addresses/ssl-lb-static-ip].
NAME                 REGION ADDRESS               STATUS
ssl-lb-static-ip            [LB_STATIC_IP]        RESERVED
gcloud compute addresses create ssl-lb-static-ipv6 \
        --ip-version=IPV6 \
        --global
Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/addresses/ssl-lb-static-ipv6].
NAME                 REGION ADDRESS                 STATUS
ssl-lb-static-ipv6          [LB_STATIC_IPV6]        RESERVED

グローバル転送ルールの構成

ターゲット プロキシに関連付けるグローバル転送ルールを作成します。[LB_STATIC_IP][LB_STATIC_IPV6] を、グローバル静的 IP アドレスの予約で生成した IP アドレスに置き換えます。

gcloud compute forwarding-rules create my-ssl-lb-forwarding-rule \
    --global \
    --target-ssl-proxy my-ssl-lb-target-proxy \
    --address [LB_STATIC_IP] \
    --ports 443
Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/forwardingRules/my-ssl-lb-forwarding-rule].
NAME                         REGION IP_ADDRESS     IP_PROTOCOL TARGET
my-ssl-lb-forwarding-rule           [LB_STATIC_IP] SSL         my-ssl-lb-target-proxy
gcloud compute forwarding-rules create my-ssl-lb-ipv6-forwarding-rule \
    --global \
    --target-ssl-proxy my-ssl-lb-target-proxy \
    --address [LB_STATIC_IPV6] \
    --ports 443
Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/forwardingRules/my-ssl-lb-ipv6-forwarding-rule].
NAME                           REGION    IP_ADDRESS       IP_PROTOCOL TARGET
my-ssl-lb-ipv6-forwarding-rule           [LB_STATIC_IPV6] SSL         my-ssl-lb-target-proxy

SSL ロードバランサのファイアウォール ルールの作成

ロードバランサとヘルス チェッカーからインスタンスへのトラフィックを許可するファイアウォール ルールを構成します。

Console


  1. Google Cloud Console の [ファイアウォール] ページに移動します。
    [ファイアウォール] ページに移動
  2. [ファイアウォール ルールを作成] をクリックします。
  3. [名前] に「allow-ssl-lb-and-health」と入力します。
  4. [ネットワーク] で、[default] を選択します。
  5. [ターゲット] で [指定されたターゲットタグ] を選択します。
  6. [ターゲットタグ] を ssl-lb に設定します。
  7. [ソースフィルタ] を IP ranges に設定します。
  8. [ソース IP の範囲] を 130.211.0.0/2235.191.0.0/16 に設定します。
  9. [許可対象プロトコル / ポート] を tcp:443 に設定します。
  10. [作成] をクリックします。

gcloud

gcloud compute firewall-rules create allow-ssl-lb-and-health \
     --source-ranges 130.211.0.0/22,35.191.0.0/16 \
     --target-tags ssl-lb \
     --allow tcp:443
Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/firewalls/allow-ssl-lb-and-health].
NAME                     NETWORK SRC_RANGES                  RULES   SRC_TAGS TARGET_TAGS
allow-ssl-lb-and-health default 130.211.0.0/22,35.191.0.0/16 tcp:443          ssl-lb

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

gcloud beta compute ssl-certificates list

ロードバランサのテスト

ウェブブラウザで、HTTPS を使用して静的 IP アドレスに接続します。このテスト設定では、インスタンスは自己署名証明書を使用しています。このため、ページに初めてアクセスしたときに、ブラウザに警告が表示されます。警告は無視してクリックし、実際のページを表示してください。[IP_ADDRESS] は、作成した IPv4 または IPv6 アドレスに置き換えます。

https://[IP_ADDRESS]

ユーザーに最も近いリージョンからいずれかのホストが表示されます。そのリージョンの他のインスタンスが表示されるまでページをリロードします。他のリージョンからインスタンスを表示するには、最も近いリージョンでインスタンスを停止します。

また、ローカルマシンのコマンドラインから curl を実行できます。SSL プロキシで自己署名証明書を使用する場合は、-k も指定する必要があります。curl -k オプションを使用すれば、自己署名証明書を使用する場合や証明書がまったくない場合でも curl が機能します。通常の証明書がある場合はこのパラメータを削除してもかまいません。独自のサイトをテストする場合にのみ、-k パラメータを使用してください。通常の状況下では有効な証明書が重要なセキュリティ手段です。証明書の警告は無視しないでください。

[IP_ADDRESS] は、作成した IPv4 または IPv6 アドレスに置き換えます。

curl -k https://[IP_ADDRESS]

追加 SSL プロキシ コマンド

ターゲット SSL プロキシの一覧取得

Console

Google Cloud Console のターゲット プロキシリストのページに移動します。

ターゲット プロキシ リストページに移動

gcloud

gcloud compute target-ssl-proxies list
NAME                   PROXY_HEADER SERVICE   SSL_CERTIFICATES
my-ssl-lb-target-proxy NONE         my-ssl-lb my-ssl-cert

ターゲット SSL プロキシの定義を表示

Console

  1. Google Cloud Console のターゲット プロキシリストのページに移動します。

    ターゲット プロキシ リストページに移動

  2. ターゲット SSL プロキシの名前をクリックします。

gcloud

gcloud compute target-ssl-proxies describe [PROXY_NAME]
creationTimestamp: '2016-02-20T20:55:17.633-08:00'
id: '9208913598676794842'
kind: compute#targetSslProxy
name: my-ssl-lb-target-proxy
proxyHeader: NONE
selfLink: https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/targetSslProxies/my-ssl-lb-target-proxy
service: https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/backendServices/my-ssl-lb
sslCertificates:
– https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/sslCertificates/my-ssl-cert

ターゲット SSL の削除

ターゲット プロキシを削除するには、まず、そのターゲット プロキシを参照しているグローバル転送ルールを削除する必要があります。

Console

  1. Google Cloud Console のグローバル転送ルールリストのページに移動します。

    グローバル転送ルール リストページに移動

  2. グローバル転送ルールの隣にあるチェックボックスを選択します。

  3. [削除] をクリックします。

  4. Google Cloud Console のターゲット プロキシリストのページに移動します。

    ターゲット プロキシ リストページに移動

  5. ターゲット SSL プロキシの隣のチェックボックスを選択します。

  6. [削除] をクリックします。

または、次の手順に従って、すべてのロードバランサ コンポーネントを削除することもできます。

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

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

  2. 削除する行の右側にある、ゴミ箱アイコンをクリックします。

  3. [ロードバランサを削除] をクリックします。

gcloud

  1. グローバル転送ルールを削除します。

    gcloud compute forwarding-rules delete my-ssl-lb-forwarding-rule \
        --global
    
    The following global forwarding rules will be deleted:
     – [my-ssl-lb-forwarding-rule]
    
    Do you want to continue (Y/n)?  y
    
    Deleted [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/forwardingRules/my-ssl-lb-forwarding-rule].
    
  2. SSL プロキシを削除します。

    gcloud compute target-ssl-proxies delete my-ssl-lb-target-proxy
    
    The following target ssl proxies will be deleted:
     – [my-ssl-lb-target-proxy]
    
    Do you want to continue (Y/n)?  y
    
    Deleted [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/targetSslProxies/my-ssl-lb-target-proxy].
    

ターゲット SSL プロキシのバックエンド サービスの更新

update コマンドを使用して、別のバックエンド サービスの SSL プロキシを指定できます。この例では、新しいバックエンド サービスを作成し、それにプロキシのトラフィックを向かわせます。次に更新コマンドを実行して、プロキシが元のバックエンド サービスを指すようにします。

Console

この手順では gcloud コマンドライン ツールを使用します。

gcloud

  1. 同じヘルスチェックを使用して、2 番目のバックエンド サービスを作成します。

    gcloud compute backend-services create my-other-backend-service \
        --protocol SSL \
        --health-checks my-ssl-health-check \
        --global
    
    Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/backendServices/my-other-backend-service].
    NAME                     BACKENDS PROTOCOL
    my-other-backend-service          SSL
  2. SSL プロキシのバックエンド サービスを新しいバックエンドに更新します。

    gcloud compute target-ssl-proxies update my-ssl-lb-target-proxy \
        --backend-service my-other-backend-service
    
    Updated [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/targetSslProxies/my-ssl-lb-target-proxy].
    
  3. このバックエンド サービスにはインスタンスが含まれていないため、この時点でプロキシを使用しようとしても、ウェブページは取得できません。元の構成でテストを続行するには、SSL プロキシの指し先を最初のバックエンド サービスに戻します。

    gcloud compute target-ssl-proxies update my-ssl-lb-target-proxy \
        --backend-service my-ssl-lb
    
    Updated [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/targetSslProxies/my-ssl-lb-target-proxy].
    

ターゲット SSL プロキシの SSL 証明書リソースの更新

このコマンドを使用して、SSL プロキシの SSL 証明書を置き換えます。必要な SSL 証明書リソースがすでに作成されている必要があります。

Console

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

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

  2. ロードバランサの隣にある [編集] をクリックします。

  3. [フロントエンドの構成] をクリックします。

  4. [証明書] プルダウン メニューで、新しい証明書を選択します。

  5. 証明書をさらに追加する場合は、Add certificate をクリックします。

  6. [完了] をクリックします。

gcloud

ターゲット SSL プロキシごとに、SSL 証明書のドキュメント番号を構成できます。

gcloud compute target-ssl-proxies set-ssl-certificates [PROXY_NAME] \
    --ssl-certificates [SSL_CERT_1][,[SSL_CERT_2],...]
Updated [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/targetSslProxies/my-ssl-lb-target-proxy].

追加の構成オプション

このセクションでは、代替および追加の構成オプションを提供する構成例を示します。これらのタスクはすべて省略可です。また、任意の順序で行うことができます。

クライアント接続情報を保持するための PROXY プロトコルの設定

SSL プロキシを使用した Google Cloud Load Balancing では、クライアントからの SSL 接続を終端して、インスタンスへの新しい接続を作成します。したがって、デフォルトでは、元のクライアント IP やポート情報は保持されません。

元の接続情報を保持してインスタンスに送信するには、ロードバランサのフロントエンドで PROXY プロトコル(バージョン 1)を有効にします。このプロトコルは、送信元 IP アドレス、宛先 IP アドレス、ポート番号を含む追加ヘッダーをリクエストの構成部分としてインスタンスへ送信します。

TCP と SSL のヘルスチェックに PROXY プロトコルを設定することもできます。

SSL プロキシ ロードバランサのバックエンド インスタンスが PROXY プロトコル ヘッダーをサポートする HTTP(S) サーバーを実行していることを確認します。HTTP(S) サーバーが PROXY プロトコル ヘッダーをサポートするように構成されていない場合、バックエンド インスタンスは空のレスポンスを返します。

通常、PROXY プロトコルのヘッダーは、ユーザーが読み取り可能な次の形式の 1 行のテキストです。

PROXY TCP4 <client IP> <load balancing IP> <source port> <dest port>\r\n

クライアント IP アドレスが 192.0.2.1、負荷分散 IP アドレスが 198.51.100.1、クライアント ポートが 15221、宛先ポートが 443 の場合、次の例のようになります。

PROXY TCP4 192.0.2.1 198.51.100.1 15221 443\r\n

クライアント IP アドレスが不明の場合、ロードバランサは PROXY プロトコルのヘッダーを次の形式で生成します。

PROXY UNKNOWN\r\n

プロキシの PROXY プロトコル ヘッダーの更新

このコマンドを使用して、既存のターゲット SSL プロキシの PROXY プロトコル ヘッダーを変更します。

Console

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

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

  2. ロードバランサの [編集] をクリックします。

  3. [フロントエンドの構成] をクリックします。

  4. [プロキシ プロトコル] フィールドの値を変更します。

  5. [更新] をクリックして、変更を保存します。

gcloud

gcloud compute target-ssl-proxies update my-ssl-lb-target-proxy \
    --proxy-header [NONE | PROXY_V1]

コネクション ドレインの有効化

バックエンド サービスでコネクション ドレインを有効にすると、トラフィックを処理しているインスタンスが停止された場合、手動で削除された場合、自動スケーラ-によって削除されたりした場合に、ユーザーに対する中断を最小限に抑えることができます。コネクション ドレインについて詳しくは、コネクション ドレインの有効化のドキュメントをご覧ください。

セッション アフィニティを有効にする

以下の手順は、サンプルの SSL プロキシ ロードバランサのバックエンド サービスを更新して、バックエンド サービスがクライアント IP アフィニティを使用できるようにする方法を示しています。

クライアント IP アフィニティが有効になっている場合、ロードバランサは、クライアントの IP アドレスとロードバランサの IP アドレス(外部転送ルールの外部 IP アドレス)から作成されたハッシュに基づいて、特定のクライアントのリクエストを同じバックエンド VM に送信します。

Console

クライアント IP セッション アフィニティを有効にするには:

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

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

  2. [バックエンド] をクリックします。

  3. [my-ssl-lb](この例で作成したバックエンド サービスの名前)をクリックし、[編集] をクリックします。

  4. [バックエンド サービスの詳細] ページで、[詳細構成] をクリックします。

  5. [セッション アフィニティ] で、メニューから [クライアント IP] を選択します。

  6. [更新] をクリックします。

gcloud

クライアント IP セッション アフィニティを指定して、バックエンド サービスを更新するには、次の my-ssl-lb コマンドを使用します。

gcloud compute backend-services update my-ssl-lb \
    --global \
    --session-affinity=CLIENT_IP

API

クライアント IP セッション アフィニティを設定するには、backendServices/patch メソッドに PATCH リクエストを送信します。

PATCH https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/us-west1/backendServices/my-ssl-lb
{
  "sessionAffinity": "CLIENT_IP"
}

ロードバランサ コンポーネント

ヘルスチェック

ヘルスチェックでは、どのインスタンスが新しい接続を受け入れられるかが判定されます。 TCP、SSL、HTTP、HTTPS のヘルスチェックの構成によって、インスタンスの正常性が判定されるようにします。

  • バックエンド インスタンスで実行されているサービスが HTTP ベースの場合は、HTTP ヘルスチェックを使用します。
  • バックエンド インスタンスで実行されているサービスが HTTPS ベースの場合は、HTTPS ヘルスチェックを使用します。
  • バックエンド インスタンスで実行されているサービスが SSL を使用している場合は、SSL ヘルスチェックを使用します。
  • 別の種類のヘルスチェックを使用する明白な理由がない限り、TCP ヘルスチェックを使用します。

ヘルスチェックのファイアウォール ルール

インスタンスのヘルスチェック プローブは、範囲 130.211.0.0/2235.191.0.0/16 のアドレスから受信します。ファイアウォール ルールで、関連ポートでのこれらの接続を許可する必要があります。手順については、SSL ロードバランサのファイアウォール ルールを作成するをご覧ください。

ヘルスチェックについて詳しくは、ヘルスチェックをご覧ください。

バックエンド サービス

バックエンド サービス リソースは、ロードバランサに次のような構成情報を提供します。

  • バックエンド サービスは、接続されている 1 つまたは複数のバックエンドに受信トラフィックを振り分けます(後述の負荷分散モードによって決定されます)。各バックエンドは 1 つのインスタンス グループと、そのインスタンス グループ内のインスタンス間のトラフィックを調整する追加構成で構成されています。各インスタンス グループは、1 つ以上のインスタンスで構成されています。
  • 各バックエンド サービスは、バックエンド サービスに追加されたインスタンス グループのインスタンスに対して実行されるヘルスチェックも指定します。
  • ロードバランサを介したアイドル SSL プロキシ接続の存続期間は、バックエンド サービスのタイムアウトによって制限されます。

バックエンド サービスを構成する場合は、インスタンスを追加し、ロードバランサがインスタンスに送信できるトラフィック量を決定する分散モードを指定する必要があります。上限に達すると、次にユーザーに最も近いインスタンスに追加のリクエストが送信されます。

SSL プロキシでは、次の分散モードがサポートされています。

  • UTILIZATION(デフォルト): インスタンス グループのバックエンド使用率が指定値を下回ると、インスタンスはトラフィックを受け入れます。この値を設定するには、--max-utilization パラメータを使用し、0.0(0%)~1.0(100%)の値を渡します。デフォルトは 0.8(80%)です。
  • CONNECTION: 接続数が指定された値を下回った場合に、インスタンスがトラフィックを受け入れます。この値は、次のいずれかに設定できます。
    • --max-connections: インスタンス グループ内のすべてのバックエンド インスタンスの最大接続数。
    • --max-connections-per-instance: 1 つのインスタンスが処理できる最大接続数。グループの平均がこの数を超えていない場合、リクエストは転送されます。

分散モードを UTILIZATION に設定している場合でも、--max-connections または --max-connections-per-instance を指定できます。--max-utilization と接続パラメータの両方を指定した場合、いずれかの上限に達すると、グループはすべて使用されているとみなされます。

バックエンド サービスのリソースの詳細については、バックエンド サービスの概要をご覧ください。

SSL 証明書

SSL プロキシ負荷分散を使用するには、ロードバランサのターゲット プロキシで使用できる少なくとも 1 つの SSL 証明書を作成する必要があります。最大 15 個の SSL 証明書を使用してターゲット プロキシを構成できます。

これらの証明書は、セルフマネージド証明書か Google マネージド証明書になります。

セルフマネージド SSL 証明書を使用していて、秘密鍵と署名済み証明書がない場合は、テスト用に自己署名証明書を作成して使用できます。詳細については、秘密鍵と証明書の作成をご覧ください。自己署名証明書は本番環境では使用しないでください。複数の SSL 証明書を使用している場合は、証明書ごとに SSL 証明書リソースを作成する必要があります。

転送ルール

特定の IP アドレスとポートをターゲット SSL プロキシに転送する転送ルールを作成します。顧客のトラフィックが外部 IP アドレスに到達すると、この転送ルールによって、そのトラフィックを SSL プロキシに送信するようにネットワークに伝達されます。

詳しくは、転送ルールをご覧ください。

推奨事項

  • クライアントの接続情報を保持する必要がある場合、PROXY プロトコル(バージョン 1)のヘッダーを先頭に追加してロードバランサを構成する必要があります。
  • トラフィックが HTTPS の場合は、SSL プロキシ負荷分散ではなく HTTPS 負荷分散を使用する必要があります。

モニタリング

SSL プロキシ負荷分散のモニタリングについては、TCP/SSL プロキシのモニタリングをご覧ください。

トラブルシューティング

ロードバランサの IP からページをロードできない

インスタンスの正常性の確認

インスタンスが正常であることを確認します。

gcloud compute backend-services get-health my-ssl-lb
---
backend: https://www.googleapis.com/resourceviews/v1/projects/[PROJECT_ID]/zones/us-central1-b/resourceViews/us-ig1
status:
  kind: compute#backendServiceGroupHealth
---
backend: https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-east1-b/instanceGroups/us-ig2
status:
  kind: compute#backendServiceGroupHealth

ファイアウォール ルールが正しいことを確認する

  • ヘルスチェックとロードバランサを実行するには、130.211.0.0/2235.191.0.0/16 の IP アドレス範囲のトラフィックを許可する必要があります。
  • ロードバランサとインスタンス間で SSL を使用する場合は、SSL ヘルスチェックを使用します。ファイアウォール ルールがソース IP アドレス範囲 130.211.0.0/22 および 35.191.0.0/16 からの tcp:443 を許可していることを確認します。
  • ロードバランサとインスタンス間で TCP を使用する場合は、TCP ヘルスチェックを使用します。ファイアウォール ルールが送信元 IP アドレス範囲(130.211.0.0/2235.191.0.0/16)からの tcp:80 を許可していることを確認します。
  • インスタンス タグを利用している場合は、タグがファイアウォール ルールの TARGET_TAGS にリストされていることを確認し、すべてのインスタンスにそのタグがあることを確認してください。この例では、インスタンスが ssl-lb でタグ付けされています。
gcloud compute firewall-rules list
NAME                      NETWORK SRC_RANGES                  RULES                        SRC_TAGS TARGET_TAGS
allow-ssl-lb-and-health  default 130.211.0.0/22,35.191.0.0/16 tcp:443                      ssl-lb

各インスタンスに到達可能なことを確認する

インスタンスに個別にアクセスできるファイアウォール ルールを一時的に設定し、特定のインスタンスからページを読み込めるかを試してみます。

  1. ファイアウォールを開いて、任意のソースからタグ付けされたインスタンスへのトラフィックを許可します。これを行うには、ssl-lb タグの付いたインスタンスへの HTTPS トラフィックに対して、送信元 IP 範囲を 0.0.0.0/0 に設定するソースフィルタを作成します。

    gcloud compute firewall-rules create allow-ssl-0-0-0-0 \
        --source-ranges 0.0.0.0/0 \
        --target-tags ssl-lb \
        --allow tcp:443
    
    Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/firewalls/allow-ssl-0-0-0-0].
    NAME              NETWORK SRC_RANGES RULES   SRC_TAGS TARGET_TAGS
    allow-ssl-0-0-0-0 default 0.0.0.0/0  tcp:443          ssl-lb
  2. いずれかのインスタンスの EXTERNAL_IP アドレスを見つけます。

    gcloud compute instances list
    
    NAME             ZONE           MACHINE_TYPE  PREEMPTIBLE INTERNAL_IP EXTERNAL_IP    STATUS
    ig-us-central1-1 us-central1-b  n1-standard-1             10.240.0.8  EXTERNAL_IP RUNNING
    ig-us-central1-2 us-central1-b  n1-standard-1             10.240.0.11 EXTERNAL_IP RUNNING
    ig-us-east1-1    us-east1-b     n1-standard-1             10.240.0.12 EXTERNAL_IP RUNNING
    ig-us-east1-2    us-east1-b     n1-standard-1             10.240.0.13 EXTERNAL_IP RUNNING
  3. ブラウザから直接 1 つ以上のインスタンスにアクセスします。

    https://[EXTERNAL_IP]
    
  4. この方法でインスタンスにアクセスできない場合、ソフトウェアが正しく実行されているか確認します。正しく実行されている場合は、ロードバランサのファイアウォール ルールが正しく設定されていることを確認します。

    gcloud compute firewall-rules describe allow-ssl-lb-and-health
    
    allowed:
      IPProtocol: tcp
      ports:
      '443'
    creationTimestamp: '2016-02-20T22:27:15.094-08:00'
    description: ''
    id: '5304629236729177644'
    kind: compute#firewall
    name: allow-130-211-0-0-22-ssl
    network: https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/networks/default
    selfLink: https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/firewalls/allow-ssl-lb-and-health
    sourceRanges:
      130.211.0.0/22,35.191.0.0/16
    targetTags:
      ssl-lb
  5. インスタンスが動作していることを確認したら、「from anywhere」(どこからも許可)のファイアウォール ルールを削除します。

    gcloud compute firewall-rules delete allow-ssl-0-0-0-0
    
    The following firewalls will be deleted:
       [allow-ssl-0-0-0-0]
    Do you want to continue (Y/n)?  y
    Deleted [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/firewalls/allow-ssl-0-0-0-0].
    

次のステップ