서비스 상태로 리전 간 장애 조치 자동화

이 가이드에서는 외부 트래픽에 대해 자동 장애 조치 및 장애 복구가 있는 고가용성 멀티 리전 Cloud Run 서비스를 배포하는 방법을 보여줍니다. 서버리스 NEG, 전역 외부 애플리케이션 부하 분산기, 준비 상태 프로브를 설정하여 이러한 기능으로 Cloud Run 서비스를 구성할 수 있습니다. 자세한 내용은 여러 리전의 트래픽 제공을 참고하세요.

목표

이 튜토리얼에서는 다음 단계를 진행합니다.

  1. 샘플 애플리케이션 준비
  2. 준비 상태 프로브를 사용하여 두 리전에 Cloud Run 서비스 배포
  3. 전역 외부 애플리케이션 부하 분산기 설정
  4. 서버리스 NEG를 통해 서비스 추가하기
  5. 장애 조치 테스트

시작하기 전에

  1. Google Cloud 계정에 로그인합니다. Google Cloud를 처음 사용하는 경우 계정을 만들고 Google 제품의 실제 성능을 평가해 보세요. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  5. Verify that billing is enabled for your Google Cloud project.

  6. Artifact Registry, Cloud Build, Cloud Run Admin API, Network Services API, Compute Engine API를 사용 설정합니다.

    API 사용 설정에 필요한 역할

    API를 사용 설정하려면 serviceusage.services.enable 권한이 포함된 서비스 사용량 관리자 IAM 역할(roles/serviceusage.serviceUsageAdmin)이 필요합니다. 역할 부여 방법 알아보기

    API 사용 설정

  7. gcloud CLI를 설치하고 초기화합니다.
  8. 구성요소를 업데이트합니다.
    gcloud components update
  9. 이 튜토리얼에서 사용되는 구성 변수를 설정합니다.
    PROJECT_ID= gcloud config set core/project PROJECT_ID
    PROJECT_NUMBER=$(gcloud projects describe PROJECT_ID --format="value(projectNumber)")
    SERVICE=health-example
    REGION_A=us-west1
    REGION_B=europe-west1
    PROJECT_ID를 Google Cloud 프로젝트 ID로 바꿉니다.

필요한 역할 설정

빌드를 사용하여 소스에서 배포하려면 사용자 또는 관리자가 Cloud Build 서비스 계정에 다음 IAM 역할을 부여해야 합니다.

Cloud Build 서비스 계정에 필요한 역할을 보려면 클릭

이 동작을 재정의하지 않는 한 Cloud Build는 자동으로 Compute Engine 기본 서비스 계정을 기본 Cloud Build 서비스 계정으로 사용하여 소스 코드와 Cloud Run 리소스를 빌드합니다. Cloud Build에서 소스를 빌드할 수 있게 하려면 관리자에게 프로젝트의 Compute Engine 기본 서비스 계정에 Cloud Run 빌더(roles/run.builder)를 부여해 달라고 요청하세요.

  gcloud projects add-iam-policy-binding PROJECT_ID \
      --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
      --role=roles/run.builder
  

PROJECT_NUMBER를 Google Cloud프로젝트 번호로, PROJECT_ID를 Google Cloud프로젝트 ID로 바꿉니다. 프로젝트 ID와 프로젝트 번호를 찾는 방법에 대한 자세한 내용은 프로젝트 만들기 및 관리를 참조하세요.

Compute Engine 기본 서비스 계정에 Cloud Run 빌더 역할을 부여하면 전파되는 데 몇 분 정도 걸립니다.

서비스 ID로 파일 및 Cloud Storage 버킷에 액세스하는 데 필요한 권한을 얻으려면 관리자에게 문의하여 서비스 ID에 스토리지 관리자 (roles/storage.admin) 역할을 부여해 달라고 요청하세요. Cloud Storage 역할 및 권한에 대한 자세한 내용은 Cloud Storage용 IAM을 참고하세요.

Cloud Run과 연결된 IAM 역할 및 권한 목록은 Cloud Run IAM 역할Cloud Run IAM 권한을 참조하세요. Cloud Run 서비스가 Cloud 클라이언트 라이브러리와 같은Google Cloud API와 상호작용하는 경우에는 서비스 ID 구성 가이드를 참조하세요. 역할 부여에 대한 자세한 내용은 배포 권한액세스 관리를 참조하세요.

샘플 애플리케이션 준비

사용할 코드 샘플을 검색하려면 다음 안내를 따르세요.

  1. 샘플 저장소를 로컬 머신에 클론합니다.

    git clone https://github.com/GoogleCloudPlatform/golang-samples
    
  2. Cloud Run 샘플 코드가 포함된 디렉터리로 변경합니다.

    cd golang-samples/run/service-health
    

준비 상태 프로브를 사용하여 두 리전에 Cloud Run 서비스 배포

장애 조치에는 서로 다른 리전의 서비스가 2개 이상 필요합니다. 준비 상태 프로브를 사용하여 두 개의 서로 다른 리전에서 소스로부터 서비스를 배포하려면 다음 명령어를 실행합니다.

  1. 소스 디렉터리에서 us-west1europe-west1에 서비스 health-example를 배포합니다. 준비 상태 프로브로 서비스 상태를 구성하려면 최소 인스턴스가 하나 이상 필요합니다.

    gcloud beta run deploy $SERVICE \
    --source=. \
    --regions=$REGION_A,$REGION_B \
    --min=10 \
    --readiness-probe httpGet.path="/are_you_ready"
    
  2. 메시지가 표시되면 y를 응답하여 필요한 API를 설치하도록 프롬프트에 응답합니다. 이 작업은 프로젝트에서 한 번만 수행하면 됩니다. 시작하기 전에 섹션의 설명대로 이에 대한 기본값을 설정하지 않았으면 플랫폼과 리전을 제공하여 다른 프롬프트에 응답합니다.

전역 외부 애플리케이션 부하 분산기 설정

us-west1europe-west1 간에 트래픽을 라우팅하도록 전역 외부 애플리케이션 부하 분산기를 설정하려면 다음 단계를 따르세요.

  1. 백엔드 서비스를 만듭니다.

    gcloud compute backend-services create $SERVICE-bs \
      --load-balancing-scheme=EXTERNAL_MANAGED \
      --global
    
  2. 부하 분산기에 연결할 전역 고정 외부 IP 주소를 설정합니다.

    gcloud compute addresses create $SERVICE-ip \
      --network-tier=PREMIUM \
      --ip-version=IPV4 \
      --global
    
  3. 수신되는 요청을 백엔드 서비스로 라우팅하는 URL 맵을 만듭니다.

    gcloud compute url-maps create $SERVICE-lb \
      --default-service $SERVICE-bs
    
  4. 대상 HTTP 프록시를 만들어 URL 맵에 요청을 라우팅합니다.

    gcloud compute target-http-proxies create $SERVICE-hp \
    --url-map=$SERVICE-lb
    
  5. 수신되는 요청을 프록시로 라우팅하는 전달 규칙을 만듭니다.

    gcloud compute forwarding-rules create $SERVICE-fr \
      --load-balancing-scheme=EXTERNAL_MANAGED \
      --network-tier=PREMIUM \
      --address=$SERVICE-ip \
      --target-http-proxy=$SERVICE-hp \
      --global \
      --ports=80
    

서버리스 NEG를 통해 서비스 추가

서버리스 NEG를 사용하여 us-west1europe-west1에 배포한 서비스를 추가하려면 다음 단계를 따르세요.

  1. us-west1europe-west1에서 Cloud Run 서비스의 서버리스 네트워크 엔드포인트 그룹 (NEG)을 만듭니다.

    gcloud compute network-endpoint-groups create $SERVICE-neg-$REGION_A \
        --region $REGION_A \
        --network-endpoint-type=serverless \
        --cloud-run-service=$SERVICE
    
    gcloud compute network-endpoint-groups create $SERVICE-neg-$REGION_B \
        --region $REGION_B \
        --network-endpoint-type=serverless \
        --cloud-run-service=$SERVICE
    
  2. us-west1europe-west1의 백엔드 서비스에 서버리스 NEG를 백엔드로 추가합니다.

    gcloud compute backend-services add-backend $SERVICE-bs \
        --global \
        --network-endpoint-group=$SERVICE-neg-$REGION_A \
        --network-endpoint-group-region=$REGION_A
    
    gcloud compute backend-services add-backend $SERVICE-bs \
        --global \
        --network-endpoint-group=$SERVICE-neg-$REGION_B \
        --network-endpoint-group-region=$REGION_B
    

추가 구성 옵션은 Cloud Run을 사용하여 전역 외부 애플리케이션 부하 분산기 설정을 참고하세요.

장애 조치 테스트

Cloud Run 서비스의 안정성과 복원력을 보장하기 위해 장애 조치를 테스트하려면 다음 단계를 따르세요.

  1. 다음 명령어를 실행하여 부하 분산기의 IP 주소를 가져옵니다.

    LBIP=$(gcloud compute addresses describe $SERVICE-ip --global --format='value(address)')
    
  2. 선택사항: 서비스에 인증이 필요한 경우 부하 분산기에 요청을 보냅니다.

    curl  -H "Authorization: Bearer $(gcloud auth print-identity-token)" $LBIP
    
  3. echo $LBIP 명령어를 실행하여 LBIP 변수 값을 가져옵니다. 그러면 부하 분산기의 IP 주소가 출력됩니다. 예를 들면 11.22.33.44입니다.

  4. 장애 조치를 테스트하려면 http://LOAD_BALANCER_IP URL로 이동합니다. 여기서 LOAD_BALANCER_IP는 이전 단계에서 가져온 값입니다. 게재 지역 섹션에서 해당 지역의 전환 버튼을 클릭합니다. 이는 정상 리전과 트래픽을 처리하는 인스턴스를 지정합니다.

    Cloud Run 서비스 상태로 리전 간 장애 조치 자동화

삭제

Google Cloud 계정에 추가 비용이 청구되지 않게 하려면 이 튜토리얼에서 배포한 모든 리소스를 삭제합니다.

프로젝트 삭제

이 튜토리얼용으로 새 프로젝트를 만든 경우 이 프로젝트를 삭제합니다. 기존 프로젝트를 사용했고 이 튜토리얼에 추가된 변경사항을 제외하고 보존하려면 튜토리얼을 위해 만든 리소스를 삭제합니다.

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

프로젝트를 삭제하는 방법은 다음과 같습니다.

  1. Google Cloud 콘솔에서 리소스 관리 페이지로 이동합니다.

    리소스 관리로 이동

  2. 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제를 클릭합니다.
  3. 대화상자에서 프로젝트 ID를 입력한 후 종료를 클릭하여 프로젝트를 삭제합니다.

튜토리얼 리소스 삭제

  1. 이 튜토리얼에서 배포한 Cloud Run 서비스를 삭제합니다. Cloud Run 서비스는 요청을 수신할 때까지 비용을 청구하지 않습니다.

    Cloud Run 서비스를 삭제하려면 다음 명령어를 실행합니다.

    gcloud run services delete SERVICE-NAME

    SERVICE-NAME를 서비스 이름으로 바꿉니다.

    Google Cloud 콘솔에서 Cloud Run 서비스를 삭제할 수도 있습니다.

  2. 튜토리얼 설정 중에 추가한 gcloud 기본 리전 구성을 삭제합니다.

     gcloud config unset run/region
    
  3. 프로젝트 구성을 삭제합니다.

     gcloud config unset project
    

다음 단계