1. 소개
Private Service Connect
Private Service Connect는 소비자가 VPC 네트워크 내부에서 비공개로 관리형 서비스에 액세스할 수 있도록 허용하는 Google Cloud 네트워킹 기능입니다. 마찬가지로 이를 이용해 관리형 서비스 프로듀서는 이러한 서비스를 별도의 개별 VPC 네트워크에서 호스팅하고 소비자에게 비공개 연결을 제공할 수 있습니다.

Private Service Connect 프로듀서 액세스 제어
프로듀서는 모든 소비자의 모든 연결을 자동으로 수락하는 대신 소비자가 소비자 허용 목록에 있는 경우에만 인바운드 연결 요청을 수락할 수 있습니다. 프로젝트, VPC 네트워크 또는 개별 PSC 엔드포인트별로 소비자를 지정할 수 있습니다. 동일한 소비자 허용 또는 거부 목록에 여러 유형의 소비자를 포함할 수 없습니다.
두 연결 환경설정 모두 수락된 연결은 수신 연결을 차단하는 조직 정책 (compute.restrictPrivateServiceConnectConsumer)에 의해 재정의되고 거부될 수 있습니다.
조직 정책 (compute.restrictPrivateServiceConnectConsumer)은 조직,폴더 또는 프로젝트에 적용됩니다. PSC 엔드포인트에 대한 세분화된 액세스 제어가 필요한 경우 개별 PSC 엔드포인트의 소비자 허용 목록을 사용하면 됩니다.
엔드포인트 기반 액세스 제어
PSC 엔드포인트 기반 액세스 제어는 서비스 연결 정책에서 개별 PSC 엔드포인트를 통해 생산자가 소비자를 승인할 수 있는 기능입니다.
멀티 테넌트 서비스에 권장되는 이 접근 방식은 연결 관리를 위한 가장 세부적인 제어를 제공합니다.
이 Codelab에서는 이 기능을 구성하는 방법을 알아봅니다.
이 방법은 Private Service Connect 백엔드에는 적용되지 않습니다.
2. 학습할 내용
- 프로듀서로서 PSC를 사용하여 서비스를 게시하는 방법
- 프로듀서로서 PSC 엔드포인트 기반 액세스 제어를 만드는 방법
- 소비자로서 PSC 서비스에 액세스하는 방법
3. 전체 실습 아키텍처

4. 준비 단계
실습을 진행하는 데 필요한 IAM 역할
프로젝트 수준에서 GCP 계정에 필요한 IAM 역할을 할당하는 것으로 시작합니다.
- Compute 네트워크 관리자 (
roles/compute.networkAdmin): 이 역할은 Compute Engine 네트워킹 리소스를 완전히 제어할 수 있는 권한을 부여합니다. - 로깅 관리자 (
roles/logging.admin): 이 역할은 모든 로깅 권한 및 종속 권한에 대한 액세스 권한을 부여합니다. - 서비스 사용량 관리자 (
roles/serviceusage.serviceUsageAdmin): 이 역할은 서비스 상태를 사용 설정, 중지, 검사하고, 작업을 검사하고, 소비자 프로젝트의 할당량과 결제를 사용할 수 있는 권한을 제공합니다. - Compute 인스턴스 관리자 (
roles/compute.instanceAdmin.v1): 이 역할은 Compute Engine 인스턴스, 인스턴스 그룹, 디스크, 스냅샷, 이미지를 관리할 수 있는 전체 권한을 제공합니다. 모든 Compute Engine 네트워킹 리소스에 대해서는 읽기 액세스 권한만 부여됩니다. - 컴퓨팅 보안 관리자 (
roles/compute.securityAdmin): 이 역할은 방화벽 규칙과 SSL 인증서를 생성, 수정, 삭제하고 보안 VM 설정을 구성할 수 있는 권한을 부여합니다.
API 사용 설정
Cloud Shell 내에서 프로젝트가 올바르게 구성되어 있는지 확인하고 환경 변수를 설정합니다.
Cloud Shell 내에서 다음을 실행합니다.
gcloud auth login
gcloud config set project <your project id>
export project_id=$(gcloud config get-value project)
export region=us-central1
export zone=$region-a
echo $project_id
echo $region
echo $zone
프로젝트에서 필요한 모든 Google API를 사용 설정합니다. Cloud Shell 내에서 다음을 실행합니다.
gcloud services enable \
compute.googleapis.com
프로듀서 VPC 만들기
프로젝트에서 커스텀 서브넷 모드로 VPC 네트워크를 만듭니다. Cloud Shell에서 다음을 실행합니다.
gcloud compute networks create producer-net \
--subnet-mode=custom
프로듀서 VPC에 서브넷 만들기
서비스용 프로듀서 서브넷, 서비스를 게시하는 부하 분산기용 프록시 전용 서브넷, PSC용 psc 서브넷 등 세 개의 서브넷이 필요합니다.
Cloud Shell 내에서 다음을 실행하여 IPV4 서브넷을 만듭니다.
gcloud compute networks subnets create producer-subnet \
--network=producer-net \
--range=10.10.0.0/24 \
--region=$region
gcloud compute networks subnets create proxy-only-subnet \
--purpose=REGIONAL_MANAGED_PROXY \
--role=ACTIVE \
--region=$region \
--network=producer-net \
--range=10.30.0.0/24
gcloud compute networks subnets create psc-subnet \
--network=producer-net \
--region=$region \
--range=192.168.0.0/16 \
--purpose=PRIVATE_SERVICE_CONNECT
프로듀서 VPC용 Cloud NAT 및 Cloud Router 만들기
Cloud NAT는 VM이 애플리케이션을 다운로드하고 설치할 수 있도록 하는 데 사용됩니다.
gcloud compute routers create $region-cr \
--network=producer-net \
--region=$region
gcloud compute routers nats create $region-nat \
--router=$region-cr \
--region=$region \
--nat-all-subnet-ip-ranges \
--auto-allocate-nat-external-ips
소비자 VPC 만들기
프로젝트에서 커스텀 서브넷 모드로 VPC 네트워크를 만듭니다. Cloud Shell에서 다음을 실행합니다.
gcloud compute networks create consumer-net \
--subnet-mode=custom
소비자 VPC에 서브넷 만들기
Cloud Shell 내에서 다음을 실행하여 IPV4 서브넷을 만듭니다.
gcloud compute networks subnets create consumer-subnet \
--network=consumer-net \
--range=10.20.0.0/24 \
--region=$region
프로듀서 VPC 및 소비자 VPC에 대한 전역 방화벽 정책 만들기
전역 네트워크 방화벽 정책을 만들어 프로듀서 VPC 및 소비자 VPC에 연결합니다.
gcloud compute network-firewall-policies create global-fw-policy \
--global
gcloud compute network-firewall-policies associations create \
--firewall-policy=global-fw-policy \
--name=producer-fw-policy \
--network=producer-net \
--global-firewall-policy
gcloud compute network-firewall-policies associations create \
--firewall-policy=global-fw-policy \
--name=consumer-fw-policy \
--network=consumer-net \
--global-firewall-policy
SSH 허용
IAP (Identity-Aware Proxy)가 VM 인스턴스에 연결할 수 있도록 다음과 같은 방화벽 규칙을 만듭니다.
- IAP를 사용하여 액세스할 수 있는 모든 VM 인스턴스에 적용됩니다.
- IP 범위 35.235.240.0/20에서의 인그레스 트래픽을 허용합니다. 이 범위에는 IAP가 TCP 전달을 위해 사용하는 모든 IP 주소가 포함됩니다.
gcloud compute network-firewall-policies rules create 100 \
--action=ALLOW \
--firewall-policy=global-fw-policy \
--description="producer-allow-iap" \
--direction=INGRESS \
--src-ip-ranges=35.235.240.0/20 \
--layer4-configs=tcp:22 \
--global-firewall-policy
서비스에 인그레스 방화벽 규칙 추가
리전 내부 애플리케이션 부하 분산기를 사용하여 서비스를 게시합니다.인그레스 방화벽 규칙 y는 프록시 전용 서브넷이 서비스에 액세스하도록 허용해야 합니다. 자세한 내용은 이 문서를 참고하세요.
gcloud compute network-firewall-policies rules create 200 \
--action=ALLOW \
--firewall-policy=global-fw-policy \
--description="producer-allow-access-service" \
--direction=INGRESS \
--src-ip-ranges=10.30.0.0/24 \
--layer4-configs=tcp:80 \
--global-firewall-policy
서비스에 대한 부하 분산기 상태 점검 허용
리전별 내부 애플리케이션 부하 분산기 상태 점검 프로브는 35.191.0.0/16 및 130.211.0.0/22 범위를 사용합니다. 프로브에서 상태 점검을 허용하는 인그레스 방화벽 규칙을 만듭니다. 자세한 내용은 이 문서를 참고하세요.
gcloud compute network-firewall-policies rules create 300 \
--action=ALLOW \
--firewall-policy=global-fw-policy \
--description="producer-allow-health-check" \
--direction=INGRESS \
--src-ip-ranges=35.191.0.0/16,130.211.0.0/22\
--layer4-configs=tcp:80 \
--global-firewall-policy
소비자 VPC에서 VM을 http 클라이언트로 만들기
Cloud Shell 내에서 다음을 실행하여 VM 인스턴스를 테스트 클라이언트로 만듭니다.
gcloud compute instances create myclient \
--zone=$zone \
--subnet=consumer-subnet \
--shielded-secure-boot \
--no-address
프로듀서 VPC에서 VM을 http 서버로 만들기
Cloud Shell 내에서 다음을 실행하여 VM 인스턴스를 HTTP 서버로 만듭니다.
gcloud compute instances create myserver \
--subnet=producer-subnet \
--zone=$zone \
--no-address \
--shielded-secure-boot \
--metadata startup-script='#! /bin/bash
sudo apt-get update
sudo apt-get install apache2 -y
a2enmod ssl
sudo a2ensite default-ssl
echo "I am a Http Server." | \
tee /var/www/html/index.html
systemctl restart apache2'
5. 프로듀서가 PSC 서비스를 게시함
리전 내부 애플리케이션 부하 분산기 만들기
서비스의 프런트엔드로 리전 내부 애플리케이션 부하 분산기를 만들고 백엔드는 이전에 만든 http 서버가 엔드포인트인 비관리형 인스턴스 그룹입니다.
부하 분산기의 IP 주소 예약
gcloud compute addresses create l7-ilb-ip-address \
--region=$region \
--subnet=producer-subnet
인스턴스 그룹 만들기
비관리형 인스턴스 그룹을 만들고 인스턴스 그룹에 VM 인스턴스 myserver를 추가합니다.
gcloud compute instance-groups unmanaged create my-service-ig \
--zone=$zone
gcloud compute instance-groups unmanaged add-instances my-service-ig \
--zone=$zone \
--instances=myserver
HTTP 상태 점검 만들기
gcloud compute health-checks create http l7-ilb-basic-check \
--region=$region \
--use-serving-port
백엔드 서비스 만들기
gcloud compute backend-services create l7-ilb-backend-service \
--load-balancing-scheme=INTERNAL_MANAGED \
--protocol=HTTP \
--health-checks=l7-ilb-basic-check \
--health-checks-region=$region \
--region=$region
백엔드 서비스에 백엔드 추가
gcloud compute backend-services add-backend l7-ilb-backend-service \
--balancing-mode=UTILIZATION \
--instance-group=my-service-ig \
--instance-group-zone=$zone \
--region=$region
URL 맵 만들기
gcloud compute url-maps create l7-ilb-map \
--default-service=l7-ilb-backend-service \
--region=$region
대상 프록시 만들기
gcloud compute target-http-proxies create l7-ilb-proxy \
--url-map=l7-ilb-map \
--url-map-region=$region \
--region=$region
전달 규칙 만들기
gcloud compute forwarding-rules create l7-ilb-forwarding-rule \
--load-balancing-scheme=INTERNAL_MANAGED \
--network=producer-net \
--subnet=producer-subnet \
--address=l7-ilb-ip-address \
--ports=80 \
--region=$region \
--target-http-proxy=l7-ilb-proxy \
--target-http-proxy-region=$region
PSC 프로듀서가 서비스를 게시합니다.
PSC를 사용하여 connection-preference=ACCEPT_MANUAL 및 빈 소비자 목록으로 서비스를 게시합니다.
gcloud compute service-attachments create my-psc-service \
--region=$region \
--target-service=projects/$project_id/regions/$region/forwardingRules/l7-ilb-forwarding-rule \
--connection-preference=ACCEPT_MANUAL \
--nat-subnets=psc-subnet
export myserver_service_attachment=$(gcloud compute service-attachments describe my-psc-service --region=$region --format="value(selfLink.scope(v1))")
echo $myserver_service_attachment
6. 소비자가 PSC 엔드포인트를 만듭니다.
PSC 엔드포인트의 IP 예약
gcloud compute addresses create myserver-psc-endpoint-ip \
--region=$region \
--subnet=consumer-subnet \
--ip-version=IPV4
PSC 엔드포인트 만들기
PSC 엔드포인트를 만들고 다음 단계에서 테스트할 PSC 엔드포인트의 IP를 가져옵니다.
gcloud compute forwarding-rules create myserver-psc-endpoint \
--region=$region \
--network=consumer-net \
--address=myserver-psc-endpoint-ip \
--target-service-attachment=$myserver_service_attachment
psc_endpoint_ip=$(gcloud compute forwarding-rules describe myserver-psc-endpoint \
--region=$region --format="value(IPAddress)")
echo $psc_endpoint_ip
소비자가 PSC 엔드포인트 상태를 확인합니다.
프로듀서가 소비자 목록에 PSC 엔드포인트를 추가하기 전에는 소비자의 연결된 엔드포인트에 연결이 대기 상태로 표시됩니다.
gcloud compute forwarding-rules describe myserver-psc-endpoint \
--region=$region
아래와 비슷한 결과가 표시됩니다.
IPAddress: 10.20.0.3
allowPscGlobalAccess: false
creationTimestamp: '2026-02-23T16:27:27.920-08:00'
fingerprint: yh_UiYqjHCc=
id: '934193159895862912'
kind: compute#forwardingRule
labelFingerprint: 42WmSpB8rSM=
name: myserver-psc-endpoint
network: https://www.googleapis.com/compute/v1/projects/<project_id>/global/networks/consumer-net
networkTier: PREMIUM
pscConnectionId: '160443618817212419'
pscConnectionStatus: PENDING
region: https://www.googleapis.com/compute/v1/projects/<project_id>/regions/us-central1
selfLink: https://www.googleapis.com/compute/v1/projects/<project_id>/regions/us-central1/forwardingRules/myserver-psc-endpoint
selfLinkWithId: https://www.googleapis.com/compute/v1/projects/<project_id>/regions/us-central1/forwardingRules/934193159895862912
serviceDirectoryRegistrations:
- namespace: goog-psc-default
target: https://www.googleapis.com/compute/v1/projects/<project_id>/regions/us-central1/serviceAttachments/my-psc-service
7. 소비자 VM에서 생산자 VM으로의 액세스 테스트
PSC 엔드포인트 IP를 확인합니다.
echo $psc_endpoint_ip
myclient라는 VM에 SSH로 연결하고 http 80 포트에서 myserver에 액세스할 수 있는지 테스트합니다.
Cloud Shell 내에서 다음을 실행합니다.
gcloud compute ssh \
--zone=$zone "myclient" \
--tunnel-through-iap
curl을 사용하여 만든 PSC 엔드포인트에 액세스합니다.
curl -m 10 <psc_endpoint_ip>
curl 명령어가 제한 시간 초과됩니다. 소비자 VPC의 테스트 클라이언트가 생산자 VPC의 HTTP 서버에 액세스할 수 없습니다.
curl: (28) Connection timed out after 10001 milliseconds
SSH 세션을 종료하여 Cloud Shell로 돌아갑니다.
exit
8. 생산자가 PSC 엔드포인트를 승인함
생산자가 PSC 엔드포인트 상태를 확인합니다.
프로듀서가 소비자 목록에 PSC 엔드포인트를 추가하기 전에는 연결이 서비스 연결에 대기 중 상태로 표시됩니다.
gcloud compute service-attachments describe my-psc-service --region=$region
아래와 비슷한 결과가 표시됩니다.
connectedEndpoints:
- consumerNetwork: https://www.googleapis.com/compute/projects/<project_id>/global/networks/consumer-net
endpoint: https://www.googleapis.com/compute/projects/<project_id>/regions/us-central1/forwardingRules/myserver-psc-endpoint
endpointWithId: https://www.googleapis.com/compute/projects/<project_id>/regions/us-central1/forwardingRules/934193159895862912
pscConnectionId: '160443618817212419'
status: PENDING
connectionPreference: ACCEPT_MANUAL
creationTimestamp: '2026-02-23T13:27:33.886-08:00'
description: ''
enableProxyProtocol: false
fingerprint: -9EI8FCALrA=
id: '2578692595155826858'
kind: compute#serviceAttachment
name: my-psc-service
natSubnets:
- https://www.googleapis.com/compute/projects/<project_id>/regions/us-central1/subnetworks/psc-subnet
pscServiceAttachmentId:
high: '149466704441770984'
low: '2578692595155826858'
reconcileConnections: false
region: https://www.googleapis.com/compute/projects/<project_id>/regions/us-central1
selfLink: https://www.googleapis.com/compute/projects/<project_id>/regions/us-central1/serviceAttachments/my-psc-service
targetService: https://www.googleapis.com/compute/projects/<project_id>/regions/us-central1/forwardingRules/l7-ilb-forwarding-rule
PSC 엔드포인트의 ID 기반 URI 가져오기
PSC 엔드포인트의 ID 기반 URI는 소비자가 방금 만든 전달 규칙의 ID입니다. 위의 예에서 'endpointWithId'는 소비자가 만든 PSC 엔드포인트의 URI입니다. 생산자가 엔드포인트 기반 액세스 제어를 만들려면 이 URI가 필요합니다.
( PSC 연결 ID는 Google에서 찾는 ID가 아닙니다. )
export psc_endpoint_uri=$(gcloud compute service-attachments describe my-psc-service --region=$region --format="value(connectedEndpoints.endpointWithId)")
echo $psc_endpoint_uri
소비자 허용 목록에 PSC 엔드포인트 ID 기반 URI 추가
gcloud compute service-attachments update my-psc-service \
--region=$region \
--consumer-accept-list=$psc_endpoint_uri
생산자가 PSC 엔드포인트 상태를 확인합니다.
gcloud compute service-attachments describe my-psc-service --region=$region --format="value(connectedEndpoints)"
아래와 비슷한 결과가 표시됩니다. 상태가 'ACCEPTED'(수락됨)로 변경되었습니다.
{'consumerNetwork': 'https://www.googleapis.com/compute/projects/<project_id>/global/networks/consumer-net', 'endpoint': 'https://www.googleapis.com/compute/projects/<project_id>/regions/us-central1/forwardingRules/myserver-psc-endpoint', 'endpointWithId': 'https://www.googleapis.com/compute/projects/<project_id>/regions/us-central1/forwardingRules/47564871796017232', 'pscConnectionId': '54547416268144643', 'status': 'ACCEPTED'}
9. 소비자 VM에서 생산자 VM으로의 액세스 테스트
PSC 엔드포인트 IP를 확인합니다.
echo $psc_endpoint_ip
myclient라는 VM에 SSH로 연결하고 http 80 포트에서 myserver에 액세스할 수 있는지 테스트합니다.
Cloud Shell 내에서 다음을 실행합니다.
gcloud compute ssh \
--zone=$zone "myclient" \
--tunnel-through-iap
curl을 사용하여 만든 PSC 엔드포인트에 액세스합니다.
curl <psc_endpoint_ip>
curl 명령어가 myserver에서 응답을 성공적으로 반환합니다. 소비자 VPC의 테스트 클라이언트가 프로듀서 VPC의 http 서버에 액세스했습니다.
I am a Http Server.
SSH 세션을 종료하여 Cloud Shell로 돌아갑니다.
exit
10. 삭제
VM 정리
Cloud Shell 내에서 다음을 실행합니다.
gcloud compute instances delete myserver --zone $zone --quiet
gcloud compute instances delete myclient --zone $zone --quiet
PSC 소비자 구성요소 정리
gcloud compute forwarding-rules delete myserver-psc-endpoint \
--region=$region --quiet
gcloud compute addresses delete myserver-psc-endpoint-ip \
--region=$region --quiet
PSC 생산자 구성요소 정리
gcloud compute service-attachments delete my-psc-service \
--region=$region --quiet
gcloud compute forwarding-rules delete l7-ilb-forwarding-rule \
--region=$region --quiet
gcloud compute target-http-proxies delete l7-ilb-proxy \
--region=$region --quiet
gcloud compute url-maps delete l7-ilb-map \
--region=$region --quiet
gcloud compute backend-services remove-backend l7-ilb-backend-service \
--instance-group=my-service-ig \
--instance-group-zone=$zone \
--region=$region --quiet
gcloud compute backend-services delete l7-ilb-backend-service \
--region=$region --quiet
gcloud compute health-checks delete l7-ilb-basic-check \
--region=$region --quiet
gcloud compute instance-groups unmanaged delete my-service-ig \
--zone=$zone --quiet
gcloud compute addresses delete l7-ilb-ip-address \
--region=$region --quiet
방화벽, Cloud NAT, Cloud Router, VPC 정리
gcloud compute network-firewall-policies rules delete 100 \
--firewall-policy=global-fw-policy \
--global-firewall-policy --quiet
gcloud compute network-firewall-policies rules delete 200 \
--firewall-policy=global-fw-policy \
--global-firewall-policy --quiet
gcloud compute network-firewall-policies rules delete 300 \
--firewall-policy=global-fw-policy \
--global-firewall-policy --quiet
gcloud compute network-firewall-policies associations delete \
--firewall-policy=global-fw-policy \
--name=producer-fw-policy \
--global-firewall-policy --quiet
gcloud compute network-firewall-policies associations delete \
--firewall-policy=global-fw-policy \
--name=consumer-fw-policy \
--global-firewall-policy --quiet
gcloud compute network-firewall-policies delete global-fw-policy \
--global --quiet
gcloud compute routers nats delete $region-nat \
--router=$region-cr \
--region=$region --quiet
gcloud compute routers delete $region-cr \
--region=$region --quiet
gcloud compute networks subnets delete producer-subnet \
--region=$region --quiet
gcloud compute networks subnets delete proxy-only-subnet \
--region=$region --quiet
gcloud compute networks subnets delete psc-subnet \
--region=$region --quiet
gcloud compute networks delete producer-net --quiet
gcloud compute networks subnets delete consumer-subnet \
--region=$region --quiet
gcloud compute networks delete consumer-net --quiet
11. 축하합니다
Private Service Connect 생산자 엔드포인트 기반 액세스 제어를 테스트했습니다.