Cloud Storage 버킷에 IAP 사용 설정

이 문서에서는 Cloud Run 및 Identity-Aware Proxy를 사용하여 Cloud Storage에서 보안 정적 콘텐츠를 제공하는 방법을 설명합니다.

Cloud Run을 사용하면 비공개 Cloud Storage 버킷에서 정적 콘텐츠를 제공하는 웹 서버를 호스팅할 수 있습니다. IAP를 추가하면 콘텐츠가 변경될 때 컨테이너 이미지를 다시 빌드할 필요 없이 무단 액세스를 방지하여 Cloud Run 서비스를 보호할 수 있습니다.

Cloud Storage 정적 웹사이트 호스팅은 공개 콘텐츠만 제공하며 allUsers에 읽기 액세스 권한을 부여해야 합니다. 조직에서 공개 버킷을 제한하는 경우 공개 액세스 방지 또는 도메인 제한 공유와 같은 정책을 사용하여 기본 제공 Cloud Storage 정적 웹사이트 호스팅 기능을 사용할 수 없습니다. 대신 버킷을 비공개로 유지하고, 버킷이 볼륨으로 마운트된 Cloud Run에 NGINX 웹 서버를 배포하고, IAP를 사용하여 Cloud Run 서비스에 대한 액세스를 제어합니다.

시작하기 전에

이 문서의 안내를 완료하려면 다음이 필요합니다.

  • 결제가 사용 설정된 Google Cloud 프로젝트가 있어야 합니다. 콘솔로 이동 Google Cloud
  • 정적 파일 (예: index.html, CSS, 이미지)이 포함된 비공개 Cloud Storage 버킷 버킷이 공개되지 않도록 합니다.
  • Google Cloud CLI 설치.

Cloud Storage 버킷에 대한 액세스 권한 부여

Cloud Run은 비공개 Cloud Storage 버킷에서 파일을 읽을 수 있는 권한이 필요합니다. 버킷에 대한 스토리지 객체 뷰어 (roles/storage.objectViewer) 역할을 Cloud Run 서비스 ID에 부여해야 합니다.

기본 Compute Engine 서비스 계정 대신 Cloud Run 서비스에 사용자 관리형 서비스 계정을 사용하는 것이 좋습니다.

  1. 서비스 ID로 사용할 서비스 계정을 만듭니다.

    gcloud iam service-accounts create RUN_SERVICE_ACCOUNT \
        --description="Service account for Cloud Run serving Cloud Storage" \
        --display-name="Cloud Run Cloud Storage Reader"
    
  2. 버킷에 대한 스토리지 객체 뷰어(roles/storage.objectViewer) 역할을 서비스 계정에 부여합니다.

    gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \
        --member="serviceAccount:RUN_SERVICE_ACCOUNT@PROJECT_ID." \
        --role="roles/storage.objectViewer"
    

Cloud Run 서비스 배포

Cloud Run에 NGINX 웹 서버를 배포하고 Cloud Storage 버킷을 마운트합니다. 볼륨 마운트를 지원하려면 2세대 실행 환경을 사용해야 합니다.

버킷을 마운트하려면 볼륨 플래그를 사용하여 서비스를 배포합니다.

gcloud run deploy SERVICE_NAME \
    --image=nginx \
    --port=80 \
    --execution-environment=gen2 \
    --service-account=RUN_SERVICE_ACCOUNT@PROJECT_ID. \
    --add-volume=name=static,type=cloud-storage,bucket=BUCKET_NAME,readonly=true \
    --add-volume-mount=volume=static,mount-path=/usr/share/nginx/html \
    --no-allow-unauthenticated

다음을 바꿉니다.

  • SERVICE_NAME: Cloud Run 서비스 이름
  • RUN_SERVICE_ACCOUNT: 이전 단계에서 만든 서비스 계정
  • PROJECT_ID: 프로젝트 ID Google Cloud
  • BUCKET_NAME: Cloud Storage 버킷 이름

버킷은 /usr/share/nginx/html에 마운트됩니다. 이 디렉터리는 NGINX가 정적 애셋을 찾는 기본 디렉터리입니다. 즉, 버킷의 파일이 서비스의 루트 경로에 직접 매핑됩니다. 예를 들어 에 저장된 파일은 gs://BUCKET_NAME/index.html에서 액세스할 수 있습니다.https://SERVICE_URL/index.html

배포를 확인하려면 서비스가 인증되지 않은 액세스를 차단하고 사용자 인증 정보 없이 액세스할 때 403 Forbidden 상태를 반환하는지 확인합니다.

curl -I SERVICE_URL

또는 IAP 액세스를 구성하기 전에 컨테이너가 비공개 Cloud Storage 버킷의 파일을 올바르게 렌더링하는지 테스트할 수 있습니다. 이렇게 하려면 다음 명령어를 실행하여 개발자 사용자 인증 정보를 사용하여 인증된 요청을 보냅니다.

curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" SERVICE_URL

SERVICE_URL을 Cloud Run 서비스의 URL로 바꿉니다.

IAP 사용 설정

Cloud Run 서비스를 배포한 후 IAP를 사용 설정하여 서비스를 보호할 수 있습니다.

Cloud Run 서비스에서 직접 IAP를 사용 설정하는 것이 좋습니다. 자세한 내용은 Cloud Run용 IAP 구성을 참조하세요.

또는 Cloud Run 서비스 앞에 외부 HTTPS 부하 분산기를 사용하는 경우 백엔드 서비스에서 IAP를 사용 설정할 수 있습니다. 자세한 내용은 백엔드 서비스 또는 부하 분산기에서 IAP 사용 설정을 참조하세요.

캐싱 및 성능

Cloud Storage 볼륨 마운트를 사용하면 Cloud Run에서 읽은 각 파일이 Cloud Storage API 호출로 변환됩니다. 지연 시간과 API 비용을 최소화하려면 웹 서버에서 캐싱을 구성하거나 (예: NGINX 캐싱 지시어 사용) Cloud Storage FUSE 마운트 옵션을 구성하면 됩니다.

외부 HTTPS 부하 분산기를 사용하는 경우 백엔드 서비스에서 Cloud CDN을 사용 설정할 수도 있습니다. IAP는 동일한 백엔드 서비스의 Cloud CDN과 호환되지 않으므로 둘 다 필요한 경우 아키텍처를 적절하게 구성해야 할 수 있습니다.

제한사항

Cloud Storage 볼륨 마운트에서 파일을 읽는 것이 로컬 파일 시스템에 액세스하는 것보다 느릴 수 있습니다. 읽기 지연 시간을 완화하려면 캐싱을 구성하세요.

기타 사용 사례

Cloud Storage 볼륨 마운트는 다음과 같은 다른 시나리오에도 사용할 수 있습니다.

  • 이벤트 기반 함수: 함수는 업로드된 파일을 파일 시스템에서 직접 읽습니다.
  • 생성형 AI 애플리1케이션: 애플리케이션은 표준 파일 시스템 읽기를 사용하여 Cloud Storage 버킷에서 벡터 데이터베이스 (예: Chroma)를 로드합니다.

대안: NFS 볼륨 마운트

파일이 Filestore 또는 자체 호스팅 NFS 서버에 저장된 경우 Cloud Storage 버킷 대신 Cloud Run 서비스에 NFS 볼륨을 마운트할 수 있습니다. 자세한 내용은 NFS 볼륨 마운트를 참조하세요.