外部 HTTP(S) ロードバランサのカスタム ヘッダーとクエリ パラメータ ベースのルーティングの設定

このページでは 2 つの例を説明します。

始める前に

クエリ パラメータ ベースのルーティングの設定

次の例では、クエリ文字列を照合して A/B テストを行う際のクエリ パラメータの使用方法を示しています。

2 つのバックエンド インスタンス グループの追加

ルーティングを利用するには、複数のバックエンドが必要です。

2 つのバックエンドを設定するには、VM が 2 つのインスタンス グループに属している必要があります。このガイドでは、Apache が稼働している Linux VM からなるマネージド インスタンス グループを作成し、負荷分散を設定する方法について説明します。

このマネージド インスタンス グループの VM で外部 HTTP ロードバランサのバックエンド サーバーを実行します。わかりやすく説明するために、バックエンド サーバーはそれぞれ独自のホスト名を提供します。

バックエンドを同じリージョンに配置して、わかりやすくしています。マルチリージョンを使用する場合は、2 つ目のリージョンのインスタンス テンプレートを設定する必要があります。

Console

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

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

  2. [インスタンス グループを作成] をクリックします。
  3. 左側の [新しいマネージド インスタンス グループ] を選択します。
  4. [名前] に「first-example-ig」と入力します。
  5. [ロケーション] で [シングルゾーン] をオンにします。
  6. [リージョン] で希望のリージョンを選択します。この例では us-east1 を使用しています。
  7. [ゾーン] で us-east1-b を選択します。
  8. [インスタンス テンプレート] で [新しいインスタンス テンプレートを作成] を選択します。
  9. [名前] に「lb-backend-template」と入力します。
  10. [ブートディスク] が Debian GNU/Linux 9 (stretch) などの Debian イメージに設定されていることを確認します。これらの手順では、apt-get などの Debian でのみ使用できるコマンドを使用します。
  11. [管理、セキュリティ、ディスク、ネットワーク、単一テナンシー] の [管理] タブで、次のスクリプトを [起動スクリプト] フィールドに挿入します。

    #! /bin/bash
    apt-get update
    apt-get install apache2 -y
    a2ensite default-ssl
    a2enmod ssl
    vm_hostname="$(curl -H "Metadata-Flavor:Google" \
    # See https://cloud.google.com/compute/docs/storing-retrieving-metadata#querying
    http://169.254.169.254/computeMetadata/v1/instance/name)"
    echo "Page served from: $vm_hostname" | \
    tee /var/www/html/index.html
    
  12. [ネットワーキング] でネットワーク タグ allow-health-check を追加します。

  13. [保存して次へ] をクリックします。

  14. [インスタンスの数] に「2」と入力します。

  15. [自動スケーリング モード] で [自動スケーリングしない] を選択します。

  16. [作成] をクリックして、新しいインスタンス グループを作成します。

このようなマネージド インスタンス グループをもう 1 つ作成します。2 つ目は second-example-ig という名前を付け、lb-backend-template テンプレートに基づいて作成します。

gcloud

  1. テンプレートを作成します。

    gcloud compute instance-templates create lb-backend-template \
       --region=us-east1 \
       --network=default \
       --subnet=default \
       --tags=allow-health-check \
       --image-family=debian-9 \
       --image-project=debian-cloud \
       --metadata=startup-script='#! /bin/bash
         apt-get update
         apt-get install apache2 -y
         a2ensite default-ssl
         a2enmod ssl
         vm_hostname="$(curl -H "Metadata-Flavor:Google" \
         # See https://cloud.google.com/compute/docs/storing-retrieving-metadata#querying
         http://169.254.169.254/computeMetadata/v1/instance/name)"
         echo "Page served from: $vm_hostname" | \
         tee /var/www/html/index.html
         systemctl restart apache2'
    
  2. そのテンプレートに基づいてマネージド インスタンス グループを作成します。

    gcloud compute instance-groups managed create first-example-ig \
       --template=lb-backend-template --size=2 --zone=us-east1-b
    
  3. そのテンプレートに基づいて 2 つ目のマネージド インスタンス グループを作成します。

    gcloud compute instance-groups managed create second-example-ig \
       --template=lb-backend-template --size=2 --zone=us-east1-c
    

ファイアウォール ルールの構成

この例では、ファイアウォール ルール fw-allow-health-check を作成します。これは Google Cloud ヘルスチェック システム(130.211.0.0/2235.191.0.0/16)からのトラフィックを許可する上り(内向き)ルールです。この例では、ターゲットタグ allow-health-check を使用して VM が識別されます。

Console

  1. Google Cloud Console の [ファイアウォール] ページに移動します。
    [ファイアウォール] ページに移動
  2. [ファイアウォール ルールを作成] をクリックして、2 つ目のファイアウォール ルールを作成します。
  3. [名前] に「fw-allow-health-check」と入力します。
  4. [ネットワーク] で、[Default] を選択します。
  5. [ターゲット] で [指定されたターゲットタグ] を選択します。
  6. [ターゲットタグ] フィールドに「allow-health-check」を入力します。
  7. [ソースフィルタ] を IP ranges に設定します。
  8. [ソース IP の範囲] を 130.211.0.0/2235.191.0.0/16 に設定します。
  9. [プロトコルとポート] で [指定したプロトコルとポート] をオンにします。
  10. [tcp] の横にあるチェックボックスをオンにして、ポート番号に「80」と入力します。
  11. [作成] をクリックします。

gcloud

gcloud compute firewall-rules create fw-allow-health-check \
    --network=default \
    --action=allow \
    --direction=ingress \
    --source-ranges=130.211.0.0/22,35.191.0.0/16 \
    --target-tags=allow-health-check \
    --rules=tcp

外部 IP アドレスの予約

インスタンスが稼働し始めたので、次にロードバランサにユーザーが接続する際に使用するグローバル静的外部 IP アドレスを設定します。

Console

  1. Google Cloud Console で外部 IP アドレスのページに移動します。
    [外部 IP アドレス] ページに移動
  2. [静的アドレスを予約] をクリックして、IPv4 アドレスを予約します。
  3. [名前] に「lb-ipv4-1」を割り当てます。
  4. ネットワーク階層を [スタンダード] に設定します。
  5. [IP バージョン] で [IPv4] をオンにします。
  6. [タイプ] で [グローバル] をオンにします。
  7. [予約] をクリックします。
  8. [タイプ] が [グローバル] に設定されていることを確認します。
  9. [予約] をクリックします。

gcloud

gcloud compute addresses create lb-ipv4-1 \
    --ip-version=IPV4 \
    --global

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

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

ロードバランサのバックエンドの設定

Console

Cloud Console は現在、ヘッダーベースとパラメータ ベースのルーティングの設定をサポートしていません。代わりに gcloud または API を使用してください。

gcloud

  1. ヘルスチェックを作成します。
        gcloud compute health-checks create http http-basic-check \
            --port 80
        
  2. 最初のバックエンド サービスを作成します。
        gcloud compute backend-services create service-a \
            --global-health-checks \
            --protocol HTTP \
            --health-checks http-basic-check \
            --global
        
  3. 2 つ目のバックエンド サービスを作成します。
        gcloud compute backend-services create service-b \
            --global-health-checks \
            --protocol HTTP \
            --health-checks http-basic-check \
            --global
        
  4. 最初のインスタンス グループをバックエンドとして最初のバックエンド サービスに追加します。
        gcloud compute backend-services add-backend service-a \
            --balancing-mode=UTILIZATION \
            --max-utilization=0.8 \
            --capacity-scaler=1 \
            --instance-group=first-example-ig \
            --instance-group-zone=us-east1-b \
            --global
        
  5. 2 つ目のインスタンス グループをバックエンドとして 2 つ目のバックエンド サービスに追加します。
        gcloud compute backend-services add-backend service-b \
            --balancing-mode=UTILIZATION \
            --max-utilization=0.8 \
            --capacity-scaler=1 \
            --instance-group=second-example-ig \
            --instance-group-zone=us-east1-c \
            --global
        

URL マップの作成

Console

Cloud Console は現在、ヘッダーベースとパラメータ ベースのルーティングの設定をサポートしていません。代わりに gcloud または API を使用してください。

gcloud

  1. YAML ファイル /tmp/web-map-http.yaml を作成します。PROJECT_ID は実際のプロジェクト ID に置き換えます。

    defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a
    hostRules:
    - hosts:
      - '*'
      pathMatcher: path-matcher-1
    name: web-map-http
    pathMatchers:
    - defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a
      name: path-matcher-1
      routeRules:
        - matchRules:
            - prefixMatch: /
              queryParameterMatches:
                - name: ABTest
                  exactMatch: A
          priority: 0
          service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a
        - matchRules:
            - prefixMatch: /
              queryParameterMatches:
                - name: ABTest
                  exactMatch: B
          priority: 1
          service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-b
    selfLink: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/urlMaps/web-map-http
    tests:
    - description: Test routing for query ABTest with A
      host: example.com
      path: /?foo=bar&ABTest=A&bar=foo
      service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a
      expectedOutputUrl: https://example.com/?foo=bar&ABTest=A&bar=foo
    - description: Test routing for query ABTest with B
      host: example.com
      path: /?foo=bar&ABTest=B&bar=foo
      service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendService/service-b
      expectedOutputUrl: https://example.com/?foo=bar&ABTest=B&bar=foo
    
  2. URL マップを検証します。

    gcloud compute url-maps validate --source /tmp/web-map-http.yaml
    

    テストに合格し、コマンドによって成功メッセージが出力された場合は、URL マップに変更を保存します。

  3. URL マップを更新します。

    gcloud compute url-maps import web-map-http \
       --source /tmp/web-map-http.yaml \
       --global
    

ターゲット プロキシと転送ルールの作成

Console

Cloud Console は現在、ヘッダーベースとパラメータ ベースのルーティングの設定をサポートしていません。代わりに gcloud または API を使用してください。

gcloud

  1. URL マップにリクエストをルーティングするターゲット HTTP プロキシを作成します。
        gcloud compute target-http-proxies create http-lb-proxy \
            --url-map web-map-http
        
  2. 受信リクエストをプロキシにルーティングするグローバル転送ルールを作成します。
        gcloud compute forwarding-rules create http-content-rule \
            --address=lb-ipv4-1 \
            --global \
            --target-http-proxy=http-lb-proxy \
            --ports=80
        

テスト

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

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

次のコマンドを実行して、これまでの設定をテストします。

curl http://IP_ADDRESS?ABTest=A
curl http://IP_ADDRESS?ABTest=B

ブラウザで、http://IP_ADDRESS?ABTest=Ahttp://IP_ADDRESS?ABTest=B を開きます。

カスタム HTTP ヘッダーベースのルーティングの設定

この例では、カスタム HTTP ヘッダーを追加および削除して、インテリジェントなルーティングを行います。

始める前に

既存の外部 HTTP(S) ロードバランサを使用することも、新しいロードバランサを作成することもできます。

この機能は、サポート対象のバックエンド タイプであればどれでも使用できます。この例では、インスタンス グループで VM を使用していることを前提としています。

シンプルなロードバランサを設定するには、前述のクエリ パラメータ ベースの例を参照してください。

URL マップの更新

Console

Cloud Console は現在、ヘッダーベースとパラメータ ベースのルーティングの設定をサポートしていません。代わりに gcloud または API を使用してください。

gcloud

  1. この例では、HTTP リクエスト ヘッダーを使用して、リクエストの HTTP ヘッダーの値を照合することで A/B テストを行っています。

    YAML ファイル /tmp/web-map-http.yaml を作成します。PROJECT_ID は実際のプロジェクト ID に置き換えます。

    defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a
    kind: compute#urlMap
    name: web-map-http
    hostRules:
    - hosts:
      - '*'
      pathMatcher: path-matcher-1
    pathMatchers:
    - defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a
      name: path-matcher-1
      routeRules:
        - matchRules:
            - prefixMatch: /
              headerMatches:
                - headerName: ABTest
                  exactMatch: A
          priority: 0
          service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a
        - matchRules:
            - prefixMatch: /
              headerMatches:
                - headerName: ABTest
                  exactMatch: B
          priority: 1
          service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-b
    tests:
    - description: Test routing for query ABTest with A
      host: foobar
      path: /
      headers:
      - name: ABTest
        value: A
      service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a
    - description: Test routing for query ABTest with B
      host: foobar
      path: /
      - name: ABTest
        value: B
      service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendService/service-b
    
  2. URL マップを検証します。

    gcloud compute url-maps validate --source /tmp/web-map-http.yaml
    

    テストに合格し、コマンドによって成功メッセージが出力された場合は、URL マップに変更を保存します。

  3. URL マップを更新します。

    gcloud compute url-maps import web-map-http \
       --source /tmp/web-map-http.yaml \
       --global
    

次のステップ