Cloud Run 인그레스 트래픽 보호

1. 개요

이 실습에서는 Cloud Run 서비스에 대한 액세스를 제한하고 온프레미스 또는 프로젝트의 VPC에서 실행되는 워크로드의 요청만 허용하는 방법을 보여줍니다. 인그레스 설정과 Identity and Access Management (IAM) 정책이라는 두 가지 액세스 제어 레이어를 사용할 수 있습니다.

5aed47d10595c878.png

인그레스 설정

인그레스 설정을 사용하면 네트워크 출처 (내부 또는 외부)를 기준으로 요청을 필터링할 수 있습니다. 기본적으로 공개 인터넷의 요청을 비롯한 모든 요청이 통과할 수 있습니다.

IAM 정책

IAM 정책을 사용하면 발신자의 ID를 기준으로 요청을 필터링할 수 있으며 일반적으로 서비스 간 요청을 인증하는 데 사용됩니다.

이 실습에서는 인그레스 설정을 사용하는 방법과 시기를 알아봅니다.

온프레미스 호스트는 VPC를 통해 연결

이 실습에서는 온프레미스 워크로드를 시뮬레이션합니다. 온프레미스 호스트를 Cloud Run에 연결하려면 온프레미스 호스트의 비공개 Google 액세스를 구성합니다. 여기에는 아래와 같이 VPC 네트워크에서 Cloud VPN 게이트웨이를 설정하는 작업이 포함됩니다.

31611f6a2f12fd0c.png

VPC의 점프 서버를 사용하여 온프레미스 워크로드 시뮬레이션

이 실습에서는 아래와 같이 VPC의 Compute Engine 가상 머신에서 요청을 전송하여 온프레미스 호스트에서 요청을 전송하는 과정을 시뮬레이션합니다.

aebf22740c7a84f0.png

점프 서버로 사용할 Compute Engine 가상 머신은 Cloud VPN 게이트웨이와 동일한 네트워크 출처에 있으므로 이를 사용하여 온프레미스 워크로드에서 요청 전송을 시뮬레이션할 수 있습니다.

2. 설정 및 요구사항

자습형 환경 설정

  1. Google Cloud Console에 로그인하여 새 프로젝트를 만들거나 기존 프로젝트를 재사용합니다. 아직 Gmail이나 Google Workspace 계정이 없는 경우 계정을 만들어야 합니다.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • 프로젝트 이름은 이 프로젝트 참가자의 표시 이름입니다. 이는 Google API에서 사용하지 않는 문자열이며 언제든지 업데이트할 수 있습니다.
  • 프로젝트 ID는 모든 Google Cloud 프로젝트에서 고유하며, 변경할 수 없습니다(설정된 후에는 변경할 수 없음). Cloud 콘솔이 고유한 문자열을 자동으로 생성합니다. 보통은 그게 뭔지 상관하지 않습니다. 대부분의 Codelab에서는 프로젝트 ID (일반적으로 PROJECT_ID로 식별됨)를 참조해야 합니다. 생성된 ID가 마음에 들지 않으면 무작위로 다른 ID를 생성할 수 있습니다. 또는 직접 시도해 보고 사용 가능한지 확인할 수도 있습니다. 이 단계 이후에는 변경할 수 없으며 프로젝트 기간 동안 유지됩니다.
  • 참고로 세 번째 값은 일부 API에서 사용하는 프로젝트 번호입니다. 이 세 가지 값에 대한 자세한 내용은 문서를 참고하세요.
  1. 다음으로 Cloud 리소스/API를 사용하려면 Cloud 콘솔에서 결제를 사용 설정해야 합니다. 이 Codelab 실행에는 많은 비용이 들지 않습니다. 이 튜토리얼이 끝난 후에 요금이 청구되지 않도록 리소스를 종료하려면 만든 리소스를 삭제하거나 전체 프로젝트를 삭제하면 됩니다. Google Cloud 새 사용자에게는 미화 $300 상당의 무료 체험판 프로그램에 참여할 수 있는 자격이 부여됩니다.

환경 설정

  1. 이후 명령어에서 사용할 수 있도록 환경 변수를 프로젝트 ID로 설정합니다.
export PROJECT_ID=$(gcloud config get-value project)
export REGION=us-central1
export ZONE=us-central1-a
  1. 이 실습을 실행하는 데 필요한 API를 사용 설정합니다.
gcloud services enable \
  run.googleapis.com \
  cloudbuild.googleapis.com \
  compute.googleapis.com \
  artifactregistry.googleapis.com
  1. 샘플 앱 저장소를 클론하고 디렉터리로 이동합니다.
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git

cd cymbal-eats/partner-registration-service
  1. Compute Engine 및 Cloud Run의 기본 리전 및 영역 설정
gcloud config set compute/region ${REGION}
gcloud config set run/region ${REGION}
gcloud config set compute/zone ${ZONE}

3. 서비스 배포

먼저 서비스를 배포하고 공개적으로 액세스할 수 있는 상태로 둡니다. 브라우저에서 요청을 보낼 수 있는 것으로 확인되면 Google은 서비스를 잠그고 내부 네트워크 소스의 요청만 허용합니다.

다음 명령어를 실행할 때는 다음 안내를 따르세요.

  • 소스 코드 위치 (...): 파트너 등록 서비스 디렉터리에 있는지 확인하고 Enter 키를 눌러 기본값을 수락합니다.
  • 서비스 이름 (partner-registration-service): Enter를 눌러 기본값을 수락하세요.
  • [partner-register-service] (예/아니요)에 대한 인증되지 않은 호출을 허용하시겠습니까? Y
gcloud run deploy 

이 명령어가 완료되면 Cloud Run 서비스의 URL이 나열됩니다. 출력은 다음 목록과 유사합니다.

Service [partner-registration-service] revision [partner-registration-service-00001-haz] has been deployed and is serving 100 percent of traffic.
Service URL: https://partner-registration-service-ssssssssss-uc.a.run.app

브라우저에서 서비스 URL을 엽니다. 다음과 같은 출력을 볼 수 있습니다.

Partner registration service: RUNNING

내부 요청만 허용하도록 서비스 설정

이제 Cloud Run 서비스의 인그레스 설정을 사용하여 내부 소스의 요청만 허용합니다. 내부 소스에는 Cloud Run 서비스와 동일한 프로젝트 (또는 VPC 서비스 제어 경계)에 있는 VPC 네트워크의 리소스가 포함되어 사용 사례에 가장 적합합니다.

또한 다른 Google Cloud 제품의 요청은 VPC의 일부가 아니더라도 내부 요청으로 간주됩니다. 이러한 제품에는 Pub/Sub 및 Workflows가 포함됩니다.

이러한 소스의 요청은 run.app URL에서 서비스에 액세스하더라도 Google 네트워크 내에 유지되며 공개 액세스는 금지됩니다.

내부 요청만 허용하도록 서비스를 업데이트합니다.

gcloud run services update partner-registration-service --ingress=internal

서비스 URL을 다시 열면 '오류: 금지됨 - 액세스가 금지됨'이라고 표시됩니다.

브라우저가 Google Cloud 프로젝트 내부 출처가 아닌 외부 네트워크 출처에서 요청을 전송하기 때문에 이는 정확히 예상하는 결과입니다. 서비스 보안이 더욱 강화되었습니다.

4. 점프 서버로 Compute Engine 가상 머신 만들기

다음 단계는 점프 서버로 사용할 Compute Engine 인스턴스를 VPC에 만들어 Cloud VPN 게이트웨이를 통해 온프레미스 서버의 요청을 시뮬레이션하는 것입니다.

gcloud compute instances create jump-server --scopes=https://www.googleapis.com/auth/cloud-platform

이 명령어의 출력은 다음과 비슷해야 합니다.

NAME         ZONE           MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP   STATUS
jump-server  us-central1-a  n1-standard-1               10.128.0.10  34.170.108.8  RUNNING

Compute Engine 인스턴스에서 서비스로 요청 전송

이제 가상 머신에서 터미널을 열고 VPC 네트워크의 머신에서 직접 요청을 전송합니다.

다음 명령어를 실행하면 Cloud Shell에서 SSH를 설정하라는 메시지가 표시되면 안내를 따릅니다.

gcloud compute ssh jump-server

다음 명령어를 사용하여 Cloud Run 서비스의 URL을 가져옵니다.

gcloud run services describe partner-registration-service --region us-central1

출력의 처음 몇 줄은 다음과 같이 표시됩니다.

✔ Service partner-registration-service in region us-central1

URL:     https://partner-registration-service-ssssssssss-uc.a.run.app
Ingress: internal

이제 URL을 복사하고 curl을 사용하여 Compute Engine 인스턴스에서 요청을 보냅니다. VM 인스턴스가 프로젝트의 VPC 네트워크(내부 소스)에서 실행되므로 이 요청은 성공해야 합니다.

export SERVICE_URL=https://

curl ${SERVICE_URL}

출력은 다음과 같이 표시됩니다.

Partner registration service: RUNNING

5. IAM 기반 액세스 제어는 어떨까요?

이 실습에서는 인그레스 설정을 사용하는 방법과 시기를 살펴보았습니다. 인그레스 설정은 온프레미스 워크로드를 Cloud Run에 연결할 때 좋은 첫 번째 단계입니다.

IAM 기반 액세스 제어를 구현하려면 특히 온프레미스 호스트에서 호출하는 경우 구현에 더 많은 노력이 필요합니다.

  • IAM을 사용하려면 호스트의 장기 서비스 계정 사용자 인증 정보를 관리해야 함
  • 서비스 계정 사용자 인증 정보를 사용하여 요청에 서명하려면 IAM에서 코드를 변경해야 합니다.

Google에서는 액세스 제어에 다계층 접근 방식을 권장합니다. 인그레스 설정을 사용하여 내부 호스트로만 액세스를 제한하는 것은 좋은 첫 단계이지만 거기서 멈추지는 마세요!

6. 축하합니다.

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

다음 단계:

다른 Cymbal Eats Codelab 살펴보기:

삭제

이 튜토리얼에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.

프로젝트 삭제

비용이 청구되지 않도록 하는 가장 쉬운 방법은 튜토리얼에서 만든 프로젝트를 삭제하는 것입니다.

유용한 참고 자료

다음은 Cloud Run의 2가지 액세스 제어 레이어에 대해 자세히 알아보는 데 도움이 되는 추가 리소스입니다.