Private Service Connect - リージョン Google API にコンシューマ HTTP(S) Service Controls を使用する

1. はじめに

Private Service Connect を使用すると、VPC ネットワーク内のグローバル内部 IP アドレスを使用してプライベート エンドポイントを作成し、Google API にアクセスできます。このコンセプトに基づき、内部 HTTP(S) ロードバランサを使用してコンシューマ HTTP(S) サービス コントロールを備えた Private Service Connect エンドポイントを作成できるようになりました。これにより、次の機能が提供されます。

  • 使用できるサービスは、URL マップを使用して選択できます。パスによるフィルタを使用すると、より詳細なチェックを行うことができます。
  • サービスの名前を変更し、任意の URL にマッピングできます。
  • 顧客マネージド TLS 証明書を使用できます。
  • 同じリージョン内のワークロードから Google API のリージョン エンドポイントに接続することで、転送中のデータ所在地を有効にできます。

これらの名前と IP アドレスは、VPC ネットワークと、Cloud VPN トンネルまたは Cloud Interconnect アタッチメント(VLAN)を使用して接続されているオンプレミス ネットワークに対して内部的なものです。

学習内容

  • コンシューマ HTTP(S) Service Controls を使用して Private Service Connect エンドポイントを作成する
  • Cloud Key Management Service(KMS)のキーリングと鍵を作成します。
  • Cloud DNS 限定公開マネージド ゾーンとレコードを作成する。
  • 公開 API に対して解決された KMS API(リージョンとグローバルの両方)にアクセスします。
  • PSC エンドポイントに対して KMS API(リージョンとグローバルの両方)にアクセスします。

必要なもの

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

2. テスト環境

コンシューマ VPC は us-central1 リージョンに作成され、VM と HTTP(S) 内部ロードバランサの転送ルールをホストするためのサブネットが 1 つ、HTTP(S) 内部ロードバランサで使用されるプロキシ専用サブネットが 1 つあります。まず、鍵管理システム(KMS)でキーリングと鍵を作成し、公開 API エンドポイントに解決します。次に、us-central1 のリージョン KMS エンドポイントに解決する PSC エンドポイントを作成します。

13681df518662ba.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
export zone=us-central1-a
echo $project
echo $region
echo $zone

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

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

5. VPC ネットワーク、サブネット、ファイアウォール ルールを作成する

VPC ネットワーク

Cloud Shell から

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

サブネットの作成

Cloud Shell から

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

このラボでは、リージョン API バックエンドを指す内部 L7 リージョン ロードバランサを作成します。Google の内部 L7 ロードバランサはプロキシ ロードバランサであるため、プロキシを実行するロードバランサ専用のプロキシ サブネットを作成する必要があります。プロキシ専用サブネットの詳細については、こちらをご覧ください。

Cloud Shell から

gcloud compute networks subnets create proxy-subnet1 \
--purpose=INTERNAL_HTTPS_LOAD_BALANCER \
--role=ACTIVE \
--network consumer-vpc \
--range 10.100.100.0/24 \
--region $region

ファイアウォール ルールを作成する

このラボでは、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 consumer-vpc \
--allow tcp:22 \
--source-ranges=35.235.240.0/20

Cloud NAT インスタンスを作成する

Linux パッケージのディストリビューションをダウンロードするには、Cloud NAT を作成する必要があります。

Cloud Router の作成

Cloud Shell から

gcloud compute routers create crnat \
    --network consumer-vpc \
    --region $region

Cloud NAT を作成する

Cloud Shell から

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

6. 鍵管理キーリングと鍵の作成

Cloud Shell から

gcloud kms keyrings create central-keyring \
    --location $region

gcloud kms keyrings create global-keyring \
    --location global

Cloud Shell から

gcloud kms keys create central-key \
    --location $region \
    --keyring central-keyring \
    --purpose encryption

gcloud kms keys create global-key \
    --location global \
    --keyring global-keyring \
    --purpose encryption

Cloud Shell で、キーリングと鍵が us-central1 リージョンに正常に作成されたことを確認します。

gcloud kms keys list \
    --location $region \
    --keyring central-keyring

期待される結果

NAME: projects/<PROJECT_ID>/locations/us-central1/keyRings/central-keyring/cryptoKeys/central-key
PURPOSE: ENCRYPT_DECRYPT
ALGORITHM: GOOGLE_SYMMETRIC_ENCRYPTION
PROTECTION_LEVEL: SOFTWARE
LABELS:
PRIMARY_ID: 1
PRIMARY_STATE: ENABLED

Cloud Shell から

gcloud kms keys list \
    --location global \
    --keyring global-keyring

期待される結果

NAME: projects/<PROJECT_ID>/locations/global/keyRings/global-keyring/cryptoKeys/global-key
PURPOSE: ENCRYPT_DECRYPT
ALGORITHM: GOOGLE_SYMMETRIC_ENCRYPTION
PROTECTION_LEVEL: SOFTWARE
LABELS:
PRIMARY_ID: 1
PRIMARY_STATE: ENABLED

後の接続で使用するため、鍵に指定されたフルパス名をメモしておきます。

7. クライアント VM を作成して KMS リージョン エンドポイントに接続する

次に、クライアント VM を作成し、VM に SSH で接続して、us-central1 リージョン KMS API エンドポイントの解決をテストします。

Cloud Shell から

gcloud compute instances create client-vm \
    --network=consumer-vpc \
    --subnet=consumer-subnet-1 \
    --zone=$zone \
    --no-address \
    --scopes=https://www.googleapis.com/auth/cloud-platform \
    --image-family=debian-10 \
    --image-project=debian-cloud \
    --metadata startup-script='#! /bin/bash
    sudo apt-get update
    sudo apt-get install dnsutils -y
    sudo apt-get install tcpdump -y'

次に、デフォルトの Compute サービス アカウントを更新して、作成した KMS 鍵にアクセスできるようにする必要があります。デフォルトのコンピューティング サービス アカウントの形式は <Project_Number> です。-compute@developer.gserviceaccount.com.プロジェクト番号を取得するには、Cloud Shell から次のコマンドを実行して、返された結果の最後の行の番号をコピーします。

 gcloud projects describe $project

デフォルトの Compute サービス アカウントを更新して、作成した KMS 鍵にアクセスできるようにします。

Cloud Shell から

 gcloud kms keys add-iam-policy-binding central-key \
    --location $region \
    --keyring central-keyring \
    --member serviceAccount:<PROJECT_NUMBER>-compute@developer.gserviceaccount.com \
    --role roles/cloudkms.admin


gcloud kms keys add-iam-policy-binding global-key \
    --location global \
    --keyring global-keyring \
    --member serviceAccount:<PROJECT_NUMBER>-compute@developer.gserviceaccount.com \
    --role roles/cloudkms.admin

[+] をクリックして、追加の Cloud Shell ターミナルを作成します(以下のスクリーンショット)。

a36edc967333315a.png

タブ 2 で、IAP を介してトンネルして client-vm に SSH 接続します。環境変数は保持されないため、以下のコマンドにプロジェクト ID を追加する必要があります。

Cloud Shell から

gcloud beta compute ssh --zone us-central1-a "client-vm" \
--tunnel-through-iap \
--project <PROJECT_ID>

先ほどメモした KMS 鍵名を使用して、KMS リージョン API エンドポイントに接続します。

タブ 2 から client-vm

curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" \
--resolve cloudkms.googleapis.com:443:us-central1-cloudkms.googleapis.com \
https://cloudkms.googleapis.com/v1/projects/<YOUR_PROJECT_ID>/locations/us-central1/keyRings/central-keyring/cryptoKeys/central-key

期待される結果

{
  "name": "projects/<PROJECT_ID>/locations/us-central1/keyRings/central-keyring/cryptoKeys/central-key",
  "primary": {
    "name": "projects/<PROJECT_ID>/locations/us-central1/keyRings/central-keyring/cryptoKeys/central-key/cryptoKeyVersions/1",
    "state": "ENABLED",
    "createTime": "2021-11-12T17:41:21.543348620Z",
    "protectionLevel": "SOFTWARE",
    "algorithm": "GOOGLE_SYMMETRIC_ENCRYPTION",
    "generateTime": "2021-11-12T17:41:21.543348620Z"
  },
  "purpose": "ENCRYPT_DECRYPT",
  "createTime": "2021-11-12T17:41:21.543348620Z",
  "versionTemplate": {
    "protectionLevel": "SOFTWARE",
    "algorithm": "GOOGLE_SYMMETRIC_ENCRYPTION"
  },
  "destroyScheduledDuration": "86400s"
}

タブ 2 から client-vm

curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" \
--resolve cloudkms.googleapis.com:443:cloudkms.googleapis.com \
https://cloudkms.googleapis.com/v1/projects/<YOUR_PROJECT_ID>/locations/global/keyRings/global-keyring/cryptoKeys/global-key

期待される結果

{
  "name": "projects/<PROJECT_ID>/locations/global/keyRings/global-keyring/cryptoKeys/global-key",
  "primary": {
    "name": "projects/<PROJECT_ID>/locations/global/keyRings/global-keyring/cryptoKeys/global-key/cryptoKeyVersions/1",
    "state": "ENABLED",
    "createTime": "2021-11-22T19:19:43.271238847Z",
    "protectionLevel": "SOFTWARE",
    "algorithm": "GOOGLE_SYMMETRIC_ENCRYPTION",
    "generateTime": "2021-11-22T19:19:43.271238847Z"
  },  "purpose": "ENCRYPT_DECRYPT",
  "createTime": "2021-11-22T19:19:43.271238847Z",
  "versionTemplate": {
    "protectionLevel": "SOFTWARE",
    "algorithm": "GOOGLE_SYMMETRIC_ENCRYPTION"
  },
  "destroyScheduledDuration": "86400s"}

DNS が us-central KMS エンドポイントを解決する場所をグローバル エンドポイントと比較して確認します。

tab2 から client-vm

dig us-central1-cloudkms.googleapis.com

期待される結果

; <<>> DiG 9.11.5-P4-5.1+deb10u6-Debian <<>> us-central1-cloudkms.googleapis.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4383
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;us-central1-cloudkms.googleapis.com. IN        A

;; ANSWER SECTION:
us-central1-cloudkms.googleapis.com. 300 IN A   142.250.125.95

;; Query time: 4 msec
;; SERVER: 169.254.169.254#53(169.254.169.254)
;; WHEN: Fri Nov 12 20:40:05 UTC 2021
;; MSG SIZE  rcvd: 80

タブ 2 から client-vm

dig cloudkms.googleapis.com

期待される結果

; <<>> DiG 9.11.5-P4-5.1+deb10u6-Debian <<>> cloudkms.googleapis.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 49528
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;cloudkms.googleapis.com.       IN      A

;; ANSWER SECTION:
cloudkms.googleapis.com. 300    IN      A       209.85.200.95

;; Query time: 8 msec
;; SERVER: 169.254.169.254#53(169.254.169.254)
;; WHEN: Mon Nov 22 15:26:17 UTC 2021
;; MSG SIZE  rcvd: 68

dig の結果から、us-central1 リージョン KMS エンドポイントと Global KMS エンドポイントの DNS 解決が外部 IP アドレスに解決されていることがわかります。(注: 表示される IP アドレスは外部 IP アドレスとは異なる場合があります。これは Google API の通常の動作です)。

次のセクションでは、Cloud Shell の最初のタブに戻ります。

8. Private Service Connect エンドポイントを作成する

バックエンド サービスとして us-central1 リージョン KMS エンドポイントを参照するネットワーク エンドポイント グループを持つ内部 HTTP(S) ロードバランサを作成します。ロードバランサの転送ルールは、Private Service Connect エンドポイントとして機能します。

タイプが Privet Service Connect でネットワーク エンドポイント グループ(NEG)を作成し、ターゲット サービスである us-central1-cloudkms.googleapis.com を作成する。

Cloud Shell から

gcloud beta compute network-endpoint-groups create l7psc-kms-neg \
  --network-endpoint-type=private-service-connect \
  --psc-target-service=us-central1-cloudkms.googleapis.com \
  --region=$region

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

Cloud Shell から

gcloud compute backend-services create l7-psc-kms \
  --load-balancing-scheme=INTERNAL_MANAGED \
  --protocol=HTTP \
  --region=$region

NEG をバックエンド サービスに追加します。

Cloud Shell から

gcloud beta compute backend-services add-backend l7-psc-kms \
  --network-endpoint-group=l7psc-kms-neg \
  --region=$region

ロードバランサの URL マップを作成します。

Cloud Shell から

gcloud compute url-maps create l7-psc-url-map \
  --default-service=l7-psc-kms \
  --region=$region

エンドポイントが使用するカスタム URL のパスマッチャーを作成します。

Cloud Shell から

gcloud compute url-maps add-path-matcher l7-psc-url-map \
 --path-matcher-name=example \
 --default-service=l7-psc-kms \
 --region=$region

カスタム URL us-central1-cloudkms.example.com のホストルールを作成します。

Cloud Shell から

gcloud compute url-maps add-host-rule l7-psc-url-map \
--hosts=us-central1-cloudkms.example.com \
--path-matcher-name=example \
--region=$region

ロードバランサのターゲット プロキシを作成します。本番環境のユースケースでは、最後のコマンドで構成したホストに HTTP(S) 証明書とカスタム証明書を使用することをおすすめします。

Cloud Shell から

gcloud compute target-http-proxies create psc-http-proxy \
    --url-map=l7-psc-url-map \
    --region=$region

Private Service Connect エンドポイントとして機能するロードバランサの転送ルールを作成します。

Cloud Shell から

gcloud beta compute forwarding-rules create l7-psc-forwarding-rule \
  --load-balancing-scheme=INTERNAL_MANAGED \
  --network=consumer-vpc \
  --subnet=consumer-subnet-1 \
  --address=10.0.0.100 \
  --ports=80 \
  --region=$region \
  --target-http-proxy=psc-http-proxy \
  --target-http-proxy-region=$region

9. DNS 構成

このセクションでは、example.com の限定公開 DNS ゾーンと、前のステップで作成した転送ルールを参照する A レコードを作成します。

マネージド DNS 限定公開ゾーンを作成します。

Cloud Shell から

gcloud dns managed-zones create example \
    --description="example domain for KMS" \
    --dns-name=example.com \
    --networks=consumer-vpc \
    --visibility=private

us-central1-cloudkms.example.com の A レコードを作成する。

Cloud Shell から

gcloud dns record-sets transaction start \
   --zone=example

gcloud dns record-sets transaction add 10.0.0.100 \
   --name=us-central1-cloudkms.example.com \
   --ttl=300 \
   --type=A \
   --zone=example

gcloud dns record-sets transaction execute \
   --zone=example

10. PSC を介してリージョン KMS エンドポイントに接続する

タブ 2 の client-vm に戻り、tcpdump を実行してすべての接続の詳細を確認し、PSC エンドポイントを経由するリージョン エンドポイントとグローバル エンドポイントの両方への接続をテストします。

sudo tcpdump -i any net 10.0.0.100 or port 53 -n

Cloud Shell で 3 つ目のタブを開き、client-vm に SSH 接続します。

curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" \
http://us-central1-cloudkms.example.com/v1/projects/<YOUR_PROJECT_ID>/locations/us-central1/keyRings/central-keyring/cryptoKeys/central-key

想定される結果 + TCPDUMP

{
  "name": "projects/psc-2-321213/locations/us-central1/keyRings/central-keyring/cryptoKeys/central-key",
  "primary": {
    "name": "projects/psc-2-321213/locations/us-central1/keyRings/central-keyring/cryptoKeys/central-key/cryptoKeyVersions/1",
    "state": "ENABLED",
    "createTime": "2021-11-12T17:41:21.543348620Z",
    "protectionLevel": "SOFTWARE",
    "algorithm": "GOOGLE_SYMMETRIC_ENCRYPTION",
    "generateTime": "2021-11-12T17:41:21.543348620Z"
  },
  "purpose": "ENCRYPT_DECRYPT",
  "createTime": "2021-11-12T17:41:21.543348620Z",
  "versionTemplate": {
    "protectionLevel": "SOFTWARE",
    "algorithm": "GOOGLE_SYMMETRIC_ENCRYPTION"
  },
  "destroyScheduledDuration": "86400s"
}

---

19:54:42.924923 IP 10.0.0.3.55290 > 169.254.169.254.53: 26132+ A? cloudkms.googleapis.com. (41)
19:54:42.925137 IP 10.0.0.3.55290 > 169.254.169.254.53: 40734+ AAAA? cloudkms.googleapis.com. (41)
19:54:42.931480 IP 169.254.169.254.53 > 10.0.0.3.55290: 26132 1/0/0 A 10.0.0.100 (57)
19:54:42.931781 IP 169.254.169.254.53 > 10.0.0.3.55290: 40734 1/0/0 AAAA 2607:f8b0:4001:c0d::5f (69)
19:54:42.932285 IP 10.0.0.3.57136 > 10.0.0.100.80: Flags [S], seq 3382081170, win 65320, options [mss 1420,sackOK,TS val 1907763603 ecr 0,nop,wscale 7], length 0
19:54:42.934951 IP 10.0.0.100.80 > 10.0.0.3.57136: Flags [S.], seq 3147938658, ack 3382081171, win 65535, options [mss 1420,sackOK,TS val 3206048204 ecr 1907763603,nop,wscale 8], length 0
19:54:42.934978 IP 10.0.0.3.57136 > 10.0.0.100.80: Flags [.], ack 1, win 511, options [nop,nop,TS val 1907763606 ecr 3206048204], length 0
19:54:42.935182 IP 10.0.0.3.57136 > 10.0.0.100.80: Flags [P.], seq 1:422, ack 1, win 511, options [nop,nop,TS val 1907763606 ecr 3206048204], length 421: HTTP: GET /v1/projects/<PROJECT_ID/locations/us-central1/keyRings/central-keyring/cryptoKeys/central-key HTTP/1.1
19:54:42.935614 IP 10.0.0.100.80 > 10.0.0.3.57136: Flags [.], ack 422, win 261, options [nop,nop,TS val 3206048205 ecr 1907763606], length 0
19:54:43.010268 IP 10.0.0.100.80 > 10.0.0.3.57136: Flags [P.], seq 1:1072, ack 422, win 261, options [nop,nop,TS val 3206048280 ecr 1907763606], length 1071: HTTP: HTTP/1.1 200 OK
19:54:43.010295 IP 10.0.0.3.57136 > 10.0.0.100.80: Flags [.], ack 1072, win 503, options [nop,nop,TS val 1907763681 ecr 3206048280], length 0
19:54:43.011545 IP 10.0.0.3.57136 > 10.0.0.100.80: Flags [F.], seq 422, ack 1072, win 503, options [nop,nop,TS val 1907763683 ecr 3206048280], length 0
19:54:43.012013 IP 10.0.0.100.80 > 10.0.0.3.57136: Flags [F.], seq 1072, ack 423, win 261, options [nop,nop,TS val 3206048282 ecr 1907763683], length 0
19:54:43.012021 IP 10.0.0.3.57136 > 10.0.0.100.80: Flags [.], ack 1073, win 503, options [nop,nop,TS val 1907763683 ecr 3206048282], length 0

タブ 2 のウィンドウをもう一度確認して、tcpdump 情報を調べます。作成した PSC エンドポイントを介して Cloud KMS リージョン エンドポイントにアクセスでき、us-central1 リージョン エンドポイントが、作成した Managed Cloud DNS ゾーンに限定公開で解決されることがわかります。

タブ 3: client-vm

curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" \
http://us-central1-cloudkms.example.com/v1/projects/<YOUR_PROJECT_ID>/locations/global/keyRings/global-keyring/cryptoKeys/global-key

想定される結果 + TCPDUMP

{
  "error": {
    "code": 404,
    "message": "The request concerns location 'global' but was sent to location 'us-central1'. Either Cloud KMS is not available in 'global' or the request was misrouted. gRPC clients must ensure that 'x-goog-request-params' is specified in request metadata. See https://cloud.google.com/kms/docs/grpc for more information.",
    "status": "NOT_FOUND"
  }
}

---

20:04:32.199247 IP 10.0.0.3.57162 > 10.0.0.100.80: Flags [S], seq 2782317346, win 65320, options [mss 1420,sackOK,TS val 1908352831 ecr 0,nop,wscale 7], length 0
20:04:32.201643 IP 10.0.0.100.80 > 10.0.0.3.57162: Flags [S.], seq 1927472124, ack 2782317347, win 65535, options [mss 1420,sackOK,TS val 3731555085 ecr 1908352831,nop,wscale 8], length 0
20:04:32.201666 IP 10.0.0.3.57162 > 10.0.0.100.80: Flags [.], ack 1, win 511, options [nop,nop,TS val 1908352834 ecr 3731555085], length 0
20:04:32.201812 IP 10.0.0.3.57162 > 10.0.0.100.80: Flags [P.], seq 1:415, ack 1, win 511, options [nop,nop,TS val 1908352834 ecr 3731555085], length 414: HTTP: GET /v1/projects/<YOUR_PROJECT_ID>/locations/global/keyRings/global-keyring/cryptoKeys/global-key HTTP/1.1
20:04:32.202308 IP 10.0.0.100.80 > 10.0.0.3.57162: Flags [.], ack 415, win 261, options [nop,nop,TS val 3731555086 ecr 1908352834], length 0
20:04:32.237629 IP 10.0.0.100.80 > 10.0.0.3.57162: Flags [P.], seq 1:760, ack 415, win 261, options [nop,nop,TS val 3731555121 ecr 1908352834], length 759: HTTP: HTTP/1.1 404 Not Found
20:04:32.237656 IP 10.0.0.3.57162 > 10.0.0.100.80: Flags [.], ack 760, win 506, options [nop,nop,TS val 1908352870 ecr 3731555121], length 0
20:04:32.238283 IP 10.0.0.3.57162 > 10.0.0.100.80: Flags [F.], seq 415, ack 760, win 506, options [nop,nop,TS val 1908352870 ecr 3731555121], length 0
20:04:32.238833 IP 10.0.0.100.80 > 10.0.0.3.57162: Flags [F.], seq 760, ack 416, win 261, options [nop,nop,TS val 3731555122 ecr 1908352870], length 0
20:04:32.238851 IP 10.0.0.3.57162 > 10.0.0.100.80: Flags [.], ack 761, win 506, options [nop,nop,TS val 1908352871 ecr 3731555122], length 0

グローバル Cloud KMS 鍵/キーリングにアクセスしようとすると、エラーが発生します。これらの接続試行は tcpdump でも確認できます。

タブ 3 の client-vm

dig us-central1-cloudkms.example.com

期待される結果

; <<>> DiG 9.11.5-P4-5.1+deb10u7-Debian <<>> us-central1-cloudkms.example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 27474
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;us-central1-cloudkms.example.com. IN   A

;; ANSWER SECTION:
us-central1-cloudkms.example.com. 300 IN A      10.0.0.100

;; Query time: 7 msec
;; SERVER: 169.254.169.254#53(169.254.169.254)
;; WHEN: Mon May 23 16:22:12 UTC 2022
;; MSG SIZE  rcvd: 77

dig で、us-central1-cloudkms.googleapis.com 用に作成したカスタム URL が PSC エンドポイントを指し、そのリージョンで作成されたリソースのみが解決されることがわかります。

client-vm への両方の SSH タブを閉じます。

11. クリーンアップ手順

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

gcloud dns record-sets transaction start --zone=example

gcloud dns record-sets transaction remove 10.0.0.100 \
    --name=us-central1-cloudkms.example.com \
    --ttl=300 \
    --type=A \
    --zone=example

gcloud dns record-sets transaction execute --zone=example

gcloud dns managed-zones delete example

gcloud compute forwarding-rules delete l7-psc-forwarding-rule --region=$region --quiet

gcloud compute target-http-proxies delete psc-http-proxy --region=$region --quiet

gcloud compute url-maps delete l7-psc-url-map --region=$region --quiet

gcloud compute backend-services delete l7-psc-kms --region=$region --quiet

gcloud compute network-endpoint-groups delete l7psc-kms-neg --region=$region --quiet

gcloud compute instances delete client-vm --zone=$zone --quiet

#Replace PROJECT_NUMBER
gcloud kms keys remove-iam-policy-binding global-key --keyring=global-keyring --location=global \
--member=serviceAccount:<PROJECT_NUMBER>-compute@developer.gserviceaccount.com \
--role roles/cloudkms.admin

#Replace PROJECT_NUMBER
gcloud kms keys remove-iam-policy-binding central-key --keyring=central-keyring --location=$region \
--member=serviceAccount:<PROJECT_NUMBER>-compute@developer.gserviceaccount.com \
--role roles/cloudkms.admin

gcloud kms keys versions destroy 1 --location=global --keyring=global-keyring --key=global-key

gcloud kms keys versions destroy 1 --location=$region --keyring=central-keyring --key=central-key

gcloud compute routers nats delete central-nat --router=crnat --region=$region --quiet

gcloud compute routers delete crnat --region=$region --quiet

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

gcloud compute networks subnets delete proxy-subnet1 --region=$region --quiet

gcloud compute networks subnets delete consumer-subnet-1 --region=$region --quiet

gcloud compute networks delete consumer-vpc --quiet

12. 完了

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

学習した内容

  • コンシューマ HTTP(S) Service Controls を使用して Private Service Connect エンドポイントを作成する
  • Cloud Key Management Service(KMS)のキーリングと鍵を作成する。
  • Cloud DNS 限定公開マネージド ゾーンとレコードを作成する。
  • 公開 API に対して解決された KMS API へのアクセス(リージョンとグローバルの両方)。
  • PSC エンドポイントに対して KMS API(リージョンおよびグローバルの両方)にアクセスする。