サービス プロデューサーの Private Service Connect ポート マッピング

1. はじめに

Private Service Connect を使用すると、サービス プロデューサーはサービス アタッチメントを介して VPC 環境でサービスを公開し、別の VPC 環境のコンシューマーが Private Service Connect エンドポイントを介してこれらのサービスにアクセスできるようにします。これらのプロデューサー サービスは、VM のクラスタとして設計されることがあります。各 VM は、同じポート番号で同じサービスを公開します。以前は、これらのサービス設計では、コンシューマー側に複数の Private Service Connect エンドポイントをデプロイするか、プロデューサー側で IP 転送を使用して正しいプロデューサー VM がターゲットに設定されるようにする必要がありました。

Private Service Connect は、ポート マッピングを使用して正しい宛先をネイティブにターゲットにできるようになりました。このラボでは、この機能が必要となるユースケースと、ポート マッピング NEG を Private Service Connect ワークロードにデプロイする方法について学びます。

学習内容

  • Private Service Connect ポート マッピングのユースケース
  • PSC ポート マッピングの主なメリット
  • ネットワークの要件
  • ポート マッピングを使用して Private Service Connect プロデューサー サービスを作成します。
  • Private Service Connect エンドポイントを作成する
  • Private Service Connect エンドポイントを介してプロデューサー サービスを呼び出す

必要なもの

  • オーナー権限を持つ Google Cloud プロジェクト

2. Private Service Connect ポート マッピングのユースケース

ポート マッピング機能は、PSC ユースケース専用のポート マッピング NEG(ネットワーク エンドポイント グループ)を使用します。

ポート マッピングの使用のメリットを最も受けられるプロデューサーのタイプは、NoSQL データベース プロデューサーと Kafka プロデューサーです。ただし、特定の VM マッピング要件で同じサービスを同じポートで公開する VM クラスタを必要とするプロデューサーは、この機能を使用できます。

プロデューサーは、クライアント ポートとプロデューサー VM + 宛先ポート間のマッピングを定義します。プロデューサーは、この情報をコンシューマーと共有する必要があります。コンシューマーは、事前定義されたポートを使用して、到達する必要があるプロデューサー VM と宛先ポートを一意に識別します。コンシューマーが使用するポートは、プロデューサーが使用するポートとは異なります。

PSC ポート マッピングの主なメリット

  • シンプル: プロデューサーはポート マッピングを使用して PSC コンポーネントをデプロイし、コンシューマーは PSC エンドポイントをデプロイします。PSC はネットワーク アドレス変換を自動的に処理します。
  • 費用対効果が高い: 追加の PSC リソースやプロデューサー VM の CPU サイクルは必要ありません。料金は他のタイプの PSC デプロイと同じです
  • 高パフォーマンス: ポート マッピングでは、他の PSC モードと同じラインレート スループットと低レイテンシが実現されます。
  • スケーラブルで IP 効率が高い: コンシューマー VPC の 1 つの IP アドレスで、最大 1,000 個のプロデューサー VM と 1,000 個のポート マッピングにアクセスできます。

3. ネットワークの要件

  • ポート マッピングでは、プロデューサー ロードバランサとして内部ネットワーク パススルー ロードバランサを使用する必要があります。
  • ポート マッピングで使用できるのは PSC エンドポイントのみです(PSC バックエンドや PSC インターフェースは使用できません)。
  • ポート マッピング NEG はリージョン コンストラクトです。
  • ポート マッピング NEG は、PSC 接続でのみ使用できます。クライアント VM がプロデューサー ロードバランサの転送ルールを直接呼び出す場合、これらのルールは機能しません。これは、この Codelab でプロデューサー サービスをテストする方法に反映されています。
  • PSC エンドポイントとプロデューサー サービス スタックは、異なる VPC に存在する必要があります。

4. Codelab のトポロジ

ad37cfc003475b7c.png

プロデューサー VPC には、それぞれ 2 つのウェブサーバーを実行する 2 つの VM が作成されます。1 つはポート 1000 で実行され、もう 1 つはポート 2000 で実行されます。Portmap NEG、内部ネットワーク パススルー ロードバランサ、サービス アタッチメントを設定する前に、各サービスをテストします。

コンシューマー VPC で PSC エンドポイントを設定し、クライアント VM からプロデューサー サービスへの接続をテストします。

5. 設定と要件

セルフペース型の環境設定

  1. Google Cloud Console にログインして、プロジェクトを新規作成するか、既存のプロジェクトを再利用します。Gmail アカウントも Google Workspace アカウントもまだお持ちでない場合は、アカウントを作成してください。

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • プロジェクト名は、このプロジェクトの参加者に表示される名称です。Google API では使用されない文字列です。いつでも更新できます。
  • プロジェクト ID は、すべての Google Cloud プロジェクトにおいて一意でなければならず、不変です(設定後は変更できません)。Cloud コンソールでは一意の文字列が自動生成されます。通常は、この内容を意識する必要はありません。ほとんどの Codelab では、プロジェクト ID(通常は PROJECT_ID と識別されます)を参照する必要があります。生成された ID が好みではない場合は、ランダムに別の ID を生成できます。または、ご自身で試して、利用可能かどうかを確認することもできます。このステップ以降は変更できず、プロジェクトを通して同じ ID になります。
  • なお、3 つ目の値として、一部の API が使用するプロジェクト番号があります。これら 3 つの値について詳しくは、こちらのドキュメントをご覧ください。
  1. 次に、Cloud のリソースや API を使用するために、Cloud コンソールで課金を有効にする必要があります。この Codelab の操作をすべて行って、費用が生じたとしても、少額です。このチュートリアルの終了後に請求が発生しないようにリソースをシャットダウンするには、作成したリソースを削除するか、プロジェクトを削除します。Google Cloud の新規ユーザーは、300 米ドル分の無料トライアル プログラムをご利用いただけます。

Cloud Shell を起動する

Google Cloud はノートパソコンからリモートで操作できますが、この Codelab では、Google Cloud Shell(Cloud 上で動作するコマンドライン環境)を使用します。

Google Cloud Console で、右上のツールバーにある Cloud Shell アイコンをクリックします。

55efc1aaa7a4d3ad.png

プロビジョニングと環境への接続にはそれほど時間はかかりません。完了すると、次のように表示されます。

7ffe5cbb04455448.png

この仮想マシンには、必要な開発ツールがすべて用意されています。永続的なホーム ディレクトリが 5 GB 用意されており、Google Cloud で稼働します。そのため、ネットワークのパフォーマンスと認証機能が大幅に向上しています。この Codelab での作業はすべて、ブラウザ内から実行できます。インストールは不要です。

6. 始める前に

API を有効にする

Cloud Shell で、プロジェクト ID が設定されていることを確認します。

gcloud config list project
gcloud config set project [YOUR-PROJECT-ID]
project=[YOUR-PROJECT-ID]
region=us-central1
zone=us-central1-a
echo $project
echo $region
echo $zone

必要なサービスをすべて有効にする

gcloud services enable compute.googleapis.com

7. プロデューサー VPC ネットワークを作成する

VPC ネットワーク

Cloud Shell から

gcloud compute networks create producer-vpc --subnet-mode custom

サブネットを作成する

Cloud Shell から

gcloud compute networks subnets create producer-service-subnet --network producer-vpc --range 10.0.0.0/24 --region $region --enable-private-ip-google-access

gcloud compute networks subnets create psc-nat-subnet --network producer-vpc --range 10.100.100.0/24 --region $region --purpose=PRIVATE_SERVICE_CONNECT

PSC サブネットは、ネットワーク アドレス変換の目的で PSC サービス アタッチメントに関連付けられます。本番環境のユースケースでは、このサブネットは、接続されているすべての PSC エンドポイントからの受信トラフィック量をサポートするように適切にサイズ設定する必要があります。詳細については、PSC NAT サブネットのサイジングに関するドキュメントをご覧ください。

ネットワーク ファイアウォール ポリシーとファイアウォール ルールを作成する

Cloud Shell から

gcloud compute network-firewall-policies create producer-vpc-policy --global

gcloud compute network-firewall-policies associations create --firewall-policy producer-vpc-policy --network producer-vpc --name network-producer-vpc --global-firewall-policy

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

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

Cloud Shell から

gcloud compute network-firewall-policies rules create 1000 --action ALLOW --firewall-policy producer-vpc-policy --description "SSH with IAP" --direction INGRESS --src-ip-ranges 35.235.240.0/20 --layer4-configs tcp:22  --global-firewall-policy

次のファイアウォール ルールは、PSC サブネットからネットワーク内のすべてのインスタンスへの TCP ポート 1000 ~ 2000 のトラフィックを許可します。本番環境では、このファイアウォール ルールは、特定のプロデューサー サービスに関連付けられたインスタンスのみに制限する必要があります。

Cloud Shell から

gcloud compute network-firewall-policies rules create 2000 --action ALLOW --firewall-policy producer-vpc-policy --description "allow traffic from PSC NAT subnet" --direction INGRESS --src-ip-ranges 10.100.100.0/24 --layer4-configs tcp:1000-2000 --global-firewall-policy

次のファイアウォール ルールは、TCP ポート 1000 ~ 2000 でサービス サブネット内のすべてのトラフィックを許可します。このルールは、プロデューサー サービスが適切に動作していることをテストするために使用されます。

Cloud Shell から

gcloud compute network-firewall-policies rules create 2001 --action ALLOW --firewall-policy producer-vpc-policy --description "allow traffic within the service subnet" --direction INGRESS --src-ip-ranges 10.0.0.0/24 --layer4-configs tcp:1000-2000 --global-firewall-policy

プロデューサー VM を作成して構成する

VM を作成する

Cloud Shell から

gcloud compute instances create portmap-vm1 --zone=$zone --subnet=producer-service-subnet --no-address

gcloud compute instances create portmap-vm2 --zone=$zone --subnet=producer-service-subnet --no-address

gcloud compute instances create test-client-vm --zone=$zone --subnet=producer-service-subnet --no-address

次のセクションでは、各プロデューサー VM のポート 1000 と 2000 で HTTP サーバーを起動します。

VM を構成する

Cloud Shell から

gcloud compute ssh --zone $zone "portmap-vm1" --tunnel-through-iap --project $project

Cloud Shell の portmap-vm1 セッション

mkdir 1000
cd 1000
echo "portmap-vm1 1000">index.html
sudo python3 -m http.server 1000 &
cd ..
mkdir 2000
cd 2000
echo "portmap-vm1 2000">index.html
sudo python3 -m http.server 2000 &

新しい Cloud Shell ウィンドウを開く

まず、変数をリセットします。Cloud Shell で次の処理を行います。

project=[YOUR-PROJECT-ID]
region=us-central1
zone=us-central1-a
echo $project
echo $region
echo $zone

gcloud compute ssh --zone $zone "portmap-vm2" --tunnel-through-iap --project $project

Cloud Shell(portmap-vm2 セッション)

mkdir 1000
cd 1000
echo "portmap-vm2 1000">index.html
sudo python3 -m http.server 1000 &
cd ..
mkdir 2000
cd 2000
echo "portmap-vm2 2000">index.html
sudo python3 -m http.server 2000 &

8. テスト プロデューサー サービス

まず、portmap インスタンスの IP アドレスを取得する必要があります。これらの IP アドレスをメモしておきます。

新しい Cloud Shell ウィンドウを開く

まず、変数をリセットします。Cloud Shell で次の処理を行います。

project=[YOUR-PROJECT-ID]
region=us-central1
zone=us-central1-a
echo $project
echo $region
echo $zone

gcloud compute instances describe portmap-vm1 \
  --format='get(networkInterfaces[0].networkIP)' --zone $zone

gcloud compute instances describe portmap-vm2\
  --format='get(networkInterfaces[0].networkIP)' --zone $zone

テスト インスタンスにログインします。Cloud Shell で次の処理を行います。

gcloud compute ssh --zone $zone "test-client-vm" --tunnel-through-iap --project $project

curl [portmap-vm1 IP]:1000

想定される出力

portmap-vm1 1000

Cloud Shell で次の処理を行います。

curl [portmap-vm1 IP]:2000

想定される出力

portmap-vm1 2000

Cloud Shell で次の処理を行います。

curl [portmap-vm2 IP]:1000

想定される出力

portmap-vm2 1000

Cloud Shell で次の処理を行います。

curl [portmap-vm2 IP]:2000

想定される出力

portmap-vm2 2000

test-client-vm を終了する

9. ポートマップ NEG を使用してプロデューサー サービスを作成する

ロードバランサ コンポーネントを作成する

Cloud Shell から

gcloud compute network-endpoint-groups create portmap-neg --region=$region --network=producer-vpc --subnet=producer-service-subnet --network-endpoint-type=GCE_VM_IP_PORTMAP

Portmap NEG にエンドポイントを追加して、クライアント ポートからプロデューサー ポートへのマッピングを作成します。プロデューサーはこのマッピングを作成し、この情報をコンシューマーに伝える独自の方法を持ちます。特定のポート マッピングは PSC を介して共有されません。

Cloud Shell で次の処理を行います。

gcloud compute network-endpoint-groups update portmap-neg --region=$region --add-endpoint=client-destination-port=1001,instance=projects/$project/zones/$zone/instances/portmap-vm1,port=1000 --add-endpoint=client-destination-port=1002,instance=projects/$project/zones/$zone/instances/portmap-vm1,port=2000 --add-endpoint=client-destination-port=1003,instance=projects/$project/zones/$zone/instances/portmap-vm2,port=1000 --add-endpoint=client-destination-port=1004,instance=projects/$project/zones/$zone/instances/portmap-vm2,port=2000

ロードバランサの構築を完了します。

Cloud Shell で次の処理を行います。

gcloud compute backend-services create portmap-bes --load-balancing-scheme=internal --region=$region --network=producer-vpc

gcloud compute backend-services add-backend portmap-bes --network-endpoint-group=portmap-neg --network-endpoint-group-region=$region

gcloud compute forwarding-rules create portmap-fr --load-balancing-scheme=INTERNAL --network=producer-vpc --subnet=producer-service-subnet --ports=ALL --region=$region --backend-service=portmap-bes

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

Cloud Shell から

gcloud compute service-attachments create portmap-service-attachment --region=$region --producer-forwarding-rule=portmap-fr --connection-preference=ACCEPT_AUTOMATIC --nat-subnets=psc-nat-subnet

次に、サービス アタッチメント URI を取得してメモし、コンシューマー環境で PSC エンドポイントを構成します。

Cloud Shell で次の処理を行います。

gcloud compute service-attachments describe portmap-service-attachment --region=$region

出力例

connectionPreference: ACCEPT_AUTOMATIC
creationTimestamp: '2024-07-19T10:02:29.432-07:00'
description: ''
enableProxyProtocol: false
fingerprint: LI8D6JNQsLA=
id: '6207474793859982026'
kind: compute#serviceAttachment
name: portmap-service-attachment
natSubnets:
- https://www.googleapis.com/compute/v1/projects/$project/regions/$zone/subnetworks/psc-nat-subnet
pscServiceAttachmentId:
  high: '94288091358954472'
  low: '6207474793859982026'
reconcileConnections: false
region: https://www.googleapis.com/compute/v1/projects/$project/regions/$region
selfLink: https://www.googleapis.com/compute/v1/projects/$project/regions/$region/serviceAttachments/portmap-service-attachment
targetService: https://www.googleapis.com/compute/v1/projects/$project/regions/$region/forwardingRules/portmap-fr

10. コンシューマー VPC ネットワークを作成する

VPC ネットワーク

Cloud Shell から

gcloud compute networks create consumer-vpc --subnet-mode custom

サブネットの作成

Cloud Shell から

gcloud compute networks subnets create consumer-client-subnet --network consumer-vpc --range=10.0.0.0/24 --region $region --enable-private-ip-google-access

ネットワーク ファイアウォール ポリシーとファイアウォール ルールを作成する

Cloud Shell から

gcloud compute network-firewall-policies create consumer-vpc-policy --global

gcloud compute network-firewall-policies associations create --firewall-policy consumer-vpc-policy --network consumer-vpc --name network-consumer-vpc --global-firewall-policy

gcloud compute network-firewall-policies rules create 1000 --action ALLOW --firewall-policy consumer-vpc-policy --description "SSH with IAP" --direction INGRESS --src-ip-ranges 35.235.240.0/20 --layer4-configs tcp:22  --global-firewall-policy

コンシューマー ネットワークに必要なのは、IAP からの SSH アクセスのみです。

11. VM と PSC エンドポイントを作成して接続をテストする

この時点で、3 つの Cloud Shell ウィンドウが開いているはずです。portmap-vm1 とのセッションが開いている必要があります。1 つは portmap-vm2 とのオープン セッションで、もう 1 つは作業セッションである必要があります。

テスト VM を作成する

Cloud Shell から

gcloud compute instances create consumer-client-vm --zone $zone --subnet=consumer-client-subnet --no-address

PSC エンドポイントを作成する

Cloud Shell から

gcloud compute addresses create psc-endpoint-ip --region=$region --subnet=consumer-client-subnet --addresses 10.0.0.10

gcloud compute forwarding-rules create psc-portmap-endpoint --region=$region --network=consumer-vpc --address=psc-endpoint-ip --target-service-attachment=[SERVICE ATTACHMENT URI]

接続をテストする

Cloud Shell から

gcloud compute ssh --zone $zone "consumer-client-vm" --tunnel-through-iap --project $project

curl 10.0.0.10:1001

想定される出力

portmap-vm1 1000

Cloud Shell から

curl 10.0.0.10:1002

想定される出力

portmap-vm1 2000

Cloud Shell から

curl 10.0.0.10:1003

想定される出力

portmap-vm2 1000

Cloud Shell から

curl 10.0.0.10:1004

想定される出力

portmap-vm2 2000

12. クリーンアップ手順

VM インスタンスを終了する(すべてのウィンドウ)

exit

単一の Cloud Shell ターミナルからラボ コンポーネントを削除する

gcloud compute forwarding-rules delete psc-portmap-endpoint --region=$region -q

gcloud compute addresses delete psc-endpoint-ip --region=$region -q

gcloud compute instances delete consumer-client-vm --zone=$zone -q

gcloud compute network-firewall-policies rules delete 1000 --firewall-policy=consumer-vpc-policy --global-firewall-policy -q

gcloud compute network-firewall-policies associations delete --firewall-policy=consumer-vpc-policy  --name=network-consumer-vpc --global-firewall-policy -q

gcloud compute network-firewall-policies delete consumer-vpc-policy --global -q

gcloud compute networks subnets delete consumer-client-subnet  --region=$region -q

gcloud compute networks delete consumer-vpc -q

gcloud compute service-attachments delete portmap-service-attachment --region=$region -q

gcloud compute forwarding-rules delete portmap-fr --region=$region -q

gcloud compute backend-services delete portmap-bes --region=$region -q

gcloud compute network-endpoint-groups delete portmap-neg --region=$region -q

gcloud compute instances delete test-client-vm --zone=$zone -q

gcloud compute instances delete portmap-vm2 --zone=$zone -q

gcloud compute instances delete portmap-vm1 --zone=$zone -q

gcloud compute network-firewall-policies rules delete 2001 --firewall-policy producer-vpc-policy --global-firewall-policy -q

gcloud compute network-firewall-policies rules delete 2000 --firewall-policy producer-vpc-policy --global-firewall-policy -q

gcloud compute network-firewall-policies rules delete 1000 --firewall-policy producer-vpc-policy --global-firewall-policy -q

gcloud compute network-firewall-policies associations delete --firewall-policy=producer-vpc-policy  --name=network-producer-vpc --global-firewall-policy -q

gcloud compute network-firewall-policies delete producer-vpc-policy --global -q

gcloud compute networks subnets delete psc-nat-subnet --region $region -q

gcloud compute networks subnets delete producer-service-subnet --region $region -q

gcloud compute networks delete producer-vpc -q

13. 完了

以上で、この Codelab は完了です。

学習した内容

  • Private Service Connect ポート マッピングのユースケース
  • PSC ポート マッピングの主なメリット
  • ネットワークの要件
  • ポート マッピングを使用して Private Service Connect プロデューサー サービスを作成します。
  • Private Service Connect エンドポイントを作成する
  • Private Service Connect エンドポイントを介してプロデューサー サービスを呼び出す