1. 소개
Private Service Connect (PSC) 네트워크 엔드포인트 그룹 (NEG)은 내부 HTTPS 부하 분산기와 외부 HTTPS 부하 분산기를 연결하는 것을 지원합니다. 이를 통해 고객 정의 범위를 사용하여 온프레미스에 분산 상태 점검 및 데이터 영역 트래픽을 제공합니다. 또한 이 토폴로지에서는 여러 리전 InterConnect를 통해 온프레미스에 연결되는 여러 VPC도 지원됩니다.
이 Codelab에서는 아래 토폴로지를 기반으로 이 엔드 투 엔드를 구성하는 방법을 보여줍니다. 왼쪽에서 오른쪽으로 온프레미스 고객은 HTTP 서비스를 시뮬레이션하는 VM을 보유하고, 하이브리드 연결 (HA-VPN 또는 InterConnect) 및 하이브리드 NEG를 활용하여 내부 HTTPS 부하 분산기를 통해 노출합니다. PSC는 내부 HTTPS LB를 서비스 연결로 사용합니다. PSC NEG는 외부 HTTPS LB에 노출된 첨부파일을 백엔드 서비스로 사용합니다. 인터넷 사용자는 Google 글로벌 네트워크를 사용하여 온프레미스 HTTP 서비스 액세스를 가속화할 수 있습니다.

그림 1. Private Service Connect는 네트워크 엔드포인트 그룹과 서비스 연결을 사용하여 외부 HTTPS 부하 분산기를 내부 HTTPS 부하 분산기에 연결하고 백엔드를 온프레미스로 확장합니다.
학습할 내용
- 하이브리드 NEG 및 분산 상태 점검이 있는 내부 HTTPS 부하 분산기
- 내부 HTTPS 부하 분산기가 있는 PSC 서비스 연결
- PSC 네트워크 엔드포인트 그룹 설정
- 외부 HTTPS 부하 분산기로 PSC NEG 노출
필요한 항목
- HA VPN과 같은 하이브리드 연결에 대한 지식
- 내부/외부 HTTPS 부하 분산에 대한 지식
- Private Service Connect에 대한 지식
2. 시작하기 전에
참고: Codelab에서는 그림에 표시된 토폴로지를 기반으로 구성 및 검증 단계를 제공합니다. 조직의 요구사항에 맞게 절차를 수정하세요. IAM 권한은 Codelab의 범위에 포함되지 않습니다.
Codelab에서는 하나의 프로젝트를 사용하여 전체 프로세스를 시뮬레이션합니다. 여러 프로젝트도 지원됩니다.
단일 프로젝트 - 프로듀서 및 컨슈머 네트워크를 지원하도록 프로젝트 업데이트
Cloud Shell 내에 프로젝트 ID가 설정되어 있는지 확인합니다.
gcloud config list project gcloud config set project [YOUR-PROJECT-NAME] prodproject=YOUR-PROJECT-NAME echo $prodproject
3. 온프렘 리소스 만들기
다음 섹션에서는 고객 온프레미스 서비스를 시뮬레이션하기 위해 온프레미스 VPC와 VM을 설정합니다.
VPC 네트워크
Cloud Shell 사용
gcloud compute networks create vpc-demo-onprem --project=$prodproject --subnet-mode=custom
서브넷 만들기
Cloud Shell 사용
gcloud compute networks subnets create vpc-demo-onprem-asia-southeast1 --project=$prodproject --range=10.0.0.0/24 --network=vpc-demo-onprem --region=asia-southeast1
방화벽 규칙을 만듭니다.
내부 HTTPS 부하 분산기는 분산 상태 점검을 지원하므로 방화벽 규칙은 프록시 서브넷 IP 범위만 허용하면 됩니다. 문서에 따라 프로젝트를 허용 목록에 추가합니다.
Cloud Shell에서 프록시 서브넷의 백엔드 상태 점검 및 데이터 플레인 트래픽을 사용 설정하는 방화벽 규칙을 만듭니다.
gcloud compute firewall-rules create vpc-demo-health-checks --allow tcp:80,tcp:443 --network vpc-demo-onprem --source-ranges 10.0.3.0/24 --enable-logging
Cloud Shell에서 IAP가 VM 인스턴스에 연결할 수 있도록 방화벽 규칙을 만듭니다.
gcloud compute firewall-rules create psclab-iap-prod --network vpc-demo-onprem --allow tcp:22 --source-ranges=35.235.240.0/20 --enable-logging
4. 온프레미스 VM 인스턴스 만들기
이 VM은 온프레미스 서비스를 시뮬레이션하며 하이브리드 NEG를 사용하여 내부 HTTPS 부하 분산기로 노출해야 합니다.
Cloud Shell에서 www01 인스턴스를 만듭니다.
gcloud compute instances create www01 \
--zone=asia-southeast1-b \
--image-family=debian-11 \
--image-project=debian-cloud \
--network-interface=network-tier=PREMIUM,nic-type=GVNIC,stack-type=IPV4_ONLY,subnet=vpc-demo-onprem-asia-southeast1 \
--shielded-secure-boot \
--shielded-vtpm \
--shielded-integrity-monitoring \
--metadata=startup-script='#! /bin/bash
sudo apt-get update
sudo apt-get install nginx -y
vm_hostname="$(curl -H "Metadata-Flavor:Google" \
http://169.254.169.254/computeMetadata/v1/instance/name)"
filter="{print \$NF}"
vm_zone="$(curl -H "Metadata-Flavor:Google" \
http://169.254.169.254/computeMetadata/v1/instance/zone \
| awk -F/ "${filter}")"
echo "Page on $vm_hostname in $vm_zone" | \
tee /var/www/html/index.nginx-debian.html
sudo systemctl restart nginx'
다음 섹션에서는 letsencrypt를 사용하여 인증서를 생성하고 Nginx에 설치합니다. 다음 단계를 위해 공개 키 및 비공개 키 파일을 다운로드합니다. 인증서를 생성하려면 TCP 포트 80을 인터넷에 일시적으로 열어야 합니다.
이 VM에 공개적으로 확인된 도메인 이름이 있는지 확인합니다. 예를 들어 Cloud DNS에서 A 레코드 [www01.yinghli.demo.altostrat.com](http://www01.yinghli.demo.altostrat.com)를 추가하고 VM 공개 IP 주소를 가리킵니다.
gcloud dns --project=$prodproject record-sets create www01.yinghli.demo.altostrat.com. --zone="yinghli-demo" --type="A" --ttl="300" --rrdatas="34.87.77.186"
VM www01 콘솔에서 안내에 따라 Nginx에 인증서를 설치하고 다음 단계를 위해 fullchain.pem과 private.pem의 사본을 만듭니다.
sudo apt install snapd sudo snap install core; sudo snap refresh core sudo snap install --classic certbot sudo ln -s /snap/bin/certbot /usr/bin/certbot sudo certbot --nginx
5. 프로듀서 VPC 네트워크 만들기
참고: 하이브리드 네트워킹 구성은 이 구성에 포함되지 않습니다.
VPC 네트워크
Cloud Shell 사용
gcloud compute networks create vpc-demo-producer --project=$prodproject --subnet-mode=custom
서브넷 만들기
Cloud Shell 사용
gcloud compute networks subnets create vpc-demo-asia-southeast1 --project=$prodproject --range=10.0.2.0/24 --network=vpc-demo-producer --region=asia-southeast1
프록시 서브넷 만들기
Cloud Shell 사용
gcloud compute networks subnets create proxy-subnet-asia-southeast1 \ --purpose=REGIONAL_MANAGED_PROXY \ --role=ACTIVE \ --region=asia-southeast1 \ --network=vpc-demo-producer \ --range=10.0.3.0/24
하이브리드 연결
Cloud VPN 문서에 따라 온프레미스와 프로듀서 VPC 간에 HA-VPN 연결을 구현합니다. Cloud Router에서 기본 구성을 유지합니다. BGP 공지에 130.211.0.0/22, 35.191.0.0/16을 추가할 필요가 없습니다.
6. 프로듀서 하이브리드 NEG 만들기
하이브리드 네트워크 엔드포인트 그룹을 만들고 온프레미스 VM IP:PORT를 NEG에 추가합니다.
Cloud Shell 사용
gcloud compute network-endpoint-groups create on-prem-service-neg \
--network-endpoint-type=NON_GCP_PRIVATE_IP_PORT \
--zone=asia-southeast1-b \
--network=vpc-demo-producer
gcloud compute network-endpoint-groups update on-prem-service-neg \
--zone=asia-southeast1-b \
--add-endpoint="ip=10.0.0.2,port=443"
7. 프로듀서 내부 HTTPS 부하 분산기 만들기
현재 외부 HTTPS 부하 분산기는 PSC NEG에 대한 HTTPS 프로토콜만 지원합니다( 문서). 게시된 서비스의 경우 내부 HTTPS 부하 분산기를 사용하고 전달 규칙 전역 액세스를 사용 설정해야 합니다.
Cloud Shell에서 리전 상태 확인을 만듭니다.
gcloud compute health-checks create https on-prem-service-hc \
--region=asia-southeast1 \
--use-serving-port
Cloud Shell에서 백엔드 서비스를 만들고 하이브리드 NEG를 추가합니다.
gcloud compute backend-services create on-premise-service-backend \ --load-balancing-scheme=INTERNAL_MANAGED \ --protocol=HTTPS \ --region=asia-southeast1 \ --health-checks=on-prem-service-hc \ --health-checks-region=asia-southeast1 gcloud compute backend-services add-backend on-premise-service-backend \ --network-endpoint-group=on-prem-service-neg \ --network-endpoint-group-zone=asia-southeast1-b \ --region=asia-southeast1 \ --balancing-mode=RATE \ --max-rate-per-endpoint=100
Cloud Shell에서 URL 맵을 만듭니다.
gcloud compute url-maps create on-premise-url \
--default-service on-premise-service-backend \
--region=asia-southeast1
Cloud Shell에서 리전 SSL 인증서를 만듭니다. VM에서 두 개의 인증서 파일이 다운로드됩니다.
gcloud compute ssl-certificates create www01 \
--certificate=fullchain.pem \
--private-key=private.pem \
--region=asia-southeast1
Cloud Shell에서 https-target-proxy를 만듭니다.
gcloud compute target-https-proxies create on-premise-httpsproxy \
--ssl-certificates=www01 \
--url-map=on-premise-url \
--url-map-region=asia-southeast1 \
--region=asia-southeast1
Cloud Shell에서 내부 고정 IP를 예약하고 전달 규칙을 만듭니다.
gcloud compute addresses create ilbaddress \
--region=asia-southeast1 \
--subnet=vpc-demo-asia-southeast1 \
--addresses=10.0.2.100
gcloud compute forwarding-rules create https-ilb-psc \
--load-balancing-scheme=INTERNAL_MANAGED \
--network=vpc-demo-producer \
--subnet=vpc-demo-asia-southeast1 \
--address=ilbaddress \
--ports=443 \
--region=asia-southeast1 \
--target-https-proxy=on-premise-httpsproxy \
--target-https-proxy-region=asia-southeast1
--allow-global-access
8. 프로듀서 VM 인스턴스 만들기
확인을 위해 프로듀서 VM을 만듭니다.
Cloud Shell 사용
gcloud compute instances create test01 \
--zone=asia-southeast1-b \
--image-family=debian-11 \
--image-project=debian-cloud \
--network-interface=network-tier=PREMIUM,nic-type=GVNIC,stack-type=IPV4_ONLY,subnet=vpc-demo-asia-southeast1 \
--shielded-secure-boot \
--shielded-vtpm \
--shielded-integrity-monitoring
IAP가 VM 인스턴스에 연결하도록 하려면 다음과 같은 방화벽 규칙을 만드세요.
Cloud Shell 사용
gcloud compute firewall-rules create psclab-iap-prod --network vpc-demo-producer --allow tcp:22 --source-ranges=35.235.240.0/20 --enable-logging
생산자 VM 콘솔에서 [www01.yinghli.demo.altostrat.com](https://www01.yinghli.demo.altostrat.com)에 액세스하고 내부 HTTPS 부하 분산기 IP 주소를 확인합니다. HTTP 200은 구성이 예상대로 작동했음을 나타냅니다.
curl -v --resolve www01.yinghli.demo.altostrat.com:443:10.0.2.100 https://www01.yinghli.demo.altostrat.com * Added www01.yinghli.demo.altostrat.com:443:10.0.2.100 to DNS cache * Hostname www01.yinghli.demo.altostrat.com was found in DNS cache * Trying 10.0.2.100:443... * Connected to www01.yinghli.demo.altostrat.com (10.0.2.100) port 443 (#0) * ALPN, offering h2 * ALPN, offering http/1.1 * successfully set certificate verify locations: * CAfile: /etc/ssl/certs/ca-certificates.crt * CApath: /etc/ssl/certs * TLSv1.3 (OUT), TLS handshake, Client hello (1): * TLSv1.3 (IN), TLS handshake, Server hello (2): * TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8): * TLSv1.3 (IN), TLS handshake, Certificate (11): * TLSv1.3 (IN), TLS handshake, CERT verify (15): * TLSv1.3 (IN), TLS handshake, Finished (20): * TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1): * TLSv1.3 (OUT), TLS handshake, Finished (20): * SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384 * ALPN, server accepted to use h2 * Server certificate: * subject: CN=www01.yinghli.demo.altostrat.com * start date: Jun 4 10:36:43 2023 GMT * expire date: Sep 2 10:36:42 2023 GMT * subjectAltName: host "www01.yinghli.demo.altostrat.com" matched cert's "www01.yinghli.demo.altostrat.com" * issuer: C=US; O=Let's Encrypt; CN=R3 * SSL certificate verify ok. * Using HTTP2, server supports multi-use * Connection state changed (HTTP/2 confirmed) * Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0 * Using Stream ID: 1 (easy handle 0x55865ef982e0) > GET / HTTP/2 > Host: www01.yinghli.demo.altostrat.com > user-agent: curl/7.74.0 > accept: */* > * TLSv1.3 (IN), TLS handshake, Newsession Ticket (4): * TLSv1.3 (IN), TLS handshake, Newsession Ticket (4): * old SSL session ID is stale, removing * Connection state changed (MAX_CONCURRENT_STREAMS == 100)! < HTTP/2 200 < server: nginx/1.18.0 < date: Mon, 05 Jun 2023 02:29:38 GMT < content-type: text/html < content-length: 35 < last-modified: Sun, 04 Jun 2023 09:02:16 GMT < etag: "647c5318-23" < accept-ranges: bytes < via: 1.1 google < Page on www01 in asia-southeast1-b * Connection #0 to host www01.yinghli.demo.altostrat.com left intact
참고: 온프레미스 방화벽에서 프록시 서브넷 10.0.3.0/24에만 액세스를 허용하므로 VM 10.0.0.2 HTTPS 서비스에 직접 액세스할 수 없습니다.
9. PSC NAT 서브넷 만들기
Cloud Shell 사용
gcloud compute networks subnets create psc-nat-subnet \ --network=vpc-demo-producer \ --region=asia-southeast1 \ --range=10.0.5.0/24 \ --purpose=private-service-connect
10. HTTPS 서비스 연결 만들기
Cloud Shell에서 HTTPS 서비스 연결을 만듭니다.
gcloud compute service-attachments create ilbserviceattach \ --region=asia-southeast1 \ --producer-forwarding-rule=https-ilb-psc \ --connection-preference=ACCEPT_AUTOMATIC \ --nat-subnets=psc-nat-subnet
HTTPS 서비스 연결 유효성 검사
gcloud compute service-attachments describe ilbserviceattach --region asia-southeast1
서비스 연결 이름을 기록합니다.
projects/<project>/regions/asia-southeast1/serviceAttachments/ilbserviceattach
11. 소비자 VPC 네트워크 만들기
다음 섹션에서는 소비자 VPC가 동일한 프로젝트에 구성되지만 다른 프로젝트도 지원됩니다. 소비자와 프로듀서 네트워크 간의 통신은 프로듀서 네트워크에 정의된 서비스 연결을 통해 이루어집니다.
VPC 네트워크
Cloud Shell 사용
gcloud compute networks create vpc-demo-consumer --project=$prodproject --subnet-mode=custom
서브넷 만들기
Cloud Shell 사용
gcloud compute networks subnets create consumer-subnet --project=$prodproject --range=10.0.6.0/24 --network=vpc-demo-consumer --region=asia-southeast1
12. PSC 네트워크 엔드포인트 그룹 만들기
PSC NEG 만들기
이전 https 서비스 연결 이름을 복사하여 --psc-target-service 매개변수에 붙여넣습니다.
Cloud Shell 사용
gcloud beta compute network-endpoint-groups create consumerpscneg \ --project=$prodproject \ --region=asia-southeast1 \ --network-endpoint-type=PRIVATE_SERVICE_CONNECT \ --psc-target-service=projects/<project>/regions/asia-southeast1/serviceAttachments/ilbserviceattach \ --network=vpc-demo-consumer \ --subnet=consumer-subnet
PSC NEG가 성공적으로 설정된 후 UI에서 Private Service Connect -> Published Services으로 이동합니다. 이제 게시된 ilbserviceattach 연결에 전달 규칙이 1개 표시됩니다.

13. 소비자 외부 HTTPS 부하 분산기 만들기
외부 HTTPS 부하 분산기를 만들고 PSC NEG를 백엔드 서비스로 사용합니다( 문서).
Cloud Shell 사용
gcloud compute addresses create httpspsclb \
--ip-version=IPV4 --global
gcloud compute backend-services create consumer-bs \
--load-balancing-scheme=EXTERNAL_MANAGED \
--protocol=HTTPS \
--global
gcloud compute backend-services add-backend consumer-bs \
--network-endpoint-group=consumerpscneg \
--network-endpoint-group-region=asia-southeast1 \
--global
gcloud compute url-maps create consumer-url \
--default-service=consumer-backend-service \
--global
gcloud compute ssl-certificates create wwwglobal \
--certificate=fullchain.pem \
--private-key=private.pem \
--global
gcloud compute target-https-proxies create consumer-url-target-proxy \
--url-map=consumer-url \
--ssl-certificates=wwwglobal
gcloud compute forwarding-rules create consumer-url-forwarding-rule \
--load-balancing-scheme=EXTERNAL_MANAGED \
--network-tier=PREMIUM \
--address=httpspsclb \
--target-https-proxy=consumer-url-target-proxy \
--ports=443 \
--global
www01.yinghli.demo.altostrat.com의 DNS 레코드를 업데이트하고 외부 HTTPS 부하 분산기 공개 IP 주소를 가리키도록 합니다.
gcloud dns --project=$prodproject record-sets update www01.yinghli.demo.altostrat.com. --type="A" --zone="yinghli-demo" --rrdatas="34.102.178.214" --ttl="300"
14. 유효성 검사
노트북에서 curl을 사용하여 https://www01.yinghli.demo.altostrat.com에 액세스합니다.
curl -v https://www01.yinghli.demo.altostrat.com * Trying 34.102.178.214:443... * Connected to www01.yinghli.demo.altostrat.com (34.102.178.214) port 443 (#0) * ALPN: offers h2,http/1.1 * TLSv1.3 (OUT), TLS handshake, Client hello (1): * TLSv1.3 (IN), TLS handshake, Server hello (2): * TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8): * TLSv1.3 (IN), TLS handshake, Certificate (11): * TLSv1.3 (IN), TLS handshake, CERT verify (15): * TLSv1.3 (IN), TLS handshake, Finished (20): * TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1): * TLSv1.3 (OUT), TLS handshake, Finished (20): * SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384 * ALPN: server accepted h2 * Server certificate: * subject: CN=www01.yinghli.demo.altostrat.com * start date: Jun 4 10:36:43 2023 GMT * expire date: Sep 2 10:36:42 2023 GMT * subjectAltName: host "www01.yinghli.demo.altostrat.com" matched cert's "www01.yinghli.demo.altostrat.com" * issuer: C=US; O=Let's Encrypt; CN=R3 * SSL certificate verify ok. * using HTTP/2 * h2h3 [:method: GET] * h2h3 [:path: /] * h2h3 [:scheme: https] * h2h3 [:authority: www01.yinghli.demo.altostrat.com] * h2h3 [user-agent: curl/8.0.0] * h2h3 [accept: */*] * Using Stream ID: 1 (easy handle 0x149019a00) > GET / HTTP/2 > Host: www01.yinghli.demo.altostrat.com > user-agent: curl/8.0.0 > accept: */* > * TLSv1.3 (IN), TLS handshake, Newsession Ticket (4): * TLSv1.3 (IN), TLS handshake, Newsession Ticket (4): * old SSL session ID is stale, removing < HTTP/2 200 < server: nginx/1.18.0 < date: Mon, 05 Jun 2023 02:48:43 GMT < content-type: text/html < content-length: 35 < last-modified: Sun, 04 Jun 2023 09:02:16 GMT < etag: "647c5318-23" < accept-ranges: bytes < via: 1.1 google, 1.1 google < alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 < Page on www01 in asia-southeast1-b * Connection #0 to host www01.yinghli.demo.altostrat.com left intact
15. 정리 단계
생산자 네트워크 정리 단계
참고: 정리 단계에는 부하 분산기 및 PSC 관련 구성만 표시되며 VPC 및 하이브리드 연결은 포함되지 않습니다.
터미널의 단일 Cloud Shell에서 실습 구성요소 삭제
gcloud compute forwarding-rules delete consumer-url-forwarding-rule --global gcloud compute target-https-proxies delete consumer-url-target-proxy gcloud compute ssl-certificates delete wwwglobal --global gcloud compute url-maps delete consumer-url gcloud compute backend-services delete consumer-bs --global gcloud compute addresses delete httpspsclb --global gcloud beta compute network-endpoint-groups delete consumerpscneg --region=asia-southeast1 gcloud compute service-attachments delete ilbserviceattach --region=asia-southeast1 gcloud compute networks subnets delete psc-nat-subnet --region=asia-southeast1 gcloud compute forwarding-rules delete https-ilb-psc --region=asia-southeast1 gcloud compute addresses delete ilbaddress --region=asia-southeast1 gcloud compute target-https-proxies delete on-premise-httpsproxy --region=asia-southeast1 gcloud compute ssl-certificates delete www01 --region=asia-southeast1 gcloud compute url-maps delete on-premise-url --region=asia-southeast1 gcloud compute backend-services delete on-premise-service-backend --region=asia-southeast1 gcloud compute health-checks delete on-prem-service-hc --region=asia-southeast1 gcloud compute network-endpoint-groups delete on-prem-service-neg --zone=asia-southeast1-b gcloud compute networks subnets delete proxy-subnet-asia-southeast1 --region=asia-southeast1
16. 축하합니다.
축하합니다. Codelab을 완료했습니다.
학습한 내용
- 하이브리드 NEG 및 분산 상태 점검이 있는 내부 HTTPS 부하 분산기
- 내부 HTTPS 부하 분산기가 있는 PSC 서비스 연결
- PSC 네트워크 엔드포인트 그룹 설정
- 외부 HTTPS 부하 분산기로 PSC NEG 노출