Private Service Connect - 리전별 Google API에 소비자 HTTP(S) 서비스 제어 사용

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) 서비스 제어로 Private Service Connect 엔드포인트 만들기
  • Cloud Key Management Service (KMS) 키링 및 키를 만듭니다.
  • Cloud DNS 관리형 비공개 영역 및 A 레코드 만들기
  • 공개 API에 대해 확인된 KMS API (리전 및 전역)에 액세스합니다.
  • PSC 엔드포인트에 대해 KMS API (리전 및 전역)에 액세스합니다.

필요한 항목

  • 인스턴스 배포 및 네트워킹 구성요소 구성에 관한 지식

2. 테스트 환경

VM 호스팅을 위한 us-central1 리전에 서브넷 1개, HTTP(S) 내부 부하 분산기 전달 규칙, HTTP(S) 내부 부하 분산기와 함께 사용할 프록시 전용 서브넷 1개가 포함된 소비자 VPC가 생성됩니다. 먼저 키 관리 시스템 (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를 참조해야 하며(일반적으로 PROJECT_ID로 식별됨), 마음에 들지 않는 경우 임의로 다시 생성하거나 직접 지정해서 사용할 수 있는지 확인하세요. 프로젝트가 생성되면 프로젝트 ID가 '고정'됩니다.
  • 세 번째 값은 일부 API에서 사용하는 프로젝트 번호입니다. 이 세 가지 값에 대한 자세한 내용은 문서를 참조하세요.
  1. 다음으로 Cloud 리소스/API를 사용하려면 Cloud Console에서 결제를 사용 설정해야 합니다. 이 Codelab 실행에는 많은 비용이 들지 않습니다. 이 튜토리얼을 마친 후 비용이 결제되지 않도록 리소스를 종료하려면 Codelab의 끝에 있는 '삭제' 안내를 따르세요. Google Cloud 새 사용자에게는 미화 $300 상당의 무료 체험판 프로그램에 참여할 수 있는 자격이 부여됩니다.

Cloud Shell 시작

Google Cloud를 노트북에서 원격으로 실행할 수 있지만, 이 Codelab에서는 Cloud에서 실행되는 명령줄 환경인 Google Cloud Shell을 사용합니다.

Google Cloud Console의 오른쪽 상단 툴바에 있는 Cloud Shell 아이콘을 클릭합니다.

55efc1aaa7a4d3ad.png

환경을 프로비저닝하고 연결하는 데 몇 분 정도 소요됩니다. 완료되면 다음과 같이 표시됩니다.

7ffe5cbb04455448.png

가상 머신에는 필요한 개발 도구가 모두 들어있습니다. 영구적인 5GB 홈 디렉토리를 제공하고 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'

그런 다음 생성한 KMS 키에 액세스할 수 있도록 기본 Compute 서비스 계정을 업데이트해야 합니다. 기본 컴퓨팅 서비스 계정의 형식은 <Project_Number>입니다. -compute@developer.gserviceaccount.com. 프로젝트 번호를 가져오려면 Cloud Shell에서 다음 명령어를 실행하고 반환 결과의 마지막 줄에 있는 번호를 복사합니다.

 gcloud projects describe $project

생성한 KMS 키에 액세스할 수 있도록 기본 Compute 서비스 계정을 업데이트하세요.

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로 연결합니다. 환경 변수는 제공되지 않으며 아래 명령어에 project-id를 추가해야 합니다.

Cloud Shell 사용

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

앞서 기록한 KMS 키 이름을 사용하여 KMS Regional 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

조사 결과에서 us-central1 리전 KMS 엔드포인트와 전역 KMS 엔드포인트의 DNS 변환이 외부 IP 주소로 확인되는 것을 확인할 수 있습니다. (참고: 표시된 IP 주소는 다른 외부 IP 주소일 수 있습니다. 이는 정상적인 Google API 동작입니다.)

다음 섹션에서 Cloud Shell의 첫 번째 탭으로 다시 전환합니다.

8. Private Service Connect 엔드포인트 만들기

백엔드 서비스로 us-central1 리전 KMS 엔드포인트를 가리키는 네트워크 엔드포인트 그룹이 있는 내부 HTTP(S) 부하 분산기를 만듭니다. 부하 분산기의 전달 규칙이 Private Service Connect 엔드포인트 역할을 합니다.

Privet Service Connect 유형 및 대상 서비스 us-central1-cloudkms.googleapis.com을 사용하여 네트워크 엔드포인트 그룹 (NEG)을 만듭니다.

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에서 세 번째 탭을 열고 SSH를 통해 client-vm에 연결합니다.

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 리전 엔드포인트는 생성된 관리형 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

분석을 통해 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) 서비스 제어로 Private Service Connect 엔드포인트 만들기
  • Cloud Key Management Service (KMS) 키링 및 키 만들기
  • Cloud DNS 관리형 비공개 영역 및 A 레코드 만들기
  • KMS API (리전 및 전역) 액세스가 공개 API에 대해 확인됩니다.
  • PSC 엔드포인트에 대해 KMS API (리전 및 전역)에 액세스합니다.