Private Service Connect とハイブリッド NEG と内部 HTTP(S) ロードバランサを使用して、ハイブリッド ネットワーキング経由でオンプレミス サービスに接続する

1. はじめに

Cloud Load Balancing は、オンプレミス データセンターや他のパブリック クラウドなどの Google Cloud の外部に拡張され、ハイブリッド接続で到達可能なエンドポイントへのトラフィックをロード バランシングできます。

ハイブリッド戦略は、変化する市場の要求に応じて、アプリケーションを段階的にモダナイズするための実際的なソリューションです。これは、最新のクラウドベースのソリューションに移行するための、一時的なハイブリッド デプロイメントの場合もあれば、組織の IT インフラストラクチャの恒久的な設備の場合もあります。

ハイブリッド ロード バランシングを設定すると、Google Cloud の外部にある既存のインフラストラクチャで実行されているサービスでも Cloud Load Balancing のネットワーク機能のメリットを活用できます。

ハイブリッド サービスを他の VPC ネットワークで利用できるようにするには、Private Service Connect を使用してサービスを公開します。内部リージョン HTTP(S) ロードバランサの前にサービス アタッチメントを配置することで、他の VPC ネットワーク内のクライアントが、オンプレミスまたは他のクラウド環境で実行されている ハイブリッド サービスに到達できるようになります。

作成するアプリの概要

この Codelab では、ネットワーク エンドポイント グループを使用してオンプレミス サービスへのハイブリッド接続を備えた内部 HTTP(S) ロードバランサを構築します。コンシューマー VPC はポート 80 を使用してオンプレミス サービスと通信できます。ポート 443 はこの Codelab の範囲外です。

4ad647fa51b3473e.png

学習内容

  • ハイブリッド NEG バックエンドを使用して内部 HTTP(S) ロードバランサを作成する方法
  • Private Service Connect プロデューサー(サービス アタッチメント)とコンシューマー(転送ルール)を確立する方法

必要なもの

  • 確立されたハイブリッド ネットワーキング(HA VPN、相互接続、SW-WAN など)
  • Google Cloud プロジェクト

ハイブリッド接続を確立する

オンプレミスまたは他のクラウド環境と Google Cloud を接続するには、Cloud Router とともに Cloud Interconnect VLAN アタッチメントまたは Cloud VPN トンネルを使用して、ハイブリッド接続を確立する必要があります。高可用性接続の使用をおすすめします。

グローバル動的ルーティングが有効になっている Cloud Router は、BGP を介して特定のエンドポイントを学習し、Google Cloud VPC ネットワークにプログラムします。リージョン動的ルーティングはサポートされていません。静的ルートもサポートされていません。

Cloud Interconnect または Cloud VPN の構成に使用する Google Cloud VPC ネットワークは、ハイブリッド ロード バランシング デプロイの構成に使用するネットワークと同じです。VPC ネットワークのサブネットの CIDR 範囲がリモートの CIDR 範囲と競合しないようにしてください。IP アドレスが重複する場合、リモート接続よりもサブネット ルートが優先されます。

手順については、次をご覧ください。

カスタムルート アドバタイズ

次のサブネットでは、オンプレミス ネットワークへの Cloud Router からのカスタム アドバタイズが必要になります。これにより、オンプレミス ファイアウォール ルールが更新されます。

サブネット

説明

172.16.0.0/23

オンプレミス サービスとの直接通信に使用されるプロキシ サブネット

130.211.0.0/22、35.191.0.0/16

Google Cloud Health Check

2. 始める前に

Codelab をサポートするようにプロジェクトを更新する

この Codelab では、$変数を使用して、Cloud Shell での gcloud 構成の実装を支援します。

Cloud Shell で次の操作を行います。

gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
psclab=YOUR-PROJECT-NAME
echo $psclab

3. プロデューサーのセットアップ

プロデューサー VPC を作成する

Cloud Shell で次の操作を行います。

gcloud compute networks create producer-vpc --project=$psclab --subnet-mode=custom

プロデューサー サブネットを作成する

Cloud Shell で次の操作を行います。

gcloud compute networks subnets create subnet-201 --project=$psclab --range=10.10.1.0/24 --network=producer-vpc --region=us-central1
gcloud compute networks subnets create subnet-202 --project=$psclab --range=10.20.1.0/24 --network=producer-vpc --region=us-central1

内部ロードバランサの IP アドレスを予約する

Cloud Shell で次の操作を行います。Private Service Connect では SHARED_VIP はサポートされていません。代わりに GCE_ENDPOINT を使用してください。

gcloud compute addresses create lb-ip \
    --region=us-central1 \
    --subnet=subnet-202 \
    --purpose=GCE_ENDPOINT

割り振られた IP アドレスを表示するには、compute addresses describe コマンドを使用します。

gcloud compute addresses describe lb-ip  --region=us-central1 | grep address:

リージョン プロキシ サブネットを作成する

プロキシの割り当ては、ロードバランサ レベルではなく VPC レベルで行われます。Envoy ベースのロードバランサを使用する仮想ネットワーク(VPC)の各リージョンに、プロキシ専用サブネット を 1 つ作成する必要があります。同じリージョンおよび同じ VPC ネットワーク内に複数のロードバランサをデプロイすると、ロード バランシング用に同じプロキシ専用サブネットが共有されます。

  1. クライアントは、ロードバランサの転送ルールの IP アドレスとポートに接続します。
  2. 各プロキシは、対応するロードバランサの転送ルールで指定された IP アドレスとポートでリッスンします。いずれかのプロキシがクライアントのネットワーク接続を受信して終了します。
  3. プロキシは、NEG 内の適切なバックエンド VM またはエンドポイントと接続を確立します。これは、ロードバランサの URL マップとバックエンド サービスによって決まります。

ネットワークが自動モードかカスタムモードかに関係なく、プロキシ専用サブネットを作成する必要があります。プロキシ専用サブネットでは 64 個以上の IP アドレスを指定する必要があります。これは /26 以下のプレフィックス長に対応します。推奨されるサブネット サイズは /23 です(512 個のプロキシ専用アドレス)。

Cloud Shell で次の操作を行います。

gcloud compute networks subnets create proxy-subnet-us-central \
  --purpose=REGIONAL_MANAGED_PROXY \
  --role=ACTIVE \
  --region=us-central1 \
  --network=producer-vpc \
  --range=172.16.0.0/23

Private Service Connect NAT サブネットを作成する

Private Service Connect で使用する専用サブネットを 1 つ以上作成します。Google Cloud コンソールを使用してサービスを公開する場合、その作業中にサブネットを作成できます。サービスのロードバランサと同じリージョンにサブネットを作成します。通常のサブネットを Private Service Connect サブネットに変換することはできません。

Cloud Shell で次の操作を行います。

gcloud compute networks subnets create psc-nat-subnet --network=producer-vpc --region=us-central1 --range=100.100.10.0/24 --purpose=private-service-connect

プロデューサー ファイアウォール ルールを作成する

Private Service Connect エンドポイントとサービス アタッチメント間のトラフィックを許可する ファイアウォール ルールを構成します。この Codelab では、NAT サブネット 100.100.10.0/24 が Private Service Connect サービス アタッチメント(内部ロードバランサ)にアクセスできるようにする上り(内向き)ファイアウォール ルールを作成しました。

Cloud Shell で次の操作を行います。

gcloud compute --project=$psclab firewall-rules create allow-to-ingress-nat-subnet --direction=INGRESS --priority=1000 --network=producer-vpc --action=ALLOW --rules=all --source-ranges=100.100.10.0/24

Cloud Shell 内で、Google Cloud ヘルスチェックが TCP ポート 80 でオンプレミス サービス(バックエンド サービス)に到達できるように fw-allow-health-check ルールを作成します。

gcloud compute firewall-rules create fw-allow-health-check \
    --network=producer-vpc \
    --action=allow \
    --direction=ingress \
    --source-ranges=130.211.0.0/22,35.191.0.0/16 \
    --rules=tcp:80

ロードバランサが TCP ポート 80 でバックエンド インスタンスと通信することを許可するプロキシ専用サブネットの上り(内向き)許可ファイアウォール ルールを作成します。

gcloud compute firewall-rules create fw-allow-proxy-only-subnet \
    --network=producer-vpc \
    --action=allow \
    --direction=ingress \
    --source-ranges=172.16.0.0/23 \
    --rules=tcp:80

ハイブリッド接続 NEG を設定する

NEG を作成するときは、Google Cloud とオンプレミスまたは他のクラウド環境との間の地理的距離を最小限に抑える ZONE を使用します。たとえば、ドイツのフランクフルトのオンプレミス環境にサービスをホストする場合、NEG を作成するときに europe-west3-a Google Cloud ゾーンを指定できます。

また、Cloud Interconnect を使用している場合は、NEG の作成に使用するゾーンは、Cloud Interconnect 相互接続のアタッチメントが構成されているリージョンに存在している必要があります。

使用可能なリージョンとゾーンについては、Compute Engine のドキュメント: 使用可能なリージョンとゾーンをご覧ください。

Cloud Shell 内で、gcloud compute network-endpoint-groups create コマンドを使用してハイブリッド接続 NEG を作成します。

gcloud compute network-endpoint-groups create on-prem-service-neg \
    --network-endpoint-type=NON_GCP_PRIVATE_IP_PORT \
    --zone=us-central1-a \
    --network=producer-vpc

Cloud Shell 内で、オンプレミス IP:Port エンドポイントをハイブリッド NEG に追加します。

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

ロードバランサを構成する

次の手順では、ロードバランサ(転送ルール)を構成し、ネットワーク エンドポイント グループに関連付けます。

Cloud Shell 内で、オンプレミス サービスに渡されるリージョン ヘルスチェックを作成します。

gcloud compute health-checks create http http-health-check \
    --region=us-central1 \
    --use-serving-port

Cloud Shell 内で、ハイブリッド NEG を利用するオンプレミス バックエンドのバックエンド サービスを作成します。

 gcloud compute backend-services create on-premise-service-backend \
      --load-balancing-scheme=INTERNAL_MANAGED \
      --protocol=HTTP \
      --health-checks=http-health-check \
      --health-checks-region=us-central1 \
      --region=us-central1

Cloud Shell で、ハイブリッド NEG バックエンドをバックエンド サービスに追加します。RATE の場合は、バックエンドで処理する最大レートを入力します。

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

Cloud Shell で、受信リクエストをバックエンド サービスに転送するための URL マップを作成します。

gcloud compute url-maps create on-prem-svc-url-map \
    --default-service on-premise-service-backend \
    --region=us-central1

HTTP ターゲット プロキシを作成する

gcloud compute target-http-proxies create proxy-subnet-us-central\
    --url-map=on-prem-svc-url-map \
    --url-map-region=us-central1 \
    --region=us-central1

受信リクエストをプロキシに転送する転送ルールを作成します。転送ルールの作成には、プロキシ専用サブネットを使用しないでください。

 gcloud compute forwarding-rules create http-hybrid-neg-fwd-rule \
      --load-balancing-scheme=INTERNAL_MANAGED \
      --network=producer-vpc \
      --subnet=subnet-202 \
      --address=lb-ip \
      --ports=80 \
      --region=us-central1 \
      --target-http-proxy=proxy-subnet-us-central \
      --target-http-proxy-region=us-central1

4. ロードバランサを検証する

Cloud コンソールで、[ネットワーク サービス] → [ロード バランシング] → [ロードバランサ] に移動します。1 つの NEG が「緑」で、オンプレミス サービスへのヘルスチェックが成功したことを示しています。

bb5d117dee3b8b04.png

[‘on-premise-svc-url-map'] を選択すると、フロントエンドの IP アドレスが表示され、バックエンド サービスが特定されます。

128a7e85e8069097.png

5. オンプレミスから学習したルートを表示する

[VPC Network → Routes] に移動します。学習したオンプレミス サービス サブネット 192.168.1.0/27

d1ab51b79aeea9d8.png

6. オンプレミス サービスへの接続を検証する

プロデューサー VPC から VM を作成してオンプレミス サービスへの接続をテストします。その後、サービス アタッチメントを構成します。

Cloud Shell 内で、プロデューサー VPC にテスト インスタンスを作成します。

gcloud compute instances create test-box-us-central1 \
    --zone=us-central1-a \
    --image-family=debian-10 \
    --image-project=debian-cloud \
    --subnet=subnet-201 \
    --no-address

IAP に VM インスタンスへの接続を許可するには、次のファイアウォール ルールを作成します。

  • IAP を使用してアクセス可能にするすべての VM インスタンスに適用されます。
  • IP 範囲 35.235.240.0/20 からの上り(内向き)トラフィックを許可します。この範囲には、IAP が TCP 転送に使用するすべての IP アドレスが含まれています。

Cloud Shell 内で、プロデューサー VPC にテスト インスタンスを作成します。

gcloud compute firewall-rules create ssh-iap \
    --network producer-vpc \
    --allow tcp:22 \
    --source-ranges=35.235.240.0/20

Cloud Shell で IAP を使用して test-box-us-central1 にログインし、ロードバランス IP アドレスに対して curl を実行して、オンプレミス サービスへの接続を確認します。タイムアウトした場合は再試行します。

gcloud compute ssh test-box-us-central1 --project=$psclab --zone=us-central1-a --tunnel-through-iap

オンプレミス サービスへの接続を検証する curl を実行します。検証が完了したら、VM を終了して Cloud Shell プロンプトに戻ります。ステップ 4 で特定した出力に基づいて、内部ロードバランサの IP を置き換えます。

user@test-box-us-central1:~$ curl -v 10.20.1.2
* Expire in 0 ms for 6 (transfer 0x55b7725c10f0)
*   Trying 10.20.1.2...
* TCP_NODELAY set
* Expire in 200 ms for 4 (transfer 0x55b7725c10f0)
* Connected to 10.20.1.2 (10.20.1.2) port 80 (#0)
> GET / HTTP/1.1
> Host: 10.20.1.2
> User-Agent: curl/7.64.0
> Accept: */*
> 
< HTTP/1.1 200 OK
< content-type: text/html; charset=utf-8
< accept-ranges: bytes
< etag: "3380914763"
< last-modified: Mon, 05 Dec 2022 15:10:56 GMT
< expires: Mon, 12 Dec 2022 03:17:20 GMT
< cache-control: max-age=0
< content-length: 37
< date: Mon, 12 Dec 2022 03:17:20 GMT
< server: lighttpd/1.4.53
< via: 1.1 google
< 
Welcome to my on-premise service!!

7. Private Service Connect サービス アタッチメントを作成する

次の手順では、サービス アタッチメントを作成します。サービス アタッチメントがコンシューマー エンドポイントとペア設定されると、VPC ピアリングなしでオンプレミス サービスにアクセスできるようになります。

サービス アタッチメントを作成する

Cloud Shell 内でサービス アタッチメントを作成する

gcloud compute service-attachments create service-1 --region=us-central1 --producer-forwarding-rule=http-hybrid-neg-fwd-rule --connection-preference=ACCEPT_AUTOMATIC --nat-subnets=psc-nat-subnet

省略可: 共有 VPC を使用している場合は、サービス プロジェクトにサービス アタッチメントを作成します。

gcloud compute service-attachments create service-1 --region=us-central1 --producer-forwarding-rule=http-hybrid-neg-fwd-rule --connection-preference=ACCEPT_AUTOMATIC --nat-subnets=projects/<hostproject>/regions/<region>/subnetworks/<natsubnet>

TCP サービス アタッチメントを検証する

gcloud compute service-attachments describe service-1 --region us-central1

省略可: [ネットワーク サービス] → [Private Service Connect] に移動して、新しく確立されたサービス アタッチメントを表示します。

2f84578c9f2cc361.png

[Service-1] を選択すると、コンシューマーが Private Service Connection を確立するために使用するサービス アタッチメント URI など、詳細が表示されます。URI は後のステップで使用するため、メモしておきます。

41639cb160231275.png

サービス アタッチメントの詳細: projects/<projectname>/regions/us-central1/serviceAttachments/service-1

8. コンシューマーの設定

コンシューマー VPC を作成する

Cloud Shell で次の操作を行います。

gcloud compute networks create consumer-vpc --project=$psclab --subnet-mode=custom

コンシューマー サブネットを作成する

Cloud Shell 内で GCE サブネットを作成する

gcloud compute networks subnets create subnet-101 --project=$psclab --range=10.100.1.0/24 --network=consumer-vpc --region=us-central1

Cloud Shell 内でコンシューマー エンドポイント サブネットを作成する

gcloud compute networks subnets create subnet-102 --project=$psclab --range=10.100.2.0/24 --network=consumer-vpc --region=us-central1

コンシューマー エンドポイント(転送ルール)を作成する

Cloud Shell 内で、コンシューマー エンドポイントとして使用する静的 IP アドレスを作成します。

gcloud compute addresses create psc-consumer-ip-1 --region=us-central1 --subnet=subnet-102 --addresses 10.100.2.10

前に生成したサービス アタッチメント URI を使用して、コンシューマー エンドポイントを作成します。

Cloud Shell 内でコンシューマー エンドポイントを作成する

gcloud compute forwarding-rules create psc-consumer-1 --region=us-central1 --network=consumer-vpc --address=psc-consumer-ip-1 --target-service-attachment=projects/$psclab/regions/us-central1/serviceAttachments/service-1

9. コンシューマー Private Service Connect を検証する - コンシューマー VPC

コンシューマー VPC から、[ネットワーク サービス] → [Private Service Connect] → [接続されたエンドポイント] に移動して、Private Service Connection が成功したことを確認します。確立された psc-consumer-1 接続と、以前に作成した対応する IP アドレスをメモします。

b91ee5d5c854e60b.png

psc-consumer-1 を選択すると、サービス アタッチメント URI などの詳細が表示されます。

1dbc63217819dcd5.png

10. コンシューマー Private Service Connect - プロデューサー VPC を検証する

プロデューサー VPC から、[ネットワーク サービス → Private Service Connect → 公開サービス] に移動して、Private Service Connection が正常に作成されたことを確認します。公開された service-1 接続に、1 つの転送ルール(接続エンドポイント)が示されていることに注意してください。

951090b812a8d119.png

11. プライベート DNS ゾーンと A レコードを作成する

PSC 接続エンドポイントにマッピングされたプライベート DNS ゾーンを作成し、VPC 内の任意のホストからプロデューサーにシームレスにアクセスできるようにします。

Cloud Shell から

gcloud dns --project=$psclab managed-zones create codelab-zone --description="" --dns-name="codelab.net." --visibility="private" --networks="consumer-vpc"

gcloud dns --project=$psclab record-sets create service1.codelab.net. --zone="codelab-zone" --type="A" --ttl="300" --rrdatas="10.100.2.10"

12. VM を使用して、プロデューサー サービスへのコンシューマー アクセスを検証する

コンシューマー VPC から、コンシューマー エンドポイント service1.codelabs.net にアクセスして、オンプレミス サービスへの接続をテストする VM を作成します。

Cloud Shell 内で、コンシューマー VPC にテスト インスタンスを作成します。

gcloud compute instances create consumer-vm \
    --zone=us-central1-a \
    --image-family=debian-10 \
    --image-project=debian-cloud \
    --subnet=subnet-101 \
    --no-address

IAP に VM インスタンスへの接続を許可するには、次のファイアウォール ルールを作成します。

  • IAP を使用してアクセス可能にするすべての VM インスタンスに適用されます。
  • IP 範囲 35.235.240.0/20 からの上り(内向き)トラフィックを許可します。この範囲には、IAP が TCP 転送に使用するすべての IP アドレスが含まれています。

Cloud Shell 内で、コンシューマー VPC にテスト インスタンスを作成します。

gcloud compute firewall-rules create ssh-iap-consumer \
    --network consumer-vpc \
    --allow tcp:22 \
    --source-ranges=35.235.240.0/20

Cloud Shell で IAP を使用して consumer-vm にログインし、dns FQDN service1.codelab.net に対して curl を実行して、オンプレミス サービスへの接続を検証します。タイムアウトした場合は再試行します。

gcloud compute ssh consumer-vm --project=$psclab --zone=us-central1-a --tunnel-through-iap

オンプレミス サービスへの接続を検証する curl を実行します。検証が完了したら、VM を終了して Cloud Shell プロンプトに戻ります。

Cloud Shell 内で curl を実行します。

$ curl -v service1.codelab.net
*   Trying 10.100.2.10...
* TCP_NODELAY set
* Expire in 200 ms for 4 (transfer 0x5650fc3390f0)
* Connected to service1.codelab.net (10.100.2.10) port 80 (#0)
> GET / HTTP/1.1
> Host: service1.codelab.net
> User-Agent: curl/7.64.0
> Accept: */*
> 
< HTTP/1.1 200 OK
< Content-Type: text/html; charset=utf-8
< Accept-Ranges: bytes
< ETag: "3380914763"
< Last-Modified: Mon, 05 Dec 2022 15:10:56 GMT
< Expires: Mon, 05 Dec 2022 15:15:41 GMT
< Cache-Control: max-age=0
< Content-Length: 37
< Date: Mon, 05 Dec 2022 15:15:41 GMT
< Server: lighttpd/1.4.53
< 
Welcome to my on-premise service!!

以下はオンプレミス サービスからのキャプチャの例です。送信元 IP アドレス 172.16.0.13 は、プロキシ サブネット範囲 172.16.0.0/23 からのものであることに注意してください。

30802152f51ff751.png

13. プロデューサーのクリーンアップ

Producer コンポーネントを削除する

Cloud Shell 内で、プロデューサー VPC のテスト インスタンスを削除します。

gcloud compute instances delete test-box-us-central1 --zone=us-central1-a --quiet

gcloud compute service-attachments delete service-1 --region=us-central1 --quiet 

gcloud compute forwarding-rules delete http-hybrid-neg-fwd-rule --region=us-central1 --quiet

gcloud compute target-http-proxies delete proxy-subnet-us-central --region=us-central1 --quiet

gcloud compute url-maps delete on-prem-svc-url-map --region=us-central1 --quiet

gcloud compute backend-services delete on-premise-service-backend --region=us-central1 --quiet

gcloud compute network-endpoint-groups delete on-prem-service-neg --zone=us-central1-a --quiet

gcloud compute addresses delete lb-ip --region=us-central1 --quiet

gcloud compute networks subnets delete psc-nat-subnet subnet-201 subnet-202 proxy-subnet-us-central --region=us-central1 --quiet

gcloud compute firewall-rules delete ssh-iap fw-allow-proxy-only-subnet allow-to-ingress-nat-subnet fw-allow-health-check --quiet

gcloud compute health-checks delete http-health-check --region=us-central1 --quiet

gcloud compute networks delete producer-vpc --quiet

14. コンシューマーのクリーンアップ

Consumer コンポーネントを削除する

Cloud Shell 内で、コンシューマー VPC のテスト インスタンスを削除します。

gcloud compute instances delete consumer-vm --zone=us-central1-a --quiet

gcloud compute forwarding-rules delete psc-consumer-1 --region=us-central1 --quiet

gcloud compute addresses delete psc-consumer-ip-1 --region=us-central1 --quiet

gcloud compute networks subnets delete subnet-101 subnet-102 --region=us-central1 --quiet

gcloud compute firewall-rules delete ssh-iap-consumer --quiet

gcloud dns record-sets delete service1.codelab.net --type=A --zone=codelab-zone --quiet

gcloud dns managed-zones delete codelab-zone --quiet 

gcloud compute networks delete consumer-vpc --quiet 

15. 完了

おめでとうございます。内部 HTTP(S) ロードバランサを使用して Private Service Connect を構成し、検証しました。

プロデューサー インフラストラクチャを作成し、オンプレミス サービスを指すサービス アタッチメントをプロデューサー VPC に追加しました。コンシューマー VPC にコンシューマー エンドポイントを作成して、オンプレミス サービスへの接続を許可する方法について学習しました。

次のステップ

以下の Codelab をご覧ください。

参考資料と動画

リファレンス ドキュメント