Private Service Connect - PSC バックエンドを使用してプロデューサー サービスにアクセスする

1. はじめに

Private Service Connect を使用すると、サービス プロデューサーは、ある VPC ネットワークから別の VPC ネットワークにサービスを限定公開できます。コンシューマは、PSC エンドポイントまたは PSC バックエンドからプロデューサー サービスにアクセスできます。

この Codelab では、PSC バックエンドに焦点を当てます。PSC バックエンドは、Google Cloud プロキシ ロードバランサ(アプリケーションまたはネットワーク)と組み合わせて使用されます。PSC バックエンドを使用すると、次のようなコンシューマ側のきめ細かい制御が可能になります。

  • 高度なオブザーバビリティとロギング
  • Cloud Armor の統合
  • カスタム URL
  • 高度なトラフィック管理
  • カスタム TLS 証明書

この Codelab では、グローバル外部アプリケーション ロードバランサを使用して Private Service Connect バックエンドを作成し、別のネットワーク内のプロデューサー サービスにプライベートにアクセスする方法について説明します。

学習内容

  • グローバル外部アプリケーション ロードバランサに関連付けられた PSC バックエンドを作成して構成する
  • Apache マネージド ウェブサービスを構成し、Service Attachment を介して PSC サービスとして公開する
  • SSL 証明書を作成して、内部アプリケーション ロードバランサと外部アプリケーション ロードバランサで SSL を終端する
  • PSC サービスにアクセスするための Cloud DNS 公開ゾーンを構成する

必要なもの

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

2. テスト環境

作成する環境は、コンシューマ VPC とプロデューサー VPC で構成されます。プロデューサー VPC で、オープンソースの Apache ウェブサービスを構築するインスタンス テンプレートからマネージド インスタンス グループをデプロイします。また、test-vm をデプロイして、サービスのローカル機能が適切に動作することを確認します。Apache サービスを Service Attachment を介して PSC プロデューサー サービスとして公開します。

コンシューマ VPC に、Apache サービスを指す PSC バックエンド サービスを持つグローバル外部アプリケーション ロードバランサをデプロイします。次に、一般公開 DNS ゾーンを設定して、一般公開インターネットで PSC サービスにアクセスします。

31e7497bf3d9035c.png

3. 設定と要件

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

  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 での作業はすべて、ブラウザ内から実行できます。インストールは不要です。

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
gcloud services enable dns.googleapis.com

5. プロデューサー VPC の設定

VPC ネットワークの作成

Cloud Shell から

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

サブネットを作成する

2 つの汎用サブネットがプロデューサー VPC にデプロイされます。service-subnet は、Apache ウェブサービス VM とロードバランサ転送ルールのデプロイに使用されます。test-client-subnet は別のリージョンにあり、VM をデプロイしてグローバル アクセスが有効になっている Apache サービスをテストするために使用されます。

Cloud Shell から

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

Cloud Shell から

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

また、リージョン内部アプリケーション ロードバランサで使用するプロキシ専用サブネットもデプロイする必要があります。

Cloud Shell から

gcloud compute networks subnets create central-proxy-subnet \
    --network=producer-vpc \
    --range=10.100.101.0/24 \
    --region=$region \
    --purpose=REGIONAL_MANAGED_PROXY \
    --role=ACTIVE

PSC サービスをデプロイする場合、一意のサービスごとに、サービス アタッチメントに関連付ける対応する PSC NAT サブネットが必要です。このサブネットのサイズは、接続が予想されるエンドポイントの数に応じて適切に設定する必要があります。

Cloud Shell から

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

Cloud NAT を作成する

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

Cloud Shell から

gcloud compute routers create central-cr \
    --network=producer-vpc \
    --region=$region

Cloud Shell から

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

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

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

ロードバランサのプロキシ専用サブネット(2000)からロードバランサのバックエンドへの上り(内向き)トラフィックを許可するには、2 つの追加のファイアウォール ルールが必要です。また、バックエンド インスタンスでロードバランサのヘルスチェックを許可するルールも必要です(2001)。

Cloud Shell から

gcloud compute network-firewall-policies rules create 2000 \
    --action ALLOW \
    --firewall-policy producer-vpc-policy \
    --description "allow traffic from load balancer proxy subnet" \
    --direction INGRESS \
    --src-ip-ranges 10.100.101.0/24 \
    --layer4-configs tcp:443 \
    --global-firewall-policy


gcloud compute network-firewall-policies rules create 2001 \
    --action ALLOW \
    --firewall-policy producer-vpc-policy \
    --description "allow load balancer health checks" \
    --direction INGRESS \
    --src-ip-ranges 130.211.0.0/22,35.191.0.0/16 \
    --layer4-configs tcp:443 \
    --global-firewall-policy

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

「PSC Service」を表示する簡単な Apache ウェブサービスを作成します。

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

Cloud Shell から

gcloud compute instance-templates create apache-service-template \
    --network producer-vpc \
    --subnet service-subnet \
    --region $region \
    --no-address \
    --metadata startup-script='#! /bin/bash
    sudo apt-get update
    apt-get install apache2 -y
    a2enmod ssl
    sudo a2ensite default-ssl
    echo "PSC Service" | \
    tee /var/www/html/index.html
    systemctl restart apache2'

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

Cloud Shell から

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

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

Cloud Shell から

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

gcloud compute instance-groups managed set-named-ports psc-service-mig \
    --named-ports=https:443 \
    --region=$region

7. 自己署名証明書を作成する

こちらの手順のステップ 1 を完了して、自己署名証明書を作成します。すべてのコマンドは Cloud Shell で実行できます。手順 1 が完了したら、このページに戻ってください。COMMON NAME は EXAMPLE.COM で構成する必要があります。

ロードバランサに関連付ける証明書リソースを作成します。証明書パラメータと秘密鍵パラメータは、特定のファイル名に置き換えます。

Cloud Shell から

gcloud compute ssl-certificates create producer-service-cert \
    --certificate=<your-producer-certfile.cert> \
    --private-key=<your-producer-keyfile.pem> \
    --region=$region

8. 内部リージョン アプリケーション ロードバランサを作成する

次に、サービスのロードバランサ コンポーネントを作成します。ここでは内部リージョン アプリケーション ロードバランサを使用していますが、任意の Google Cloud 内部ロードバランサを使用できます。TLS の処理については、該当するロードバランサのドキュメントをご覧ください。

ロードバランサの転送ルールに使用する内部 IP アドレスを作成し、後でサービスへのテスト呼び出しを行うときに使用する IP をメモします。

Cloud Shell から

gcloud compute addresses create apache-service-ip \
 --region=$region \
 --subnet=service-subnet

gcloud compute addresses describe apache-service-ip \
   --format="get(address)" \
   --region=$region

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

Cloud Shell から

gcloud compute health-checks create https lb-apache-service-hc \
    --region=$region \
    --port-name=https

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

Cloud Shell から

gcloud compute backend-services create apache-bes\
  --load-balancing-scheme=INTERNAL_MANAGED \
  --protocol=HTTPS \
  --port-name=https \
  --health-checks=lb-apache-service-hc \
  --health-checks-region=$region \
  --region=$region


gcloud compute backend-services add-backend apache-bes \
  --balancing-mode=UTILIZATION \
  --instance-group=psc-service-mig \
  --region=$region

URL マップを作成します。

Cloud Shell から

gcloud compute url-maps create producer-url-map \
  --default-service=apache-bes \
  --region=$region

ターゲット HTTPS プロキシを作成します。

Cloud Shell から

gcloud compute target-https-proxies create https-proxy \
  --url-map=producer-url-map \
  --region=$region \
  --ssl-certificates=producer-service-cert

転送ルールを作成します。

Cloud Shell から

gcloud compute forwarding-rules create apache-fr \
  --load-balancing-scheme=INTERNAL_MANAGED \
  --network=producer-vpc \
  --subnet=service-subnet \
  --address=apache-service-ip \
  --ports=443 \
  --region=$region \
  --target-https-proxy=https-proxy \
  --target-https-proxy-region=$region \
  --allow-global-access

9. テスト用 VM を作成し、ローカルでサービスをテストする

Service Attachment を作成する前に、別のリージョンにテスト クライアント VM を作成して、ロードバランサがグローバル アクセスと TLS で正しく構成されていることをテストします。

Cloud Shell から

gcloud compute instances create vm-client \
    --zone=us-east4-a \
    --subnet=test-client-subnet \
    --no-address

プロビジョニングが完了するまで 1 分ほど待ち、インスタンスに SSH 接続します。

Cloud Shell から

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

ロードバランサ経由で 443 経由で接続して、Apache Service をテストします。内部 IP アドレスは、前に予約してメモしたものです。

curl https://example.com:443 -k --connect-to example.com:443:<YOUR-INTERNAL-IP>:443

予想される結果

PSC Service

VM を終了します。

vm-client から

exit

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

この例では、このプロジェクトからの PSC 接続のみを許可するようにサービス アタッチメントを構成します。1 つ以上の特定のプロジェクトまたはネットワークを許可するように構成できますが、両方を許可することはできません。最大接続数は 5 に設定されています。各プロジェクトまたはネットワークに上限を設定する必要があります。

Cloud Shell から

gcloud compute service-attachments create apache-service-attachment \
    --region=$region \
    --producer-forwarding-rule=apache-fr \
    --connection-preference=ACCEPT_MANUAL \
    --consumer-accept-list=$project=5 \
    --nat-subnets=psc-nat-subnet

次のステップで PSC バックエンドの構成に使用する Service Attachment URI(selfLink)をメモしておいてください。これは、Cloud Shell で次のコマンドを実行することで取得できます。

Cloud Shell から

gcloud compute service-attachments describe apache-service-attachment \
    --region $region

projects で始まる URI をコピーします。

例: projects/$project/regions/$region/serviceAttachments/apache-service-attachment

11. コンシューマ VPC の設定

VPC ネットワークを作成する

Cloud Shell から

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

サブネットの作成

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

Cloud Shell から

gcloud compute networks subnets create consumer-subnet \
    --network=consumer-vpc \
    --region=$region \
    --range=10.0.0.0/28

12. 外部 IP を予約し、コンシューマ側の自己署名証明書を作成する

外部 IP

後でロードバランサの転送ルールに使用する外部静的 IP アドレスを作成し、Cloud Shell 変数に IP アドレスをキャプチャします。

Cloud Shell から

gcloud compute addresses create external-psc-ip \
    --network-tier=PREMIUM \
    --ip-version=IPV4 \
    --global

export externalip=$(gcloud compute addresses describe external-psc-ip \
    --format="get(address)" \
    --global)

echo $externalip

コンシューマの自己署名証明書

こちらの手順のステップ 1 をもう一度行って、自己署名証明書を作成します。すべてのコマンドは Cloud Shell で実行できます。手順 1 が完了したら、このページに戻ってください。独自のパブリック DNS ゾーンを所有する代わりに、nip.io というオープンソースのパブリック ワイルドカード DNS サービスを使用します。PSC サービスのパブリック URL は、先ほど構成した外部 IP アドレスを使用します。YOUR COMMON NAME MUST BE CONFIGURED WITH <YOUR-EXTERNAL-IP.nip.io>

外部ロードバランサに関連付ける証明書リソースを作成します。証明書パラメータと秘密鍵パラメータは、特定のファイル名に置き換えます。

Cloud Shell から

gcloud compute ssl-certificates create consumer-service-cert \
    --certificate=<your-consumer-certfile.cert> \
    --private-key=<your-consumer-keyfile.pem> \
    --global

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

バックエンド サービスとして新しく作成した Service Attachment を指す PSC NEG を使用して、グローバル外部アプリケーション ロードバランサを作成します。

前の手順でメモしたサービス アタッチメント URI を用意します。以下の psc-target-service を URI に置き換えます。

Cloud Shell から

gcloud compute network-endpoint-groups create apache-psc-neg \
--network-endpoint-type=private-service-connect \
--psc-target-service=projects/$project/regions/$region/serviceAttachments/apache-service-attachment \
--region=$region \
--network=consumer-vpc \
--subnet=consumer-subnet

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

Cloud Shell から

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

gcloud compute backend-services add-backend apache-pscneg-bes \
    --network-endpoint-group=apache-psc-neg \
    --network-endpoint-group-region=$region \
    --global

URL マップを作成する

Cloud Shell から

gcloud compute url-maps create consumer-url-map \
    --default-service=apache-pscneg-bes \
    --global

ターゲット HTTPS プロキシを作成します。

Cloud Shell から

gcloud compute target-https-proxies create psc-https-proxy \
    --url-map=consumer-url-map \
    --ssl-certificates=consumer-service-cert

転送ルールを作成する

Cloud Shell から

gcloud compute forwarding-rules create external-fr \
  --load-balancing-scheme=EXTERNAL_MANAGED \
  --network-tier=PREMIUM \
  --address=external-psc-ip \
  --global \
  --target-https-proxy=psc-https-proxy \
  --ports=443

14. 一般公開 DNS ゾーンを作成する

Cloud Shell から

gcloud dns managed-zones create "psc-service" \
    --dns-name=$externalip.nip.io. \
    --description="public dns for psc service" \
    --visibility=public

Cloud Shell から

gcloud dns record-sets transaction start \
   --zone="psc-service"

gcloud dns record-sets transaction add $externalip \
   --name=$externalip.nip.io \
   --ttl=300 \
   --type=A \
   --zone="psc-service"

gcloud dns record-sets transaction execute \
   --zone="psc-service"

15. コンシューマの PSC 接続をテストする

パブリック DNS が伝播されるまで 7 ~ 10 分待ってからテストします。

Cloud Shell から

curl https://$externalip.nip.io -k

ブラウザまたはデスクトップ ターミナルに https://<YOUR-EXTERNAL-IP>.nip.io と入力して、ブラウザからテストすることもできます。

予想される結果

PSC Service

16. クリーンアップ手順

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

gcloud dns record-sets delete $externalip.nip.io --zone="psc-service" --type=A -q

gcloud dns managed-zones delete "psc-service" -q

gcloud compute forwarding-rules delete external-fr --global -q 

gcloud compute target-https-proxies delete psc-https-proxy -q

gcloud compute url-maps delete consumer-url-map --global -q

gcloud compute backend-services delete apache-pscneg-bes --global -q

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

gcloud compute ssl-certificates delete consumer-service-cert --global -q

gcloud compute addresses delete external-psc-ip --global -q

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

gcloud compute networks delete consumer-vpc -q

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

gcloud compute service-attachments delete apache-service-attachment --region $region -q

gcloud compute forwarding-rules delete apache-fr --region $region -q

gcloud compute target-https-proxies delete https-proxy --region $region -q

gcloud compute url-maps delete producer-url-map --region $region -q

gcloud compute backend-services delete apache-bes --region $region -q

gcloud compute health-checks delete lb-apache-service-hc --region $region -q

gcloud compute addresses delete apache-service-ip --region $region -q

gcloud compute ssl-certificates delete producer-service-cert --region $region -q

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

gcloud compute health-checks delete service-mig-healthcheck --global -q

gcloud compute instance-templates delete apache-service-template -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 routers nats delete central-nat --router=central-cr --region $region -q

gcloud compute routers delete central-cr --region $region -q

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

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

gcloud compute networks subnets delete test-client-subnet --region us-east4 -q 

gcloud compute networks subnets delete central-proxy-subnet --region $region -q

gcloud compute networks delete producer-vpc -q

17. 完了

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

学習した内容

  • グローバル外部アプリケーション ロードバランサに関連付けられた PSC バックエンドを作成して構成する
  • Apache マネージド ウェブサービスを構成し、Service Attachment を介して PSC サービスとして公開する
  • SSL 証明書を作成して、内部アプリケーション ロードバランサと外部アプリケーション ロードバランサで SSL を終端する
  • PSC サービスにアクセスするように Cloud DNS 公開ゾーンを構成する