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 관리 웹 서비스를 구성하고 서비스 연결을 통해 PSC 서비스로 노출
  • 내부 및 외부 애플리케이션 부하 분산기에서 SSL을 종료하는 SSL 인증서 만들기
  • PSC 서비스에 액세스할 수 있도록 Cloud DNS 공개 영역 구성

필요한 항목

  • 소유자 권한이 있는 Google Cloud 프로젝트

2. 테스트 환경

만들 환경은 소비자 VPC와 제작자 VPC로 구성됩니다. Producer VPC에서 오픈소스 Apache 웹 서비스를 빌드하는 인스턴스 템플릿의 관리형 인스턴스 그룹을 배포합니다. 또한 서비스의 적절한 로컬 기능을 보장하기 위해 test-vm을 배포합니다. 서비스 연결을 통해 Apache 서비스를 PSC 프로듀서 서비스로 노출합니다.

소비자 VPC에서 Apache 서비스를 가리키는 PSC 백엔드 서비스가 있는 전역 외부 애플리케이션 부하 분산기를 배포합니다. 그런 다음 공개 인터넷에서 PSC 서비스에 액세스할 수 있도록 공개 DNS 영역을 설정합니다.

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를 생성할 수 있습니다. 또는 직접 시도해 보고 사용 가능한지 확인할 수도 있습니다. 이 단계 이후에는 변경할 수 없으며 프로젝트 기간 동안 유지됩니다.
  • 참고로 세 번째 값은 일부 API에서 사용하는 프로젝트 번호입니다. 이 세 가지 값에 대한 자세한 내용은 문서를 참고하세요.
  1. 다음으로 Cloud 리소스/API를 사용하려면 Cloud 콘솔에서 결제를 사용 설정해야 합니다. 이 Codelab 실행에는 많은 비용이 들지 않습니다. 이 튜토리얼이 끝난 후에 요금이 청구되지 않도록 리소스를 종료하려면 만든 리소스 또는 프로젝트를 삭제하면 됩니다. Google Cloud 신규 사용자는 300달러(USD) 상당의 무료 체험판 프로그램에 참여할 수 있습니다.

Cloud Shell 시작

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

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

55efc1aaa7a4d3ad.png

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

7ffe5cbb04455448.png

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

서브넷 만들기

producer-vpc에 범용 서브넷 2개가 배포됩니다. service-subnet은 Apache 웹 서비스 VM과 부하 분산기 전달 규칙을 배포하는 데 사용됩니다. test-client-subnet은 다른 리전에 있으며, 전역 액세스가 사용 설정된 Apache 서비스를 테스트하기 위해 VM을 배포하는 데 사용됩니다.

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)에서 가져온 부하 분산기 백엔드로의 인그레스 트래픽을 허용하기 위한 두 가지 추가 방화벽 규칙과 백엔드 인스턴스에서 부하 분산기 상태 확인을 허용하는 규칙 (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 서비스'를 표시하는 간단한 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단계가 완료되면 이 페이지로 돌아오세요. 일반 이름은 EXAMPLE.COM으로 구성해야 합니다.

부하 분산기에 연결할 인증서 리소스를 만듭니다. certificate 및 private-key 매개변수를 특정 파일 이름으로 바꿉니다.

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에서는 내부 리전 애플리케이션 부하 분산기를 사용하고 있지만, 원하는 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 만들기 및 로컬에서 서비스 테스트

서비스 연결을 만들기 전에 다른 리전에 테스트 클라이언트 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 서비스를 테스트합니다. 내부 IP 주소는 이전에 예약하고 기록해 둔 주소입니다.

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

예상 결과

PSC Service

VM을 종료합니다.

vm-client에서

exit

10. 서비스 연결 만들기

이 예에서는 이 프로젝트의 PSC 연결만 허용하도록 서비스 연결을 구성합니다. 하나 이상의 특정 프로젝트 또는 네트워크를 허용하도록 구성할 수 있지만 둘 다 허용하도록 구성할 수는 없습니다. 최대 연결 한도를 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

서비스 연결 URI (selfLink)는 다음 단계에서 PSC 백엔드 구성에 필요하므로 기록해 두어야 합니다. 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-EXTERNAL-IP.nip.io>로 구성해야 합니다.

외부 부하 분산기와 연결할 인증서 리소스를 만듭니다. certificate 및 private-key 매개변수를 특정 파일 이름으로 바꿉니다.

Cloud Shell 사용

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

13. 부하 분산기 구성요소 만들기

새로 만든 서비스 첨부파일을 백엔드 서비스로 가리키는 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. 정리 단계

단일 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 관리 웹 서비스를 구성하고 서비스 연결을 통해 PSC 서비스로 노출
  • 내부 및 외부 애플리케이션 부하 분산기에서 SSL을 종료하는 SSL 인증서 만들기
  • PSC 서비스에 액세스하도록 Cloud DNS 공개 영역 구성