Cloud Storage 전역 엔드포인트 및 리전 엔드포인트에 대한 Cloud Run 비공개 액세스

1. 소개

Google API 엔드포인트

Google Cloud API는 서비스에 액세스하기 위한 다양한 유형의 엔드포인트를 제공하며, 주로 요청 라우팅, 데이터 상주, 리전 격리를 처리하는 방식이 다릅니다.

API 엔드포인트 유형에 관한 제품 문서를 확인하세요.

전역, 리전, 위치별 엔드포인트의 분류는 다음과 같습니다.

  1. 전역 엔드포인트
  • 형식: {service}.googleapis.com (예: storage.googleapis.com)
  • 설명: 이러한 엔드포인트는 서비스에 대한 단일 전역 액세스 포인트를 제공합니다. URL에 리전을 지정하지 않습니다.
  • 라우팅: 요청은 전역 Google 프런트엔드 (GFE) 및 전역 서비스 부하 분산에 의해 라우팅되며, 일반적으로 지연 시간을 최소화하기 위해 트래픽을 가장 가까운 정상 리전으로 전달합니다.
  • TLS 종료: 데이터 또는 리소스가 상주하는 Google Cloud 리전 외부에 있을 수 있는 클라이언트와 가장 가까운 GFE에서 발생합니다.
  • 데이터 상주: 보장 없음 전송 중인 데이터에 대해 제공됩니다. 데이터는 GFE에서 복호화된 후 리전 경계를 넘을 수 있습니다.
  • 리전 격리: 제한됨. 백엔드는 리전별로 적용되는 경우가 많지만 진입점과 부하 분산은 전역으로 적용되므로 전역 인프라의 한 부분에서 문제가 발생하면 다른 리전의 서비스에 영향을 미칠 수 있습니다.
  • 사용 사례: 지리적으로 분산된 사용자의 짧은 지연 시간이 중요하고 전송 중인 데이터의 엄격한 데이터 상주가 주요 관심사가 아닌 범용 액세스.
  1. 리전 엔드포인트 (REP)
  • 형식: {service}.{location}.rep.googleapis.com (예: storage.us-east1.rep.googleapis.com)
  • 설명: 강력한 리전 격리 및 데이터 상주 보장을 제공하도록 설계되었습니다. 위치 (특정 Google Cloud 리전)는 하위 도메인으로 지정됩니다. 최신 표준이며 위치별 엔드포인트를 대체합니다.
  • 라우팅: 리전 외부 부하 분산기 및 리전 서비스 부하 분산을 비롯한 완전히 리전화된 프런트엔드 스택을 사용합니다 . DNS에서 서비스 백엔드까지 전체 요청 경로가 지정된 리전 내에 유지됩니다.
  • TLS 종료: 리전 외부 부하 분산기의 지정된 리전 내에서 발생합니다.
  • 데이터 상주: 전송 중 및 사용 중 모두 지정된 리전 내에 데이터가 유지되도록 보장하여 엄격한 규정 준수 및 주권 요구사항을 충족합니다.
  • 리전 격리: 강력함. 한 리전의 프런트엔드 인프라에서 장애가 발생해도 다른 리전에 영향을 미치지 않습니다.
  • 사용 사례: 엄격한 데이터 상주, 높은 리전 격리, 규정 준수가 필요한 애플리케이션.

모든 Google API에 리전 엔드포인트가 있는 것은 아니며 지원되는 모든 리전 엔드포인트는 여기에서 확인하세요.

멀티 리전 리전 엔드포인트(mREP)도 리전 엔드포인트입니다(예: storage.us.rep.googleapis.com).

  1. 위치별 엔드포인트 (LEP)
  • 형식: {location}-{service}.googleapis.com (예: us-east1-storage.googleapis.com)
  • 설명: 이러한 엔드포인트는 위치별 액세스를 제공하는 초기 접근 방식이었습니다. 위치는 기본 호스트 이름의 일부입니다. 참고: 위치별 엔드포인트는 리전 엔드포인트로 대체되고 있습니다.
  • 라우팅: 여전히 전역 Google 프런트엔드에 의존합니다.
  • TLS 종료: 일반적으로 호스트 이름에 지정된 리전에 없을 수 있는 GFE에서 발생합니다.
  • 데이터 상주: 보장할 수 없음 공개 인터넷의 트래픽에 대해 전송 중에 데이터가 지정된 리전 내에 유지되도록 합니다.
  • 리전 격리: 전역 프런트엔드 인프라를 사용하므로 리전 엔드포인트보다 약합니다.
  • 사용 사례: 과거에는 일부 리전 액세스 시나리오에 사용되었지만 이제는 더 강력한 보장을 위해 리전 엔드포인트가 권장됩니다.

Google API용 Private Service Connect

Private Service Connect는 소비자가 프로듀서 서비스에 액세스할 수 있도록 허용하는 Google Cloud Networking 기능입니다. 여기에는 사용자의 VPC 내에서 호스팅되는 비공개 엔드포인트를 통해 Google API에 연결하는 기능이 포함됩니다.

PSC 엔드포인트를 사용하여 Google API에 액세스하는 방법은 다음과 같습니다.

PSC 백엔드를 사용하여 Google API에 액세스하는 방법은 다음과 같습니다.

Cloud Run에서 VPC 네트워크로 트래픽 전송

직접 VPC 이그레스는 다음 이점을 포함하여 향상된 인프라와 더 간단한 VPC 이그레스 구성을 Cloud Run에 제공합니다.

  • 설정: Cloud Run 서비스 및 작업은 서버리스 VPC 액세스 커넥터의 오버헤드 없이 VPC 네트워크로 트래픽을 보낼 수 있습니다.
  • 비용: 서비스 자체와 마찬가지로 Scale-to-zero로 네트워크 트래픽 비용만 지불합니다.
  • 보안: 보다 세부적인 네트워크 보안을 위해 서비스 버전에서 직접 네트워크 태그를 사용할 수 있습니다.
  • 성능: 지연 시간이 짧고 처리량이 높습니다.

직접 VPC 이그레스를 사용하면 Cloud Run 서비스, 함수, 작업 또는 작업자 풀에서 모든 트래픽을 VPC 네트워크로 전송하도록 사용 설정할 수 있습니다.

2. 학습할 내용

  • 전역 Google API용 PSC 엔드포인트를 만드는 방법
  • 리전 Google API용 PSC 엔드포인트를 만드는 방법
  • Cloud Run 코드에서 API 엔드포인트를 변경하고 이그레스의 네트워킹을 구성하는 방법

3. 전체 실습 아키텍처

8f5328678688f210.png

4. 준비 단계

실습에 필요한 IAM 역할

프로젝트 수준에서 GCP 계정에 필요한 IAM 역할을 할당하는 것으로 시작합니다.

  • Compute 네트워크 관리자 (roles/compute.networkAdmin) 이 역할은 Compute Engine 네트워킹 리소스를 관리할 수 있는 전체 권한을 부여합니다.
  • Logging 관리자 (roles/logging.admin) 이 역할은 모든 로깅 권한과 종속 권한에 대한 액세스 권한을 부여합니다.
  • 서비스 사용량 관리자 (roles/serviceusage.serviceUsageAdmin) 이 역할은 서비스 상태를 사용 설정, 중지, 검사하고, 작업을 검사하고, 소비자 프로젝트의 할당량과 결제를 사용할 수 있는 권한을 부여합니다.
  • DNS 관리자 (roles/dns.admin) 이 역할은 모든 Cloud DNS 리소스에 대한 읽기-쓰기 액세스 권한을 제공합니다.
  • Cloud Run 관리자 (roles/run.admin) 이 역할은 모든 Cloud Run 리소스를 관리할 수 있는 전체 권한을 부여합니다.
  • 스토리지 관리자 (roles/storage.admin) 이 역할은 객체와 버킷을 관리할 수 있는 전체 권한을 부여합니다.

API 사용 설정

Cloud Shell 내에서 프로젝트가 올바르게 구성되어 있는지 확인하고 환경 변수를 설정합니다.

Cloud Shell 내에서 다음을 수행합니다.

gcloud auth login
gcloud config set project <your project id>
export project_id=<your project id>
export region=<your region>
export zone=$region-a
echo $project_id
echo $region

프로젝트에서 필요한 모든 Google API를 사용 설정합니다. Cloud Shell 내에서 다음을 수행합니다.

gcloud services enable \
  artifactregistry.googleapis.com \
  cloudbuild.googleapis.com \
  run.googleapis.com \
  compute.googleapis.com \
  dns.googleapis.com \
  servicedirectory.googleapis.com \
  networkconnectivity.googleapis.com

VPC 만들기

프로젝트에서 커스텀 서브넷 모드로 VPC 네트워크를 만듭니다. Cloud Shell 내에서 다음을 수행합니다.

gcloud compute networks create mynet \
    --subnet-mode=custom

서브넷 만들기

Cloud Shell 내에서 다음을 수행하여 IPV4 서브넷을 만듭니다.

gcloud compute networks subnets create mysubnet \
    --network=mynet \
    --range=10.0.0.0/24 \
    --region=$region

Cloud NAT 및 Cloud Router 만들기

Cloud NAT는 Cloud Run 작업이 외부 웹사이트에 연결할 수 있도록 허용하는 데 사용됩니다.

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

5. Cloud Storage용 PSC 엔드포인트 만들기

Cloud Storage용 PSC 엔드포인트를 두 개 만듭니다. 하나는 전역 범위용이고 다른 하나는 리전 범위용입니다.

전역 범위의 PSC 엔드포인트 만들기

Private Service Connect를 사용하면 VPC 네트워크 내에서 전역 내부 IP 주소를 사용하여 전역 범위의 비공개 엔드포인트를 만들 수 있습니다.

VPC에 정의되지 않은 고유한 IP 주소를 할당해야 합니다. 이 IP 주소 요구사항에 관한 문서를 참조하세요.

Cloud Shell 내에서 다음을 수행하여 IP 주소를 만듭니다. 할당한 IP 주소를 사용하도록 –addresses=<pscendpointip>를 변경하세요.

gcloud compute addresses create pscglobalip \
    --global \
    --purpose=PRIVATE_SERVICE_CONNECT \
    --addresses=<pscendpointip> \
    --network=mynet
pscendpointip=$(gcloud compute addresses list --filter=name:pscglobalip --format="value(address)")
echo $pscendpointip

엔드포인트를 Google API 및 서비스에 연결하는 전달 규칙을 만듭니다.

gcloud compute forwarding-rules create pscendpoint \
    --global \
    --network=mynet \
    --address=pscglobalip \
    --target-google-apis-bundle=all-apis

Cloud DNS에서 p.googleapis.com 확인

엔드포인트를 만들면 다음 DNS 구성이 자동으로 생성됩니다.

  • 서비스 디렉터리 비공개 DNS 영역이 p.googleapis.com에 생성됩니다.
  • DNS 레코드는 Private Service Connect를 사용하여 제공되며 googleapis.com으로 끝나는 기본 DNS 이름을 갖는 일반적으로 사용되는 Google API 및 서비스에 대해 p.googleapis.com에 생성됩니다.

전역 엔드포인트는 서비스 디렉터리에 등록됩니다. storage-[psc endpoint name].p.googleapis.com을 사용하여 Cloud Storage에 액세스합니다. 자세한 내용은 제품 문서를 참조하세요.

명령어를 실행하여 p.googleaps.com 영역이 이미 생성되었는지 확인합니다.

gcloud dns managed-zones list

기본 DNS 이름인 storage.googleapis.com을 사용하려면 Cloud DNS에서 비공개 영역 storage.googleapis.com을 만들고 전역 범위 IP 주소의 PSC 엔드포인트를 가리키는 정점 레코드를 추가합니다.

Cloud Storage용 리전 범위의 PSC 엔드포인트 만들기

VPC 서브넷의 IP가 하나 필요합니다. 아래 명령어를 실행하면 서브네트워크의 IP가 PSC 엔드포인트에 할당됩니다.

gcloud network-connectivity regional-endpoints create psc-regional-endpoint \
    --region=$region \
    --network=projects/$project_id/global/networks/mynet \
    --subnetwork=projects/$project_id/regions/$region/subnetworks/mysubnet \
    --target-google-api=storage.us-central1.rep.googleapis.com

위 단계에서 만든 엔드포인트 IP 주소를 가져옵니다.

regionalip=$(gcloud network-connectivity regional-endpoints describe psc-regional-endpoint --region=$region --format="value(address)")
echo $regionalip

storage.us-central1.rep.googleapis.com을 사용하여 Cloud Storage에 액세스합니다. Cloud DNS에서 storage.us-central1.rep.googleapis.com의 비공개 영역과 리전 엔드포인트용으로 방금 만든 IP 주소의 정점 레코드를 만들어야 합니다.

Cloud Storage 리전 엔드포인트의 비공개 영역 만들기

storage.[region name].rep.googleapis.com을 사용하여 Cloud Storage 리전 엔드포인트에 액세스합니다.

Cloud DNS에서 비공개 영역을 만들고 Cloud Storage 리전 엔드포인트의 IP 주소를 가리키는 정점 레코드를 추가해야 합니다.

아래 명령어에서 us-central1은 예시 리전입니다. 리전 이름으로 영역을 만들어야 합니다.

gcloud dns managed-zones create psc-regional-endpoint-zone \
  --description="" \
  --dns-name="storage.us-central1.rep.googleapis.com" \
  --visibility="private" \
  --networks="mynet"

gcloud dns record-sets create storage.us-central1.rep.googleapis.com. \
  --rrdatas=$regionalip \
  --ttl=300 \
  --type=A \
  --zone=psc-regional-endpoint-zone

6. 전역 범위의 PSC 엔드포인트로 Cloud Run 작업 구성

코드 가져오기

먼저 Node.js 애플리케이션을 탐색하여 웹페이지의 스크린샷을 찍고 Cloud Storage에 저장해 보겠습니다. 나중에 애플리케이션의 컨테이너 이미지를 빌드하고 Cloud Run에서 작업으로 운영합니다.

Cloud Shell에서 다음 명령어를 실행하여 이 저장소의 애플리케이션 코드를 클론합니다.

git clone https://github.com/GoogleCloudPlatform/jobs-demos.git

애플리케이션이 포함된 디렉터리로 이동합니다.

cd jobs-demos/screenshot

다음과 같은 파일 레이아웃이 표시됩니다.

|

├── Dockerfile

├── README.md

├── screenshot.js

├── package.json

다음은 각 파일의 간략한 설명입니다.

  • screenshot.js에는 애플리케이션의 Node.js 코드가 포함됩니다. 애플리케이션은 웹페이지의 스크린샷을 찍고 Cloud Storage에 저장합니다.
  • package.json은 라이브러리 종속 항목을 정의합니다.
  • Dockerfile은 컨테이너 이미지를 정의합니다.

screenshot.js 코드를 열고 apiEndpoint를 PSC 전역 엔드포인트로 변경합니다. 코드를 검색하고 const storage = new Storage();를 다음으로 바꿉니다.

const storage = new Storage(
    {
      apiEndpoint:'https://storage-pscendpoint.p.googleapis.com.',
      useAuthWithCustomEndpoint: true
    }
  );

작업 배포

작업을 만들기 전에 작업을 실행하는 데 사용할 서비스 계정을 만들어야 합니다.

gcloud iam service-accounts create screenshot-sa --display-name="Screenshot app service account"

버킷과 객체를 만드는 데 사용할 수 있도록 서비스 계정에 storage.admin 역할을 부여합니다.

gcloud projects add-iam-policy-binding $project_id \
  --role roles/storage.admin \
  --member serviceAccount:screenshot-sa@$project_id.iam.gserviceaccount.com

기본 Compute 서비스 계정에 스토리지 객체 사용자 역할, 로그 작성자 역할, Artifact Registry 저장소 관리자를 부여합니다.

project_number=$(gcloud projects describe $project_id --format="value(projectNumber)")

gcloud projects add-iam-policy-binding $project_id \
  --role roles/storage.objectUser \
  --member serviceAccount:$project_number-compute@developer.gserviceaccount.com

gcloud projects add-iam-policy-binding $project_id \
  --role roles/logging.logWriter \
  --member serviceAccount:$project_number-compute@developer.gserviceaccount.com

gcloud projects add-iam-policy-binding $project_id \
  --role roles/artifactregistry.repoAdmin \
  --member serviceAccount:$project_number-compute@developer.gserviceaccount.com

Cloud Run 작업에서 모든 트래픽을 VPC 네트워크로 전송하도록 직접 VPC 이그레스를 사용 설정합니다.

Cloud Shell 내에서 다음을 수행합니다.

gcloud run jobs deploy screenshot-1 \
  --source=. \
  --args="https://example.com" \
  --args="https://cloud.google.com" \
  --tasks=2 \
  --task-timeout=5m \
  --region=$region \
  --set-env-vars=BUCKET_NAME=screenshot-$project_id-$RANDOM \
  --service-account=screenshot-sa@$project_id.iam.gserviceaccount.com \
  --vpc-egress=all-traffic \
  --network=mynet \
  --subnet=mysubnet

작업 실행

Cloud Shell 내에서 다음을 수행합니다.

gcloud run jobs execute screenshot-1 --region=$region

작업 및 로그의 상태를 확인합니다. Cloud Run 콘솔로 이동하여 작업을 찾습니다. 작업을 클릭하고 로그 기록을 확인합니다. 아래와 비슷한 작업 실행 결과가 표시됩니다.

bae25d504ea20384.png

자세한 작업 실행 로그를 보려면 작업에서 로그 보기를 클릭합니다. 아래와 비슷한 작업 로그가 표시됩니다.

aa0468dc463f4320.png

새 버킷이 생성되었습니다. Cloud Storage 콘솔로 이동하여 새로 만든 버킷을 확인할 수 있습니다. Cloud Storage 전역 엔드포인트를 사용하면 버킷이 멀티 리전 버킷이 됩니다. 버킷에 업로드된 이미지를 확인할 수 있습니다.

테스트 결과 Cloud Run 작업에서 변경한 Cloud Storage 전역 엔드포인트에 Cloud Run이 비공개로 액세스한 것으로 나타납니다.

apiEndpoint:‘https://storage-pscendpoint.p.googleapis.com.'

7. 리전 범위의 PSC 엔드포인트로 Cloud Run 작업 구성

코드에서 apiEndpoint를 리전 범위의 PSC 엔드포인트로 변경합니다.

코드를 검색하고 const storage = new Storage();를 다음으로 바꿉니다 ( us-central1을 예시로 사용). 리전으로 변경하세요.

const storage = new Storage(
    {
      apiEndpoint:'https://storage.us-central1.rep.googleapis.com.',
      useAuthWithCustomEndpoint: true
    }
  );

작업 배포

현재 위치가 애플리케이션 (jobs-demos/screenshot)이 포함된 디렉터리에 있는지 확인합니다.

pwd

작업에서 모든 트래픽을 VPC 네트워크로 전송하도록 직접 VPC 이그레스를 사용 설정합니다.

Cloud Shell 내에서 다음을 수행합니다.

gcloud run jobs deploy screenshot-2 \
  --source=. \
  --args="https://example.com" \
  --args="https://cloud.google.com" \
  --tasks=2 \
  --task-timeout=5m \
  --region=$region \
  --set-env-vars=BUCKET_NAME=screenshot-$PROJECT_ID-$RANDOM \
  --service-account=screenshot-sa@$project_id.iam.gserviceaccount.com \
  --vpc-egress=all-traffic \
  --network=mynet \
  --subnet=mysubnet

작업 실행

Cloud Shell 내에서 다음을 수행합니다.

gcloud run jobs execute screenshot-2 --region=$region

작업 및 로그의 상태를 확인합니다. Cloud Run 콘솔로 이동하여 작업을 찾습니다. 작업을 클릭하고 작업 기록을 확인합니다. 아래와 비슷한 작업 실행 결과가 표시됩니다.

1065ce25136d355e.png

자세한 작업 실행 로그를 보려면 로그 보기를 클릭합니다. 아래와 비슷한 작업 로그가 표시됩니다.

837afb2f95a7049b.png

새 버킷이 생성되었습니다. Cloud Storage 콘솔로 이동하여 새로 만든 버킷을 확인할 수 있습니다. Cloud Storage 리전 엔드포인트를 사용하면 버킷이 단일 리전 버킷이 됩니다. 버킷에 업로드된 이미지를 확인할 수 있습니다.

테스트 결과 Cloud Run 작업에서 변경한 Cloud Storage 리전 엔드포인트에 Cloud Run이 비공개로 액세스한 것으로 나타납니다.

apiEndpoint:‘https://storage.us-central1.rep.googleapis.com.'

8. 정리

Cloud Run 작업 정리

gcloud run jobs delete screenshot-1 \
  --region=$region --quiet
gcloud run jobs delete screenshot-2 \
  --region=$region --quiet

gcloud iam service-accounts delete screenshot-sa@$project_id.iam.gserviceaccount.com --quiet

PSC 엔드포인트 삭제

gcloud compute forwarding-rules delete pscendpoint \
    --global --quiet
gcloud network-connectivity regional-endpoints delete psc-regional-endpoint \
    --region=$region --quiet
gcloud compute addresses delete pscglobalip \
    --global --quiet

Cloud NAT, Cloud Router, VPC 정리

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 mysubnet \
    --region=$region --quiet
gcloud compute networks delete mynet --quiet

9. 축하합니다

전역 엔드포인트와 리전 엔드포인트를 통해 Cloud Storage에 대한 Cloud Run 비공개 액세스를 테스트했습니다.