Private Service Connect: Private Service Connect를 사용하여 Cloud Run으로 서비스 게시 및 사용

이 Codelab 정보
schedule61분
subject최종 업데이트: 2025년 3월 28일
account_circle작성자: Lorin Price

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

Cloud Run은 Google의 확장 가능한 인프라에서 직접 컨테이너를 실행할 수 있게 해 주는 관리형 컴퓨팅 플랫폼입니다.

Cloud Run은 두 가지 방법으로 PSC 서비스로 사용할 수 있습니다.

  1. Cloud Run에서 제공하는 run.app URL을 통해 Cloud Run을 호출하여 Google API용 PSC를 통해
  2. 서버리스 NEG가 있는 내부 애플리케이션 부하 분산기를 통해 서비스 연결을 통해 Cloud Run이 노출되는 맞춤 PSC 프로듀서 서비스를 통해

이 Codelab에서는 두 시나리오 모두에 대해 PSC를 사용하여 Cloud Run을 설정하는 방법을 살펴봅니다.

학습할 내용

  • Cloud Run에 기본 앱 배포
  • Cloud Run 인그레스 및 이그레스 제어
  • 서버리스 NEG를 사용하여 내부 애플리케이션 부하 분산기를 통해 Cloud Run 배포
  • 서비스 연결을 통해 PSC 프로듀서 서비스 설정
  • PSC 엔드포인트 배포

필요한 항목

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

2. Codelab 토폴로지

455a040761a8fab9.png

이 Codelab에서는 PSC를 통해 액세스할 수 있는 두 가지 Cloud Run 서비스를 배포합니다. 첫 번째는 PSC를 사용하여 맞춤 게시된 서비스로, 두 번째는 Google API용 PSC로 배포합니다. consumer-vpc와 producer-vpc라는 두 개의 VPC를 만듭니다. 먼저 Hello World Cloud Run 서비스를 배포하고 producer-vpc의 리전 내부 애플리케이션 부하 분산기 및 서버리스 NEG를 통해 액세스할 수 있도록 합니다. 서비스 연결을 통해 PSC 프로듀서 서비스로 액세스할 수 있도록 Cloud Run 서비스를 설정하기 전에 프로듀서 클라이언트를 통해 부하 분산기를 통해 서비스가 작동하는지 확인합니다.

consumer-vpc로 이동하여 producer-vpc에서 설정한 Cloud Run 서비스 연결을 가리키는 PSC 엔드포인트를 배포합니다. 그런 다음 consumer-vpc의 소비자 클라이언트에서 PSC를 통해 서비스에 액세스할 수 있는지 확인합니다. 다음으로 PSC 엔드포인트를 호출하는 다른 Cloud Run 서비스를 만듭니다. 마지막으로 Google API용 PSC 엔드포인트를 배포합니다. 소비자 클라이언트에서 Cloud Run 제공 URL을 통해 Cloud Run에 액세스하면 Google API 엔드포인트에 PSC가 사용됩니다.

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에서 프로젝트가 설정되어 있는지 확인하고 변수를 구성합니다.

gcloud auth login
gcloud config list project
gcloud config set project [YOUR-PROJECT-ID]
export projectid=[YOUR-PROJECT-ID]
export projectnum=[YOUR-PROJECT-NUM]
export region=us-central1
export zone=us-central1-a
echo $projectid
echo $projectnum
echo $region
echo $zone

필요한 모든 서비스 사용 설정

gcloud services enable compute.googleapis.com
gcloud services enable run.googleapis.com
gcloud services enable servicedirectory.googleapis.com
gcloud services enable dns.googleapis.com
gcloud services enable cloudbuild.googleapis.com
gcloud services enable cloudresourcemanager.googleapis.com

5. 프로듀서 VPC 네트워크 만들기

VPC 네트워크

Cloud Shell 사용

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

서브넷 만들기

Cloud Shell 사용

gcloud compute networks subnets create producer-subnet \
    --network=producer-vpc \
    --range=10.0.0.0/28 \
    --region=$region

gcloud compute networks subnets create lb-proxy-subnet \
    --network=producer-vpc \
    --range=10.100.100.0/24 \
    --region=$region \
    --purpose=REGIONAL_MANAGED_PROXY \
    --role=ACTIVE

gcloud compute networks subnets create psc-nat-subnet \
    --network=producer-vpc \
    --region=$region \
    --range=10.100.101.0/24 \
    --purpose=PRIVATE_SERVICE_CONNECT

PSC 서브넷은 네트워크 주소 변환을 위해 PSC 서비스 연결과 연결됩니다. 프로덕션 사용 사례의 경우 이 서브넷은 연결된 엔드포인트 수를 지원할 수 있도록 적절하게 크기를 조정해야 합니다. 자세한 내용은 PSC NAT 서브넷 크기 조정 문서를 참고하세요.

제작자 네트워크 방화벽 정책 및 방화벽 규칙 만들기

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

6. Hello World Cloud Run 만들기

여기의 안내에 따라 Python으로 샘플 애플리케이션을 작성합니다. Cloud Shell에서 다음 명령어를 실행합니다. '샘플 애플리케이션 작성'의 3단계를 완료한 후 이 Codelab으로 돌아와 아래 안내에 따라 소스에서 Cloud Run에 배포합니다.

Cloud Run 서비스를 배포하기 전에 다음 명령어를 실행하여 기본 Compute 서비스 계정에 적절한 권한이 있는지 확인합니다.

Cloud Shell 사용

gcloud projects add-iam-policy-binding $projectid --member=serviceAccount:$projectnum-compute@developer.gserviceaccount.com --role=roles/run.builder

참고: 이 Codelab에서는 조직에 도메인 제한 공유 조직 정책이 사용 설정되어 있지 않다고 가정합니다. 이 정책을 사용 설정한 경우 인증을 사용하여 Cloud Run을 배포하고, OAuth 동의 화면을 구성하고, 부하 분산기 백엔드에 IAP를 설정하는 추가 단계를 실행해야 합니다. 프로덕션 환경에서는 이러한 구성 단계를 모두 따르는 것이 좋습니다.

Cloud Shell 사용

gcloud beta run deploy helloworld \
    --source . \
    --platform=managed \
    --ingress=internal \
    --allow-unauthenticated \
    --no-default-url \
    --region=$region

--no-default-url 플래그를 사용하면 제공된 run.app URL 없이 Cloud Run 서비스가 배포됩니다. 이 서비스에는 URL이 사용되지 않습니다. 이 Codelab 게시 시점을 기준으로 이 기능은 아직 미리보기 버전입니다.

계속하기 전에 Cloud Shell의 기본 디렉터리로 다시 변경합니다.

Cloud Shell 사용

cd ..

7. 내부 애플리케이션 부하 분산기를 통해 Hello World Cloud Run 노출

부하 분산기 전달 규칙에 고정 내부 IP 주소를 예약합니다.

Cloud Shell

gcloud compute addresses create cloudrun-ip \
 --region=$region \
 --subnet=producer-subnet

gcloud compute addresses describe cloudrun-ip --region=$region

샘플 출력

address: 10.0.1.31
addressType: INTERNAL
creationTimestamp: '2025-03-17T09:04:06.620-07:00'
description: ''
id: 'xxxx'
kind: compute#address
labelFingerprint: xxxx
name: cloudrun-ip
networkTier: PREMIUM
purpose: GCE_ENDPOINT
region: https://www.googleapis.com/compute/v1/projects/$projectid/regions/$region
selfLink: https://www.googleapis.com/compute/v1/projects/$projectid/regions/$region/addresses/cloudrun-ip
status: RESERVED
subnetwork: https://www.googleapis.com/compute/v1/projects/$projectid/regions/$region/subnetworks/producer-subnet

방금 만든 IP 주소를 기록해 둡니다.

리전 내부 애플리케이션 부하 분산기 만들기

Cloud Shell

gcloud compute network-endpoint-groups create cloudrun-producer-neg \
    --region=$region \
    --network-endpoint-type=serverless \
    --cloud-run-service=helloworld

gcloud compute backend-services create cloudrun-producer-bes \
    --load-balancing-scheme=INTERNAL_MANAGED \
    --protocol=HTTP \
    --region=$region

gcloud compute backend-services add-backend cloudrun-producer-bes \
        --region=$region \
        --network-endpoint-group=cloudrun-producer-neg \
        --network-endpoint-group-region=$region

gcloud compute url-maps create producer-urlmap \
        --default-service=cloudrun-producer-bes \
        --region=$region

gcloud compute target-http-proxies create producer-http-proxy \
        --url-map=producer-urlmap \
        --region=$region

Cloud Shell

gcloud compute forwarding-rules create cloudrun-fr \
        --load-balancing-scheme=INTERNAL_MANAGED \
        --network=producer-vpc \
        --subnet=producer-subnet \
        --address=cloudrun-ip \
        --target-http-proxy=producer-http-proxy \
        --target-http-proxy-region=$region \
        --region=$region \
        --ports=80 \
        --allow-global-access

8. 부하 분산기를 통해 노출된 Hello World Cloud Run 테스트

테스트 VM 만들기

Cloud Shell 사용

gcloud compute instances create producer-client \
    --zone=$zone \
    --subnet=producer-subnet \
    --no-address \
    --scopes=cloud-platform

Cloud Shell

gcloud compute ssh \
    --zone "$zone" "producer-client" \
    --tunnel-through-iap \
    --project $projectid

<loadbalancer-ip>를 이전에 만든 IP 주소 (예: 10.0.0.2)로 바꿉니다.

Hello World 테스트

producer-vm

curl <loadbalancer-ip>

정상 출력

Hello World!

VM을 종료합니다.

producer-vm

exit

9. 서비스 연결 만들기

Cloud Shell 사용

gcloud compute service-attachments create cloudrun-attachment \
    --region=$region \
    --producer-forwarding-rule=cloudrun-fr \
    --connection-preference=ACCEPT_MANUAL \
    --consumer-accept-list=$projectid=5 \
    --nat-subnets=psc-nat-subnet

그런 다음 서비스 연결 URI를 검색하여 기록하고 소비자 환경에서 PSC 엔드포인트를 구성합니다.

Cloud Shell

gcloud compute service-attachments describe cloudrun-attachment --region=$region

예상 출력 예시

connectionPreference: ACCEPT_MANUAL
consumerAcceptLists:
- connectionLimit: 5
  projectIdOrNum: $projectid
creationTimestamp: '2025-03-10T08:49:08.134-07:00'
description: ''
enableProxyProtocol: false
fingerprint: -F0Kpe3Fi8o=
id: '2679595584727463707'
kind: compute#serviceAttachment
name: cloudrun-attachment
natSubnets:
- https://www.googleapis.com/compute/v1/projects/$projectid/regions/$region/subnetworks/psc-nat-subnet
pscServiceAttachmentId:
  high: 'xxxxx'
  low: 'xxxx'
reconcileConnections: false
region: https://www.googleapis.com/compute/v1/projects/$projectid/regions/$region
selfLink: https://www.googleapis.com/compute/v1/projects/$projectid/regions/$region/serviceAttachments/cloudrun-attachment
targetService: https://www.googleapis.com/compute/v1/projects/$projectid/regions/$projectid/forwardingRules/cloudrun-fr

10. 소비자 VPC 네트워크 만들기

VPC 네트워크

Cloud Shell 사용

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

서브넷 만들기

Cloud Shell 사용

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

gcloud compute networks subnets create cloudrun-egress \
    --network=consumer-vpc \
    --range=10.0.1.0/24 \
    --region=$region \
    --enable-private-ip-google-access

Cloud NAT 만들기

Cloud Shell 사용

gcloud compute routers create central-cr \
    --network=consumer-vpc \
    --region=$region

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

소비자 네트워크 방화벽 정책 및 방화벽 규칙 만들기

consumer-vpc에 대한 다른 네트워크 방화벽 정책을 만듭니다.

Cloud Shell 사용

gcloud compute network-firewall-policies create consumer-vpc-policy --global

gcloud compute network-firewall-policies associations create --firewall-policy consumer-vpc-policy --network consumer-vpc --name network-consumer-vpc --global-firewall-policy

gcloud compute network-firewall-policies rules create 1000 --action ALLOW --firewall-policy consumer-vpc-policy --description "SSH with IAP" --direction INGRESS --src-ip-ranges 35.235.240.0/20 --layer4-configs tcp:22  --global-firewall-policy

11. Hello World Cloud Run 서비스의 PSC 엔드포인트 만들기

이제 PSC 엔드포인트를 만들고 서비스 연결을 통해 노출한 Cloud Run 서비스에 연결합니다. 이 섹션의 앞부분에서 기록해 둔 서비스 연결 URI를 사용합니다. gcloud 명령어의 URI 형식이 URI와 일치하는지 확인합니다.

PSC 엔드포인트 만들기

Cloud Shell 사용

gcloud compute addresses create cloudrun-service-ip --region=$region --subnet=consumer-subnet --ip-version=IPV4


gcloud compute forwarding-rules create cloudrun-ep --region=$region --network=consumer-vpc --address=cloudrun-service-ip --target-service-attachment=projects/$projectid/regions/$region/serviceAttachments/cloudrun-attachment

방금 만든 PSC 엔드포인트의 IP 주소를 가져옵니다. 다음 단계에서 이 IP 주소를 사용하여 엔드포인트를 테스트합니다.

Cloud Shell 사용

gcloud compute addresses list --filter="name=cloudrun-service-ip"

예상 출력 예시

NAME: cloudrun-service-ip
ADDRESS/RANGE: 10.0.0.2
TYPE: INTERNAL
PURPOSE: GCE_ENDPOINT
NETWORK: 
REGION: us-central1
SUBNET: consumer-subnet
STATUS: IN_USE

12. 소비자 클라이언트 VM 만들기 및 엔드포인트 연결 테스트

소비자 클라이언트 VM 만들기

Cloud Shell 사용

gcloud compute instances create consumer-client \
    --zone=$zone \
    --subnet=consumer-subnet \
    --no-address \
    --metadata startup-script='#! /bin/bash
    sudo apt-get update
    sudo apt-get install dnsutils -y'

연결 테스트

Cloud Shell 사용

gcloud compute ssh \
    --zone "$zone" "consumer-client" \
    --tunnel-through-iap \
    --project $projectid

<cloudrun-service-ip>를 실제 IP 주소로 바꿉니다.

소비자 클라이언트 VM에서

curl <cloudrun-service-ip>

정상 출력

Hello World!

소비자 클라이언트 VM에서

exit

13. Cloud Run 루프 서비스 만들기

다음으로 consumer-vpc에 비공개 콜백을 실행하여 PSC를 통해 노출된 이전 Cloud Run HelloWorld 서비스를 호출하는 Cloud Run 서비스를 만듭니다.

여기의 '샘플 애플리케이션 작성' 안내에 따라 PHP로 루프 애플리케이션을 작성합니다. helloworld-php 대신 디렉터리 이름을 cloudrun-loop로 지정합니다. Cloud Shell에서 다음 명령어를 실행합니다. 두 번째 단계에서 index.php 파일에 아래 PHP 코드를 사용합니다. Cloud Run에 배포할 준비가 되면 Codelab으로 돌아갑니다. 이 단계에서는 문서의 안내를 따르지 마세요.

index.php 파일에 이 코드를 사용합니다. <cloudrun-service-ip>를 이전 단계에서 테스트한 PSC 엔드포인트의 IP 주소로 바꿉니다.

Cloud Shell 사용

<?php 

if(!function_exists('curl_init')) {
    die('cURL not available!');
}

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'http://<cloudrun-service-ip>/');
curl_setopt($curl, CURLOPT_FAILONERROR, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

$output = curl_exec($curl);
if ($output === FALSE) {
    echo 'An error has occurred: ' . curl_error($curl) . PHP_EOL;
}
else {
    echo $output;
}
?>

Cloud Run 트래픽이 PSC 엔드포인트에 액세스하려면 VPC로 다시 이그레스해야 하므로 이 Cloud Run 배포에서 네트워크와 서브넷을 지정합니다. Cloud Run에서 직접 VPC 이그레스에 cloudrun-egress 서브넷을 사용하도록 안내하고 있습니다. 직접 VPC 이그레스 서브넷을 통해 이그레스하는 모든 트래픽을 VPC로 다시 전달합니다.

Cloud Shell 사용

gcloud run deploy cloudrun-loop \
    --source . \
    --platform=managed \
    --ingress=internal \
    --allow-unauthenticated  \
    --vpc-egress=all-traffic \
    --network=consumer-vpc \
    --subnet=cloudrun-egress \
    --region=$region

Cloud Run 서비스 배포가 완료되면 https://cloudrun-loop-<projectnum>.<region>.run.app 형식의 서비스 URL이 제공됩니다. 이 URL도 다음 단계에서 테스트할 예정이므로 기억해 두세요.

14. Cloud Run URL을 통해 CloudRun-Loop에 대한 연결 테스트

Cloud Shell 사용

gcloud compute ssh \
    --zone "$zone" "consumer-client" \
    --tunnel-through-iap \
    --project $projectid

<Cloud-Run-ServiceURL>을 이전 단계에서 기록한 서비스 URL로 바꿉니다.

소비자 클라이언트 VM에서

curl <Cloud-Run-ServiceURL>

정상 출력

Hello World!

이 결과는 CloudRun-Loop 서비스가 consumer-vpc를 다시 호출하여 Hello World Cloud Run 서비스에 연결된 PSC 엔드포인트를 호출하고 있음을 보여줍니다. 하지만 이 시점에서 소비자 클라이언트 VM은 Cloud NAT를 통해 인터넷으로 이그레스하여 공개 Cloud Run URL을 호출합니다. URL에 대해 dig를 실행하여 공개 IP 주소로 확인될 수 있음을 보여줄 수 있습니다.

소비자 클라이언트 VM에서

dig <Cloud-Run-ServiceURL>

샘플 출력

; <<>> DiG 9.18.33-1~deb12u2-Debian <<>> https://cloudrun-loop-<projectnum>.<region>.run.app
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 1938
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;https://cloudrun-loop-<projectnum>.<region>.run.app.        IN A

;; ANSWER SECTION:
https://cloudrun-loop-<projectnum>.<region>.run.app. 300 IN A 216.239.38.53
https://cloudrun-loop-<projectnum>.<region>.run.app. 300 IN A 216.239.36.53
https://cloudrun-loop-<projectnum>.<region>.run.app. 300 IN A 216.239.32.53
https://cloudrun-loop-<projectnum>.<region>.run.app. 300 IN A 216.239.34.53

;; Query time: 4 msec
;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP)
;; WHEN: Tue Mar 11 19:05:36 UTC 2025
;; MSG SIZE  rcvd: 147

Google API 엔드포인트의 PSC를 만들어 이 해상도를 비공개로 변경하여 트래픽이 공개 인터넷에 노출되지 않도록 할 수 있습니다.

소비자 클라이언트 VM에서

exit

15. Google API 엔드포인트용 PSC 만들기

이 PSC 엔드포인트는 이전에 만든 엔드포인트와 다릅니다. Google API용 PSC는 Google API 번들 (모든 API 또는 VPC-SC 호환 API)을 가리킵니다. IP 주소는 지역 서브넷에서 가져오지 않으며, 기존 VPC 서브넷, 피어링된 VPC 서브넷 또는 하이브리드 경로와 겹칠 수 없는 전역 단일 /32 IP 주소로 생성됩니다.

Cloud Shell 사용

export pscgoogip=100.100.100.100

echo $pscgoogip

gcloud compute addresses create psc-goog-ep-ip \
    --global \
    --purpose=PRIVATE_SERVICE_CONNECT \
    --addresses=$pscgoogip \
    --network=consumer-vpc

Cloud Shell 사용

gcloud compute forwarding-rules create psc4googapi \
    --global \
    --network=consumer-vpc \
    --address=psc-goog-ep-ip \
    --target-google-apis-bundle=all-apis

16. run.app의 Cloud DNS 비공개 영역 만들기

Google API 엔드포인트의 PSC가 생성되면 googleapis.com 도메인에 속하는 모든 API에 Cloud Run 비공개 DNS 영역이 생성됩니다. Cloud Run은 run.app을 사용하므로 run.app을 Google API 엔드포인트의 PSC에 매핑하기 위해 다른 비공개 영역을 만들어야 합니다.

Cloud Shell 사용

gcloud dns managed-zones create "cloudrun" \
    --dns-name=run.app \
    --description="run.app psc resolution" \
    --visibility=private \
    --networks=consumer-vpc

gcloud dns record-sets transaction start \
   --zone="cloudrun"

gcloud dns record-sets transaction add $pscgoogip \
   --name=*.run.app \
   --ttl=300 \
   --type=A \
   --zone="cloudrun"

gcloud dns record-sets transaction execute \
   --zone="cloudrun"

17. 비공개 DNS 확인 테스트

소비자 클라이언트 VM에 다시 로그인하고 dig를 다시 실행합니다. 이제 Cloud Run URL이 Google API 엔드포인트의 PSC로 확인됩니다.

Cloud Shell 사용

gcloud compute ssh \
    --zone "$zone" "consumer-client" \
    --tunnel-through-iap \
    --project $projectid

먼저 DNS 캐시를 삭제합니다. <Cloud-Run-ServiceURL>을 이전에 기록한 서비스 URL로 바꿉니다.

소비자 클라이언트 VM에서

sudo resolvectl flush-caches

curl <CloudRun-Loop-ServiceURL>

curl은 이전과 동일하게 작동합니다.

소비자 클라이언트 VM에서

curl <CloudRun-Loop-ServiceURL>

정상 출력

Hello World!

소비자 클라이언트 VM에서

dig <CloudRun-Loop-ServiceURL>

dig를 실행하면 Cloud Run 루프 서비스가 이제 Google API 엔드포인트의 PSC로 확인됩니다.

샘플 출력

; <<>> DiG 9.18.33-1~deb12u2-Debian <<>> https://cloudrun-loop-<projectnum>.<region>.run.app
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 30179
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;https://cloudrun-loop-<projectnum>.<region>.run.app.        IN A

;; ANSWER SECTION:
https://cloudrun-loop-<projectnum>.<region>.run.app. 300 IN A 100.100.100.100

;; Query time: 8 msec
;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP)
;; WHEN: Tue Mar 11 20:04:05 UTC 2025
;; MSG SIZE  rcvd: 99

완료되었습니다.

18. 정리 단계

VM 인스턴스 종료

exit

Cloud Shell 사용

gcloud dns record-sets delete *.run.app --zone="cloudrun" --type=A -q

gcloud dns managed-zones delete "cloudrun" -q

gcloud compute instances delete consumer-client --zone=$zone --project=$projectid -q

gcloud compute forwarding-rules delete psc4googapi --global -q

gcloud compute addresses delete psc-goog-ep-ip --global -q

gcloud run services delete cloudrun-loop --region=$region -q 

gcloud artifacts docker images delete $region-docker.pkg.dev/$projectid/cloud-run-source-deploy/cloudrun-loop -q

gcloud compute forwarding-rules delete cloudrun-ep --region=$region -q

gcloud compute addresses delete cloudrun-service-ip --region=$region -q

gcloud compute network-firewall-policies rules delete 1000 --firewall-policy consumer-vpc-policy --global-firewall-policy -q

gcloud compute network-firewall-policies associations delete --firewall-policy=consumer-vpc-policy  --name=network-consumer-vpc --global-firewall-policy -q

gcloud compute network-firewall-policies delete consumer-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 consumer-subnet --region $region -q

다음 두 명령어를 실행하면 '리소스 사용 중' 오류가 발생하여 실패할 수 있습니다. Cloud Run 문서에 따르면 Cloud Run 서비스가 삭제된 후 Cloud Run에서 서브넷 리소스를 해제하는 데 1~2시간이 걸리는 경우가 있다고 합니다. 삭제에 실패하면 이 두 명령어를 건너뛰고 다음 섹션으로 이동한 다음 잠시 후에 이 섹션으로 돌아와 삭제하세요.

Cloud Shell 사용

gcloud compute networks subnets delete cloudrun-egress --region $region -q

gcloud compute networks delete consumer-vpc -q

Cloud Shell 사용

gcloud compute service-attachments delete cloudrun-attachment --region=$region -q

gcloud compute instances delete producer-client --zone=$zone --project=$projectid -q

gcloud compute forwarding-rules delete cloudrun-fr --region=$region -q

gcloud compute target-http-proxies delete producer-http-proxy --region=$region -q

gcloud compute url-maps delete producer-urlmap --region=$region -q

gcloud compute backend-services delete cloudrun-producer-bes --region=$region -q

gcloud compute network-endpoint-groups delete cloudrun-producer-neg --region=$region -q

gcloud compute addresses delete cloudrun-ip --region=$region -q

gcloud run services delete helloworld --region=$region -q 

gcloud artifacts docker images delete $region-docker.pkg.dev/$projectid/cloud-run-source-deploy/helloworld -q

gcloud artifacts repositories delete cloud-run-source-deploy --location=$region -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 networks subnets delete lb-proxy-subnet --region $region -q

gcloud compute networks subnets delete psc-nat-subnet --region $region -q

gcloud compute networks subnets delete producer-subnet --region $region -q

gcloud compute networks delete producer-vpc -q

19. 축하합니다.

축하합니다. Codelab을 완료했습니다.

학습한 내용

  • Cloud Run에 기본 앱 배포
  • Cloud Run 인그레스 및 이그레스 제어
  • 서버리스 NEG를 사용하여 내부 애플리케이션 부하 분산기를 통해 Cloud Run 배포
  • 서비스 연결을 통해 PSC 프로듀서 서비스 설정
  • PSC 엔드포인트 배포