従来のアプリケーション ロードバランサにヘッダーとクエリ パラメータ ベースのルーティングを設定する

このページでは、従来のアプリケーション ロードバランサの例を 2 つ紹介します。

グローバル外部アプリケーション ロードバランサとリージョン外部アプリケーション ロードバランサのトラフィック管理を構成するには、次のページをご覧ください。

始める前に

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

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

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

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

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

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

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

コンソール

  1. インスタンス テンプレートを作成します。Google Cloud Console で、[インスタンス テンプレート] ページに移動します。

    [インスタンス テンプレート] に移動

    1. [インスタンス テンプレートを作成] をクリックします。
    2. [名前] に「lb-backend-template」と入力します。
    3. [ブートディスク] が Debian GNU/Linux 12 (bookworm) などの Debian イメージに設定されていることを確認します。以降の手順では、apt-get などの Debian でのみ使用できるコマンドを使用します。
    4. [詳細オプション] をクリックします。
    5. [ネットワーキング] をクリックして次のフィールドを構成します。
      1. [ネットワーク タグ] に「allow-health-check」と入力します。
    6. [管理] をクリックします。[起動スクリプト] フィールドに次のスクリプトを入力します。

      #! /bin/bash
      apt-get update
      apt-get install apache2 -y
      a2ensite default-ssl
      a2enmod ssl
      vm_hostname="$(curl -H "Metadata-Flavor:Google" \
      http://metadata.google.internal/computeMetadata/v1/instance/name)"
      echo "Page served from: $vm_hostname" | \
      tee /var/www/html/index.html
      systemctl restart apache2
      
    7. [作成] をクリックします。

  2. マネージド インスタンス グループを作成します。Google Cloud Console の [インスタンス グループ] ページに移動します。

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

    1. [インスタンス グループを作成] をクリックします。
    2. [新しいマネージド インスタンス グループ(ステートレス)] を選択します。詳細については、ステートレス MIG とステートフル MIG をご覧ください。
    3. [名前] に「first-example-ig」と入力します。
    4. [ロケーション] で [シングルゾーン] を選択します。
    5. [リージョン] で、使用するリージョンを選択します。この例では us-east1 を使用しています。
    6. [ゾーン] で、[us-east1-b] を選択します。
    7. [インスタンス テンプレート] で、インスタンス テンプレート lb-backend-template を選択します。
    8. [インスタンスの最大数] に「2」と入力します。
    9. [自動スケーリング モード] で [Off:do not autoscale] を選択します。
    10. [作成] をクリックします。

このようなマネージド インスタンス グループをもう 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-12 \
       --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" \
         http://metadata.google.internal/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 が識別されます。

コンソール

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

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 \
    --network-tier=PREMIUM \
    --global

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

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

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

Console

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

gcloud

  1. ヘルスチェックを作成します。
        gcloud compute health-checks create http http-basic-check \
            --port 80
        
  2. 最初のバックエンド サービスを作成します。
    • グローバル外部アプリケーション ロードバランサの場合は、load-balancing-scheme=EXTERNAL_MANAGED を指定して gcloud CLI コマンドを使用します。この設定では、高度なトラフィック管理機能が提供されます。
    • 従来のアプリケーション ロードバランサの場合は、load-balancing-scheme=EXTERNAL を使用します。
        gcloud compute backend-services create service-a \
            --load-balancing-scheme=LOAD_BALANCING_SCHEME \
            --global-health-checks \
            --protocol HTTP \
            --health-checks http-basic-check \
            --global
        
  3. 2 つ目のバックエンド サービスを作成します。
        gcloud compute backend-services create service-b \
            --load-balancing-scheme=LOAD_BALANCING_SCHEME \
            --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

Google 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: /?ABTest=A
      service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a
      expectedOutputUrl: http://example.com/?ABTest=A
    - description: Test routing for query ABTest with B
      host: example.com
      path: /?ABTest=B
      service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-b
      expectedOutputUrl: http://example.com/?ABTest=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
    

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

Console

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

gcloud

  1. URL マップにリクエストをルーティングするターゲット HTTP プロキシを作成します。
        gcloud compute target-http-proxies create http-lb-proxy \
            --url-map web-map-http
        
  2. 受信リクエストをプロキシにルーティングするグローバル転送ルールを作成します。
    • グローバル外部アプリケーション ロードバランサの場合は、load-balancing-scheme=EXTERNAL_MANAGED を指定して gcloud CLI コマンドを使用します。この設定では、高度なトラフィック管理機能が提供されます。
    • 従来のアプリケーション ロードバランサの場合は、load-balancing-scheme=EXTERNAL を使用します。
        gcloud compute forwarding-rules create http-content-rule \
            --load-balancing-scheme=LOAD_BALANCING_SCHEME \
            --network-tier=PREMIUM \
            --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 ヘッダーを追加および削除して、インテリジェントなルーティングを行います。

始める前に

既存の外部アプリケーション ロードバランサを使用することも、新しい外部ロードバランサを作成することもできます。

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

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

URL マップの更新

Console

Google 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: example.com
      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: example.com
      path: /
      headers:
      - name: ABTest
        value: B
      service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/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
    

テスト

関連付けられたロードバランサの IPv4 アドレスを使用して次のコマンドを実行し、この設定をテストします。

curl http://IP_ADDRESS -H "ABTest: A"
curl http://IP_ADDRESS -H "ABTest: B"

次のステップ