ハイブリッド デプロイ用にネットワーク エッジ サービスを設定する

Google は、オンプレミスのデータセンターや他のパブリック クラウドなどにある、Google Cloud 以外をベースとするサービス(オンプレミスとマルチクラウド サービス)の機能とセキュリティを強化する、さまざまなネットワーク エッジ サービスを提供しています。

これらのネットワーク エッジ サービスでは、次のことができます。

  • 単一のエニーキャスト VIP を使用して、外部からのお客様のトラフィックを受け入れ、ルーティングする。

  • 外部アプリケーション ロードバランサGoogle マネージド SSL 証明書を使用してエッジで TLS トラフィックを終了することで、サーバーの負荷を軽減する。

  • 事前構成されたウェブ アプリケーション ファイアウォール(WAF)ルールを有効にし、Google Cloud Armor を使用して、受信トラフィックの許可リストと拒否リストを適用する。

  • Identity-Aware Proxy(IAP) でアプリケーションやリソースへのユーザー アクセスを制御する。

  • Cloud CDN を使用してコンテンツ配信とエンドユーザーのレイテンシを最適化する。

ネットワーク エッジ サービスの例。
ネットワーク エッジ サービスの例(クリックして拡大)

こうしたメリットを、プライベート、オンプレミス、マルチクラウドのサービスで享受するために、公共のインターネットからトラフィックを受信する外部アプリケーション ロードバランサをデプロイします。外部アプリケーション ロードバランサは、Traffic Director が構成する中間プロキシにトラフィックを転送します。この中間プロキシは、Cloud VPN または Cloud Interconnect を使用して、オンプレミス環境または Google Cloud 以外の環境にトラフィックをルーティングします。

このチュートリアルでは、Google のエッジで Google Cloud Armor を使用し、クライアントがオンプレミス サービスに非公開でアクセスすることを選択的に許可するためのエンドツーエンドの例について説明します。クライアントは IP アドレスに基づいてアクセスを許可されます。

次のタスクを実行します。

  1. マネージド インスタンス グループ(MIG)に中間プロキシとして Envoy をデプロイします。この Envoy プロキシは自動的に Traffic Director に接続されます。
  2. シミュレートされたプライベートのオンプレミス仮想マシン(VM)インスタンスを作成します。実際の例ではほとんどの場合、オンプレミス VM がすでに存在します。
  3. Traffic Director を構成して、中間プロキシに到達するすべてのリクエストが、シミュレートされたオンプレミス VM へ転送されるようにします。
  4. 公共のインターネットからトラフィックを受信して中間プロキシに転送する、外部アプリケーション ロードバランサを作成します。
  5. 外部アプリケーション ロードバランサに Google Cloud Armor セキュリティ ポリシーを接続します。

これらのタスクを完了したら、必要に応じて、追加のエッジサービスと高度なトラフィック管理機能を設定できます。

前提事項

中間プロキシを設定する前に、次の作業を行ってください。

  • Envoy を使用した Traffic Director の設定の準備を確認し、前提条件のタスクをすべて完了します。これには、必要な権限とロールの付与と Traffic Director API の有効化が含まれます。

  • プライベートのオンプレミス エンドポイントが、Cloud VPN や Cloud Interconnect を使用して Google Cloud Virtual Private Cloud(VPC)ネットワーク内から到達可能となるようにしてください。このチュートリアルの例では、単に Google Cloud 内のエンドポイントにトラフィックを転送するだけで、それに合わせてハイブリッド接続を構成する必要はありません。実際のデプロイ シナリオでは、ハイブリッド接続を構成する必要があります。

  • VPC サブネットの CIDR 範囲がリモートの CIDR 範囲と競合しないようにしてください。IP アドレスが重複する場合、リモート接続よりもサブネット ルートが優先されます。

  • このデモを行うため、Google Cloud Armor セキュリティ ポリシーの作成と更新に必要な権限を取得します。Cloud CDN など、別のサービスを使用する場合は、権限が異なる場合があります。

中間プロキシを Compute Engine VM にデプロイする

このセクションでは、Envoy を Compute Engine の中間プロキシとしてデプロイし、外部ロードバランサからトラフィックを受信してリモートの宛先に転送する方法について説明します。

中間プロキシのインスタンス テンプレートを作成する

インスタンス テンプレートは、マネージド インスタンス グループ(MIG)内の VM の構成を指定します。

  1. 次のテンプレートを使用して、Traffic Director に接続された Envoy プロキシを持つ VM インスタンスを作成します。

    gcloud compute instance-templates create td-middle-proxy \
        --service-proxy=enabled \
        --tags=allow-hc
    
  2. ネットワーク名の指定、ログパスの設定、トレースの有効化など、Envoy のデプロイをカスタマイズするには、Envoy の自動デプロイ オプション ガイドをご覧ください。

中間プロキシの MIG を作成する

  1. テンプレートに基づく MIG を作成します。この例では、インスタンス グループのサイズを 1 に固定して、単一インスタンスをデプロイします。本番環境で使用する場合は、たとえば CPU 使用率に基づいて自動スケーリングを有効にすると、中間プロキシが大量のトラフィックを処理する必要がある場合にボトルネックを回避できます。

    gcloud compute instance-groups managed create td-middle-proxy-us-central1-a \
        --zone=us-central1-a \
        --template=td-middle-proxy \
        --size=1
    
  2. 今後の構成と検証を行うために、インスタンスの内部 IP アドレスを特定して、MIDDLE_PROXY_IP に保存します。

    MIDDLE_PROXY_IP=$(gcloud compute instances list \
        --filter="name~'td-middle-proxy-us-central1-a-.*'" \
        --zones=us-central1-a \
        --format="value(networkInterfaces.networkIP)")
    

この例では、us-central1-a で Envoy を実行している VM インスタンスを含む MIG を作成します。このチュートリアルの後半では、クライアントからの公共のインターネット トラフィックを処理する外部ロードバランサを作成します。

外部ロードバランサは、クライアントに最も近いリージョンと、そのリージョン内の MIG にトラフィックを自動的にルーティングできます。そのため、複数の MIG を作成することを検討してください。Google Cloud で使用可能なリージョンとゾーンの完全な一覧については、リージョンとゾーンをご覧ください。

シミュレートされたオンプレミス サービスをデプロイする

このセクションでは、ハイブリッド接続ネットワーク エンドポイント グループ(NEG)のデプロイについて説明します。本番環境のデプロイでは、この NEG にはオンプレミス サーバーに解決されるエンドポイント(IP:port)が含まれます。この例では、IP:port で到達可能な Compute Engine VM を作成します。この VM はシミュレートされたオンプレミス サーバーとして機能します。

シミュレートされたオンプレミス VM を作成する

  1. 単一の VM インスタンスをデプロイして、プライベートのオンプレミス サーバーをシミュレートします。

    gcloud compute instances create on-prem-vm \
        --zone=us-central1-a \
        --metadata startup-script='#! /bin/bash
    ## Installs apache and a custom homepage
    sudo su -
    apt-get update
    apt-get install -y apache2
    cat <<EOF > /var/www/html/index.html
    <html><body><h1>Hello world from on-premises!</h1></body></html>
    EOF'
    
  2. 今後の構成と検証のために、その内部 IP アドレスを特定して保存します。この VM 上のサーバーは、ポート 80 で受信リクエストをリッスンします。

    ON_PREM_IP=$(gcloud compute instances describe on-prem-vm \
        --zone=us-central1-a \
        --format="value(networkInterfaces.networkIP)" | sed "s/['\[\]]*//g")
    

NEG を作成する

non-gcp-private-ip-port ネットワーク エンドポイント タイプを指定して、デモ設定用に NEG を作成します。シミュレートされたオンプレミス VM の IP アドレスとポートを、この NEG のエンドポイントとして追加します。前述の手順を行うと、IP アドレスが ON_PREM_IP 環境変数に格納されます。

  1. NEG を作成します。

    gcloud compute network-endpoint-groups create td-on-prem-neg \
        --network-endpoint-type=non-gcp-private-ip-port \
        --zone=us-central1-a
    
  2. IP:port を新しい NEG に追加します。

    gcloud compute network-endpoint-groups update td-on-prem-neg \
        --zone=us-central1-a \
        --add-endpoint="ip=$ON_PREM_IP,port=80"
    

Cloud Load Balancing コンポーネントを使用して Traffic Director を構成する

このセクションでは、Traffic Director の構成し、中間プロキシが非公開のオンプレミス サービスにトラフィックを転送できるようにする方法を説明します。次のコンポーネントを構成します。

  • ヘルスチェック。このヘルスチェックは、他の NEG タイプに構成されたヘルスチェックとは少し異なる動きをします。

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

  • ルーティング ルール マップ。このステップには、転送ルール、ターゲット プロキシ、URL マップの作成が含まれます。詳細については、ルーティング ルールマップをご覧ください。

ヘルスチェックを作成する

ヘルスチェックは、エンドポイントが正常であり、リクエストを受信できることを確認します。このタイプの NEG のヘルスチェックでは、Envoy の分散ヘルスチェック メカニズムが使用されます。

他の NEG タイプでは、Google Cloud の一元化されたヘルスチェック システムが使用されます。

gcloud compute health-checks create http td-on-prem-health-check

バックエンド サービスを作成する

  1. バックエンド サービスは、Traffic Director で使用する INTERNAL_SELF_MANAGED 負荷分散方式を使用して作成します。このバックエンド サービスを作成するときに、先ほど作成したヘルスチェックを指定します。

    gcloud compute backend-services create td-on-prem-backend-service \
        --global \
        --load-balancing-scheme=INTERNAL_SELF_MANAGED \
        --health-checks=td-on-prem-health-check
    
  2. 先ほど作成した NEG をこのバックエンド サービスのバックエンドとして追加します。

    gcloud compute backend-services add-backend td-on-prem-backend-service \
        --global \
        --network-endpoint-group=td-on-prem-neg \
        --network-endpoint-group-zone=us-central1-a \
        --balancing-mode=RATE \
        --max-rate-per-endpoint=5
    

ルーティング ルール マップを作成する

ルーティング ルール マップは、Traffic Director がトラフィックをバックエンド サービスに転送する方法を定義します。

  1. 先ほど定義したバックエンド サービスを使用する URL マップを作成します。

    gcloud compute url-maps create td-hybrid-url-map \
        --default-service=td-on-prem-backend-service
    
  2. 次の内容のファイルを、target_proxy.yaml という名前で作成します。

    name: td-hybrid-proxy
    proxyBind: true
    urlMap: global/urlMaps/td-hybrid-url-map
    
  3. import コマンドを使用してターゲット HTTP プロキシを作成します(詳細については、Traffic Director のターゲット プロキシをご覧ください)。

    gcloud compute target-http-proxies import td-hybrid-proxy \
        --source=target_proxy.yaml
    
  4. このターゲット HTTP プロキシを参照する転送ルールを作成します。 転送ルールの IP アドレスを 0.0.0.0 に設定します。ルールの IP アドレスを 0.0.0.0 に設定すると、受信ポート、HTTP ホスト名、URL マップで構成されているパス情報に基づいてトラフィックがルーティングされます。HTTP リクエストで指定された IP アドレスは無視されます。

    gcloud compute forwarding-rules create td-hybrid-forwarding-rule \
        --global \
        --load-balancing-scheme=INTERNAL_SELF_MANAGED \
        --address=0.0.0.0 \
        --target-http-proxy=td-hybrid-proxy \
        --ports=8080 \
        --network=default
    

シミュレートされたオンプレミス サービスに中間プロキシがリクエストをルーティングできることを確認する

Traffic Director は、中間プロキシを経由してシミュレートされたオンプレミス サービスにトラフィックを転送するように構成されました。この構成を確認するには、テスト クライアント VM を作成して、その VM にログインし、Envoy を実行している中間プロキシにリクエストを送信します。構成を確認したら、テスト クライアント VM を削除します。

  1. 中間プロキシの IP アドレスを取得します。この情報は、確認の手順だけで必要になります。

    gcloud compute instances list
    
  2. td-middle-proxy-us-central1-a MIG 内のインスタンスの IP アドレスを書き留めるか、別の方法で記録します。

  3. テスト クライアント インスタンスを作成します。

    gcloud compute instances create test-client \
        --zone=us-central1-a
    
  4. ssh を使用して、テスト クライアントにログインします。

    gcloud compute ssh test-client
        --zone=us-central1-a
    
  5. 中間プロキシ VM にリクエストを送信します。MIDDLE_PROXY_IP は、先ほど取得した IP アドレスに置き換えます。

    curl $MIDDLE_PROXY_IP:8080
    

    次の出力が表示されます。

    Hello world from on-premises!
    
  6. テスト クライアント VM を終了します。終了したら、VM を削除できます。

    gcloud compute instances delete test-client \
        --zone=us-central1-a
    

外部アプリケーション ロードバランサをデプロイする

このセクションでは、受信トラフィックを中間プロキシに送信する外部アプリケーション ロードバランサをデプロイします。このデプロイは、標準の外部アプリケーション ロードバランサの設定です。

外部 IP アドレスを予約する

外部クライアントがトラフィックを送信するグローバル静的外部 IP アドレス(external-lb-vip)を作成します。この外部 IP アドレスは、このチュートリアルの後半の確認手順で取得します。

gcloud compute addresses create external-lb-vip \
    --ip-version=IPV4 \
    --global

外部 HTTP ロードバランサを設定する

構成済みの中間プロキシにインターネットのお客様のトラフィックをルーティングするように外部ロードバランサを構成します。

  1. 中間プロキシを実行する MIG が正常で、かつ、トラフィックを受信できるかどうかを判断するために使用するヘルスチェックを作成します。

    gcloud compute health-checks create tcp tcp-basic-check \
        --port=8080
    
  2. ヘルスチェックを許可するファイアウォール ルールを作成します。ここで allow-hc タグを再利用して、中間プロキシ VM にファイアウォール ルールを適用します。

    gcloud compute firewall-rules create fw-allow-health-checks \
        --network=default \
        --action=ALLOW \
        --direction=INGRESS \
        --source-ranges=35.191.0.0/16,130.211.0.0/22 \
        --target-tags=allow-hc \
        --rules=tcp
    
  3. バックエンド サービスを作成します。

    gcloud compute backend-services create td-middle-proxy-backend-service \
        --protocol=HTTP \
        --health-checks=tcp-basic-check \
        --global
    
  4. 中間プロキシ MIG をバックエンドとしてこのバックエンド サービスに追加します。

    gcloud compute backend-services add-backend td-middle-proxy-backend-service \
        --instance-group=td-middle-proxy-us-central1-a \
        --instance-group-zone=us-central1-a \
        --global
    
  5. デフォルトのバックエンド サービスとして中間プロキシに受信リクエストをルーティングする URL マップを作成します。

    gcloud compute url-maps create lb-map-http \
        --default-service=td-middle-proxy-backend-service
    
  6. 外部ロードバランサの転送ルール仮想 IP アドレス(VIP)へのリクエストを URL マップに従って処理するように、ターゲット HTTP プロキシを作成します。

    gcloud compute target-http-proxies create http-lb-proxy \
        --url-map=lb-map-http
    
  7. 受信リクエストをターゲット HTTP プロキシに転送するグローバル転送ルールを作成します。

    gcloud compute forwarding-rules create http-forwarding-rule \
        --address=external-lb-vip\
        --global \
        --load-balancing-scheme=EXTERNAL \
        --target-http-proxy=http-lb-proxy \
        --ports=80
    

MIG の名前付きポートを設定する

インスタンス グループに名前付きポートを設定して、中間プロキシが外部ロードバランサから HTTP トラフィックを受信できるようにします。

gcloud compute instance-groups managed set-named-ports td-middle-proxy-us-central1-a \
    --named-ports=http:8080 \
    --zone=us-central1-a

外部アプリケーション ロードバランサの構成を確認する

この手順では、外部ロードバランサが正しく設定されていることを確認します。

  1. ロードバランサの VIP にリクエストを送信すると、シミュレートされたオンプレミス VM からレスポンスを受信できるはずです。

    PUBLIC_VIP=gcloud compute addresses describe external-lb-vip \
        --format="get(address)" \
        --global
    
  2. パブリック IP アドレスに curl リクエストを送信して、Hello world メッセージを受信することを確認します。

    curl $PUBLIC_VIP
    

    次の出力が表示されます。

    Hello world from on-premises!
    

Google Cloud Armor を有効にする

Google Cloud Armor セキュリティ ポリシーを構成して、CLIENT_IP_RANGE からサービスへのアクセスのみを許可します。これには、テスト対象のクライアント デバイスのパブリック IP アドレス(例: "192.0.2.0/24")を含める必要があります。

これらのポリシーは、外部ロードバランサのバックエンド サービス(この例では、中間プロキシを指す td-hybrid-backend-service)に適用されます。これらのルールの設定に必要な権限については、Google Cloud Armor セキュリティ ポリシーの構成をご覧ください。

  1. Google Cloud Armor セキュリティ ポリシーを作成します。

    gcloud compute security-policies create external-clients-policy \
        --description="policy for external clients"
    
  2. セキュリティ ポリシーのデフォルト ルールを更新し、すべてのトラフィックを拒否します。

    gcloud compute security-policies rules update 2147483647 \
        --security-policy=external-clients-policy \
        --action="deny-404"
    
  3. 特定の IP 範囲からのトラフィックを許可するために、優先度の高いルールを追加します。

    gcloud compute security-policies rules create 1000 \
        --security-policy=external-clients-policy \
        --description="allow traffic from CLIENT_IP_RANGE" \
        --src-ip-ranges="CLIENT_IP_RANGE" \
        --action="allow"
    
  4. Google Cloud Armor セキュリティ ポリシーをバックエンド サービスに接続します。

    gcloud compute backend-services update td-middle-proxy-backend-service \
        --security-policy=external-clients-policy
    

最終確認

  1. 外部アプリケーション ロードバランサのパブリック仮想 IP アドレスに curl リクエストを発行します。クライアント デバイスの IP アドレスが、先ほど指定された CLIENT_IP_RANGE の範囲内にあれば、想定されるレスポンスが返されます。

    curl $PUBLIC_VIP
    

    次の出力が表示されます。

    Hello world from on-premises!
    
  2. IP アドレスが CLIENT_IP_RANGE の外部にある別のクライアント デバイスに同じ curl リクエストを発行するか、セキュリティ ポリシーのルールを更新してクライアント IP アドレスを含めないようにします。今度は、404 Not Found エラーが返されるはずです。

トラブルシューティング

オンプレミス サービスに、グローバル外部アプリケーション ロードバランサの IP アドレスを介してアクセスできない

Envoy を実行している Google Cloud VM でオンプレミス サービスがすでにアクセスできる場合は、次の手順に沿って設定のトラブルシューティングを行います。

  1. Google Cloud Envoy MIG が正常と報告されていることを確認します。Google Cloud Console で [ネットワーク サービス] > [ロード バランシング] に移動し、[url-map lb-map-http] をクリックして詳細を表示します。td-middle-proxy-us-central1-a で 1/1 のインスタンスが正常であることを確認できるはずです。

  2. 正常な状態でない場合は、Envoy を実行している Google Cloud VM への上り(内向き)トラフィックを許可するようにファイアウォール ルールが構成されているかどうかを確認します。

    gcloud compute firewall-rules describe fw-allow-health-check
    

    次の出力が表示されます。

    allowed:
    ‑ IPProtocol: tcp
    ...
    direction: INGRESS
    disabled: false
    ...
    ...
    sourceRanges:
    ‑ 130.211.0.0/22
    ‑ 35.191.0.0/16
    targetTags:
    ‑ allow-hc
    

次のステップ