Private Service Connect - グローバル XLB からマネージド サービスへのコンシューマ HTTP(S) Service Controls の使用

1. はじめに

Private Service Connect を使用すると、サービス プロデューサーがサービス コンシューマにサービスを提供できます。サービス プロデューサー VPC ネットワークは複数のサービス ユーザーをサポートできます。

公開サービスに接続できる Private Service Connect エンドポイントには、次の 2 種類があります。

  • Private Service Connect エンドポイント(転送ルールに基づく)

このエンドポイント タイプでは、コンシューマは自身が定義した内部 IP アドレスに接続します。Private Service Connect は、ネットワーク アドレス変換(NAT)を行い、リクエストをサービス プロデューサーに転送します。

  • コンシューマ HTTP(S) サービス コントロールを備えた Private Service Connect エンドポイント(グローバル外部 HTTP(S) ロードバランサに基づく)

このエンドポイント タイプでは、コンシューマは外部 IP アドレスに接続します。Private Service Connect はネットワーク エンドポイント グループを使用して、リクエストをサービス プロデューサーに転送します。

グローバル外部 HTTP(S) ロードバランサをポリシー適用ポイントとして使用することには、次の利点があります。

  • サービスの名前を変更し、任意の URL にマッピングできます。
  • Cloud Logging にすべてのリクエストを記録するようにロードバランサを構成できる。
  • 顧客マネージド TLS 証明書を使用できます。Google マネージド証明書を使用できます。

この Codelab では、Global XLB を使用して Private Service Connect エンドポイントの Consumer HTTP(S) Service Controls を作成し、別のネットワークのサービスにプライベート アクセスする方法を学びます。この PSC パターンは、単一のプロジェクトまたは個別のプロジェクトを使用して実行できます。このラボでは、2 つの異なる VPC がある 1 つのプロジェクトを使用します。

学習内容

  • グローバル XLB を使用してコンシューマ HTTP(S) Service Controls で Private Service Connect エンドポイントを作成する
  • L7 XLB 接続を受け入れるために、サービス アタッチメントを介して公開されるマネージド サービスを構成する。
  • SSL 証明書を作成し、TLS を終端してポート 443 でトラフィックを受け入れるように Apache ウェブサーバーを構成する。
  • PSC NEG を作成します。

必要なもの

  • Google Cloud プロジェクト
  • インスタンスのデプロイとネットワーキング コンポーネントの構成に関する知識

2. テスト環境

作成する環境は、外部 HTTP(S) ロードバランサとコンシューマ VPC 内の PSC NEG で構成されます。プロデューサー VPC は、HTTPS で構成されたシンプルな Apache ウェブサービスをホストします。Apache ウェブサービスからバックエンド サービスを作成し、そのバックエンド サービスのフロントエンドに、PSC サービス アタッチメントで構成された内部 TCP ロードバランサを配置します。

bbca972cf488ece.png

3. 設定と要件

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

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • プロジェクト名は、このプロジェクトの参加者に表示される名称です。Google API では使用されない文字列で、いつでも更新できます。
  • プロジェクト ID は、すべての Google Cloud プロジェクトにおいて一意でなければならず、不変です(設定後は変更できません)。Cloud Console により一意の文字列が自動生成されます(通常は内容を意識する必要はありません)。ほとんどの Codelab では、プロジェクト ID を参照する必要があります(通常、プロジェクト ID は「PROJECT_ID」の形式です)。好みの文字列でない場合は、別のランダムな ID を生成するか、独自の ID を試用して利用可能であるかどうかを確認することができます。プロジェクトの作成後、ID は「フリーズ」されます。
  • 3 つ目の値として、一部の API が使用するプロジェクト番号があります。これら 3 つの値について詳しくは、こちらのドキュメントをご覧ください。
  1. 次に、Cloud のリソースや API を使用するために、Cloud Console で課金を有効にする必要があります。この Codelab の操作をすべて行って、費用が生じたとしても、少額です。このチュートリアルを終了した後に課金が発生しないようにリソースをシャットダウンするには、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 で稼働します。そのため、ネットワークのパフォーマンスと認証機能が大幅に向上しています。このラボでの作業はすべて、ブラウザから実行できます。

4. 始める前に

API を有効にする

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

gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
export project=YOUR-PROJECT-NAME
export region=us-central1
echo $project
echo $region

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

gcloud services enable compute.googleapis.com
gcloud services enable servicedirectory.googleapis.com

5. プロデューサー VPC、サブネット、ファイアウォール ルールの設定

VPC ネットワーク

Cloud Shell から

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

サブネットの作成

PSC のネットワーク アドレス変換(NAT)を行うには、プロデューサー側にサブネットが必要です。目的が PRIVATE_SERVICE_CONNECT であることに留意してください。つまり、このサブネットはワークロードのデプロイに使用できません。

Cloud Shell から

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

プロデューサー VPC に 2 つのサブネットをデプロイします。最初にプロデューサー サービスをデプロイし、別のリージョンで client-vm をデプロイして、TCP 内部ロードバランサのグローバル アクセス経由でサービスへの接続をテスト。

Cloud Shell から

gcloud compute networks subnets create service-subnet \
    --network=producer-vpc \
    --range=10.0.0.0/24 \
    --region=$region

Cloud Shell から

gcloud compute networks subnets create client-subnet \
    --network=producer-vpc \
    --range=10.0.1.0/24 \
    --region=us-east4

Cloud NAT を作成する

プロデューサー サービス用の適切なパッケージをインストールするには、Cloud NAT が必要です。

Cloud Shell から

gcloud compute routers create service-cr \
--region=$region --network=producer-vpc \
--asn=65501

Cloud Shell から

gcloud compute routers nats create service-nat-gw \
--router=service-cr \
--router-region=$region \
--nat-custom-subnet-ip-ranges=service-subnet \
--auto-allocate-nat-external-ips

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

このラボでは、IAP を使用して、作成したインスタンスに接続します。次のファイアウォール ルールを使用すると、IAP 経由でインスタンスに接続できます。IAP を使用しない場合は、この手順をスキップしてインスタンスにパブリック IP アドレスを追加し、TCP ポート 22 で 0.0.0.0/0 からの上り(内向き)を許可するファイアウォール ルールを作成できます。

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

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

Cloud Shell から

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

クライアント トラフィックはグローバル外部 HTTP(S) ロードバランサから発信されるため、ウェブサービスをホストするタグ付きの宛先サーバーへのこのトラフィックを許可するファイアウォール ルールを作成する必要があります。また、テスト用に client-subnet のファイアウォール ルールも開きます。

Cloud Shell から

gcloud compute firewall-rules create allow-xlb-client \
  --network=producer-vpc \
  --direction=ingress \
  --allow=tcp:443 \
  --target-tags=psc-service \
  --source-ranges=130.211.0.0/22,35.191.0.0/16,10.0.1.0/24

Apache ウェブサービスを作成する

「PSC Service」と表示されるシンプルな Apache ウェブサービスを作成します。

インスタンス テンプレートを作成する

Cloud Shell から

gcloud compute instance-templates create producer-service-template \
    --network producer-vpc \
    --subnet service-subnet \
    --region $region \
    --no-address \
    --scopes=https://www.googleapis.com/auth/cloud-platform \
    --image-family=debian-10 \
    --image-project=debian-cloud \
    --tags=psc-service \
    --metadata startup-script='#! /bin/bash
    sudo apt-get update
    apt-get install apache2 -y
    a2ensite default-ssl
    echo "PSC Service" | \
    tee /var/www/html/index.html
    systemctl restart apache2'

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

Cloud Shell から

gcloud compute health-checks create https psc-service-mig-healthcheck \
    --port=443 \
    --global

マネージド インスタンス グループを作成する

Cloud Shell から

gcloud compute instance-groups managed create psc-service-mig \
    --region $region \
    --size=2 \
    --template=producer-service-template \
    --health-check=psc-service-mig-healthcheck

Apache ウェブサーバーで SSL を構成する

次に、それぞれの Apache ウェブサーバーで SSL を構成する必要があります。そのためには、証明書を生成し、その証明書を Apache 構成に追加します。

この特定の PSC パターンでは、バックエンド サービスで内部 TCP/UDP(L4)ロードバランサの前面に配置する必要があるため、SSL 終端を構成する必要があります。内部 TCP/UDP ロードバランサは、ロードバランサ レイヤで SSL を終端しません。

まず、MIG の最初の VM に SSH 接続します。VM ゾーンと VM 名は環境ごとに動的に割り当てられます。コンソールで [Compute Engine] >[VM インスタンス] をクリックして、インスタンスの名前とゾーンを検索します。

Cloud Shell から

gcloud compute ssh --zone "<YOUR_VM_ZONE>" "<YOUR_MIG_VM_1>"  --tunnel-through-iap --project $project

次に、OpenSSL を使用して証明書を作成します。国、都道府県、地域、組織、組織部門名、コモンネーム、メールアドレスに関する情報の入力を求められます。入力する必要がある情報は、選択した内部 FQDN であるコモンネームのみです。このラボでは、example.com を選択します。

Cloud Shell から

sudo openssl genrsa -out private-key-file.pem 2048

Cloud Shell から

cat <<'EOF' >config.txt
[req]
default_bits              = 2048
req_extensions            = extension_requirements
distinguished_name        = dn_requirements

[extension_requirements]
basicConstraints          = CA:FALSE
keyUsage                  = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName            = @sans_list

[dn_requirements]
countryName               = Country Name (2 letter code)
stateOrProvinceName       = State or Province Name (full name)
localityName              = Locality Name (eg, city)
0.organizationName        = Organization Name (eg, company)
organizationalUnitName    = Organizational Unit Name (eg, section)
commonName                = Common Name (e.g. server FQDN or YOUR name)
emailAddress              = Email Address

[sans_list]
DNS.1                     = example.com

EOF

Cloud Shell から

sudo openssl req -new -key private-key-file.pem \
    -out csr.pem \
    -config config.txt

Cloud Shell から

sudo openssl x509 -req \
    -signkey private-key-file.pem \
    -in csr.pem \
    -out cert.cert \
    -extfile config.txt \
    -extensions extension_requirements \
    -days 10

次に、Apache の構成情報を新しい証明書の詳細で更新しましょう。

sudo vi /etc/apache2/sites-enabled/default-ssl.conf

ServerAdmin の下に次の行を追加します。

ServerName example.com

VM 上の SSLCertificateFile と SSLCertificateKeyFile の場所と private-key-file.pem の場所を更新します。たとえば、次のようになります<profile> を更新してくださいディレクトリ名で置き換えます。

SSLCertificateFile  /home/<profile>/cert.cert

SSLCertificateKeyFile /home/<profile>/private-key-file.pem

エディタを閉じて Apache を再起動します。

sudo a2enmod ssl
sudo systemctl restart apache2

インスタンスを終了し、マネージド インスタンス グループ内のもう一方のインスタンスで同じ手順を繰り返します。

6. プロデューサー サービスを作成する

次に、Service のロードバランサ コンポーネントを作成します。

ロードバランサのヘルスチェックを作成します。

Cloud Shell から

gcloud compute health-checks create https service-lb-healthcheck \
    --port=443 \
    --region=$region

バックエンド サービスを作成します。

Cloud Shell から

 gcloud compute backend-services create psc-backend-service \
    --load-balancing-scheme=internal \
    --protocol=TCP \
    --region=$region \
    --health-checks=service-lb-healthcheck \
    --health-checks-region=$region

gcloud compute backend-services add-backend psc-backend-service \
--region=$region \
--instance-group=psc-service-mig

転送ルールを作成します。転送ルールは、グローバル アクセスを使用してポート 443 で構成する必要があります。これは、この PSC パターンが機能するために必要です。

Cloud Shell から

 gcloud compute forwarding-rules create producer-fr \
    --region=$region \
    --load-balancing-scheme=internal \
    --network=producer-vpc \
    --subnet=service-subnet \
    --address=10.0.0.100 \
    --ip-protocol=TCP \
    --ports=443 \
    --backend-service=psc-backend-service \
    --backend-service-region=$region \
    --allow-global-access

7. Service をテストする

サービス アタッチメントを作成する前に、別のリージョンにクライアントを作成して、グローバル アクセスが構成されたロードバランサと、TLS を終端するように構成された Apache サービスをテストします。

Cloud Shell から

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

インスタンスに SSH 接続する。

Cloud Shell から

gcloud compute ssh \
    --zone "us-east4-a" "vm-client" \
    --tunnel-through-iap \
    --project $project

ロードバランサ経由で 443 経由で接続し、Apache Service をテストします。

curl https://example.com:443 -k --connect-to example.com:443:10.0.0.100:443

期待される結果

PSC Service

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

Cloud Shell から

gcloud compute service-attachments create pscservice \
    --region=$region \
    --producer-forwarding-rule=producer-fr \
    --connection-preference=ACCEPT-AUTOMATIC \
    --nat-subnets=producer-nat-subnet

エンドポイント構成の次のステップで必要になるため、サービス アタッチメント URI をメモしておきます。これを取得するには、Cloud Shell で次のコマンドを実行します。

Cloud Shell から

gcloud compute service-attachments describe pscservice --region $region

/projects から始まる URI をコピーします

例: /projects/<YOUR_PROJECT_ID>/regions/us-central1/serviceAttachments/pscservice

9. コンシューマ VPC とサブネットの設定

VPC ネットワーク

Cloud Shell から

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

サブネットの作成

Private Service Connect ネットワーク エンドポイント グループ(NEG)がデプロイされるコンシューマ側にサブネットが必要です。

Cloud Shell から

gcloud compute networks subnets create psc-neg-subnet \
--network=consumer-vpc \
--region=$region \
--range=10.100.200.0/24 \
--purpose=private

10. Private Service Connect エンドポイントを作成して接続をテストする

ここでは、先ほど作成したサービス アタッチメントに関連付ける PSC NEG を作成し、PSC NEG をバックエンド サービスにアタッチして、バックエンド サービスを転送ルールに関連付けます。

前のステップでメモしたサービス アタッチメント URI を手元に用意します。以下の URL を実際の URI に置き換えます。

Cloud Shell から

gcloud beta compute network-endpoint-groups create xlb-psc-neg \
--network-endpoint-type=private-service-connect \
--psc-target-service=projects/<PROJECT-ID>/regions/us-central1/serviceAttachments/pscservice \
--region=$region \
--network=consumer-vpc \
--subnet=psc-neg-subnet

XLB パブリック IP アドレスを作成し、後でテストするために割り当てられた実際の IP アドレスを取得します。

Cloud Shell から

gcloud compute addresses create xlb-psc-address \
--ip-version=IPv4 --global

gcloud compute addresses describe xlb-psc-address --format="get(address)" --global

次に、PSC エンドポイント(この場合は外部ロードバランサ)を作成します。

Cloud Shell から

gcloud beta compute backend-services create pscneg-backend-service \
--load-balancing-scheme=EXTERNAL_MANAGED \
--protocol=HTTPS \
--global

Cloud Shell から

gcloud beta compute backend-services add-backend pscneg-backend-service \
--network-endpoint-group=xlb-psc-neg \
--network-endpoint-group-region=$region \
--global

Cloud Shell から

gcloud beta compute url-maps create xlb-psc-map \
--default-service=pscneg-backend-service \
--global

Cloud Shell から

gcloud beta compute target-http-proxies create psc-http-proxy \
--url-map=xlb-psc-map

Cloud Shell から

gcloud beta compute forwarding-rules create xlb-psc-fr \
--load-balancing-scheme=EXTERNAL_MANAGED \
--network-tier=PREMIUM \
--address=xlb-psc-address \
--target-http-proxy=psc-http-proxy \
--ports=80 \
--global

5 ~ 7 分待ってから、xlb-psc-address に関連付けられている IP アドレスをブラウザのアドレスバーに入力します。

「PSC Service」の場合ソリューションが正しく構成されています。

11. クリーンアップ手順

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

gcloud beta compute forwarding-rules delete xlb-psc-fr --global --quiet

gcloud beta compute target-http-proxies delete psc-http-proxy --quiet

gcloud beta compute url-maps delete xlb-psc-map --global --quiet

gcloud beta compute backend-services delete pscneg-backend-service --global --quiet

gcloud compute addresses delete xlb-psc-address --global --quiet

gcloud beta compute network-endpoint-groups delete xlb-psc-neg --region $region --quiet

gcloud compute networks subnets delete psc-neg-subnet --region $region --quiet

gcloud compute networks delete consumer-vpc --quiet

gcloud compute service-attachments delete pscservice --region $region --quiet

gcloud compute instances delete vm-client --zone=us-east4-a --quiet

gcloud compute forwarding-rules delete producer-fr --region $region --quiet

gcloud compute backend-services delete psc-backend-service --region $region --quiet

gcloud compute health-checks delete service-lb-healthcheck --region $region --quiet

gcloud compute instance-groups managed delete psc-service-mig --region $region --quiet

gcloud compute health-checks delete psc-service-mig-healthcheck --region $region --quiet

gcloud compute instance-templates delete producer-service-template --quiet

gcloud compute firewall-rules delete allow-xlb-client --quiet

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

gcloud compute routers nats delete service-nat-gw –router service-cr --region $region --quiet

gcloud compute routers delete service-cr --region $region --quiet

gcloud compute networks subnets delete client-subnet --quiet

gcloud compute networks subnets delete service-subnet --quiet

gcloud compute networks subnets delete producer-nat-subnet --quiet

gcloud compute networks delete producer-vpc --quiet

12. 完了

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

学習した内容

  • グローバル XLB を使用してコンシューマ HTTP(S) Service Controls で Private Service Connect エンドポイントを作成する
  • L7 XLB 接続を受け入れるために、サービス アタッチメントを介して公開されるマネージド サービスを構成する。
  • SSL 証明書を作成し、TLS を終端してポート 443 でトラフィックを受け入れるように Apache ウェブサーバーを構成する。
  • PSC NEG を作成します。