Spanner용 분산 자동 확장 처리 도구 배포


이 튜토리얼에서는 분산 배포 토폴로지를 사용하여 Spanner용 자동 확장 처리 도구의 인프라를 설정하는 방법을 안내합니다. 이 가이드에 나와 있는 배포 옵션에서 자동 확장 처리의 모든 구성요소는 Cloud Scheduler, 전달자 주제 및 해당 함수를 제외하면 단일 프로젝트에 있습니다.

이 튜토리얼은 운영 오버헤드를 줄이고 Spanner 배포 비용을 최적화하려는 IT, 운영, 사이트 안정성 엔지니어링 팀을 대상으로 합니다. 이 문서는 다음 시리즈의 일부입니다.

분산형 배포 토폴로지는 프로젝트별 및 중앙 집중식 배포의 다음과 같은 유용한 기능을 모두 제공합니다.

  • Spanner 인스턴스를 소유한 팀(애플리케이션 팀이라고 함)은 자신이 소유한 Cloud Scheduler 작업을 사용하여 인스턴스의 자동 확장 처리 구성 매개변수를 관리합니다.
  • 중앙 팀은 구성 매개변수 외에 나머지 자동 확장 처리 인프라를 관리하여 관리 오버헤드를 최소화합니다.

아키텍처

다음 다이어그램은 분산형 배포 토폴로지의 자동 확장 처리 아키텍처를 보여줍니다.

분산형 배포 토폴로지

자동 확장 처리의 구성요소 및 이벤트 흐름에서 번호로 지정된 각 단계에 대한 설명은 Spanner 자동 확장을 참조하세요.

전달자 함수

Cloud Scheduler는 동일한 프로젝트의 주제에만 메시지를 게시할 수 있으므로 이 가이드에서는 배포 토폴로지를 위해 전달자 함수라는 중간 구성요소를 소개합니다.

전달자 함수는 Cloud Scheduler에서 Pub/Sub로 메시지를 게시하고, 해당 JSON 구문을 확인하고, 이를 Poller Pub/Sub 주제로 전달합니다. 주제는 Cloud Scheduler에 대해 개별 프로젝트에 속할 수 있습니다.

다음 다이어그램은 전달 메커니즘에 사용되는 구성요소를 보여줍니다.

전달 메커니즘

앞의 다이어그램에 표시되었듯이 Spanner 인스턴스는 애플리케이션 1이라는 프로젝트와 애플리케이션 2라는 프로젝트에 있습니다.

  1. Cloud Scheduler는 Spanner 인스턴스와 동일한 프로젝트입니다.
  2. (2a) Cloud Scheduler는 애플리케이션 1 및 애플리케이션 2 프로젝트의 전달자 주제로 메시지를 게시합니다.

    (2b) 전달자 함수는 전달자 주제에서 메시지를 읽습니다.

    (2c) 전달자 함수가 자동 확장 처리 프로젝트에 있는 폴링 주제로 메시지를 전달합니다.

  3. Poller 함수는 Spanner 자동 확장의 설명처럼 폴링 주제에서 메시지를 읽고 프로세스가 계속됩니다.

목표

  • 분산형 배포 모델을 사용하여 자동 확장 처리 배포하기
  • 기존 Spanner 인스턴스를 Terraform 상태로 가져옵니다.
  • 자동 확장 처리 구성하기

비용

이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요. Google Cloud를 처음 사용하는 사용자는 무료 체험판을 사용할 수 있습니다.

이 튜토리얼의 안내를 따르면 자동 확장 처리 구성요소 작업과 관련된 비용이 없거나 거의 발생하지 않습니다. 그러나 이 예상 비용에는 Spanner 인스턴스 비용은 포함되지 않습니다. Spanner 인스턴스의 비용을 계산하는 방법의 예시는 Spanner 자동 확장을 참고하세요.

이 문서에 설명된 태스크를 완료했으면 만든 리소스를 삭제하여 청구가 계속되는 것을 방지할 수 있습니다. 자세한 내용은 삭제를 참조하세요.

시작하기 전에

분산형 배포 토폴로지에서 자동 확장 처리 프로젝트 외에 추가적으로 두 번째 프로젝트를 설정합니다. 이 튜토리얼에서는 이를 애플리케이션 프로젝트라고 합니다. 애플리케이션 프로젝트는 Spanner를 포함한 애플리케이션 리소스를 보관합니다. 이 튜토리얼에서는 이러한 두 프로젝트에 대해 결제 및 API를 별도로 설정하고 사용 설정합니다.

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

  2. Cloud Shell에서 다음 저장소를 클론합니다.

    git clone https://github.com/cloudspannerecosystem/autoscaler
    
  3. 작업 디렉터리의 변수를 내보냅니다.

    export AUTOSCALER_DIR="$(pwd)/autoscaler/terraform/cloud-functions/distributed/autoscaler-project"
    export APP_DIR="$(pwd)/autoscaler/terraform/cloud-functions/distributed/app-project"
    

자동 확장 처리 프로젝트 준비

이 섹션에서는 Cloud Scheduler를 제외한 중앙 집중식 자동 확장 처리 인프라가 포함된 프로젝트의 배포를 준비합니다.

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

    Go to project selector

  2. Make sure that billing is enabled for your Google Cloud project.

  3. Enable the Identity and Access Management (IAM), Resource Manager, App Engine Admin, Firestore, Spanner, Pub/Sub, Cloud Run functions, and Cloud Build APIs.

    Enable the APIs

  4. Cloud Shell에서 자동 확장 처리 프로젝트의 ID로 환경 변수를 설정합니다.

    export AUTO_SCALER_PROJECT_ID=INSERT_YOUR_PROJECT_ID
    gcloud config set project "${AUTO_SCALER_PROJECT_ID}"
    
  5. 자동 확장 처리 인프라의 리전과 영역App Engine 위치(Firestore의 경우)를 설정합니다.

     export AUTO_SCALER_REGION=us-central1
     export AUTO_SCALER_ZONE=us-central1-c
     export AUTO_SCALER_APP_ENGINE_LOCATION=us-central
    
  6. 서비스 계정을 만듭니다.

    gcloud iam service-accounts create terraformer --display-name "Terraform service account"
    

    Terraform은 이 계정을 사용하여 인프라에 모든 리소스를 만듭니다.

  7. 서비스 계정에 프로젝트 소유자 역할을 제공합니다.

     gcloud projects add-iam-policy-binding "${AUTO_SCALER_PROJECT_ID}" \
        --member "serviceAccount:terraformer@${AUTO_SCALER_PROJECT_ID}.iam.gserviceaccount.com" \
        --role roles/owner
    
  8. 서비스 계정 키 파일을 만듭니다.

     gcloud iam service-accounts keys create \
        --iam-account "terraformer@${AUTO_SCALER_PROJECT_ID}.iam.gserviceaccount.com" "${AUTOSCALER_DIR}/key.json"
    
  9. 프로젝트에 아직 Firestore 인스턴스가 없으면 인스턴스를 하나 만드세요.

     gcloud app create --region="${AUTO_SCALER_APP_ENGINE_LOCATION}"
     gcloud alpha firestore databases create --region="${AUTO_SCALER_APP_ENGINE_LOCATION}"
    

자동 확장 처리 배포

이 섹션에서는 다음 디렉터리의 Terraform 파일을 사용하여 자동 확장 처리를 구성하는 구성요소를 배포합니다.

디렉터리 디렉터리 콘텐츠
terraform/ 각 배포 옵션과 재사용 가능한 모듈이 포함된 최상위 구성
terraform/cloud-functions/distributed/autoscaler-project/ 자동 확장 처리가 있는 프로젝트의 구성. 자동 확장 처리 모듈에 위임합니다.
terraform/modules/autoscaler-functions Poller, Scaler Cloud Run 함수 및 Pub/Sub 주제 구성
  1. Cloud Shell에서 해당 Terraform 환경 변수에 프로젝트 ID, 리전, 영역, App Engine 위치를 설정합니다.

    export TF_VAR_project_id="${AUTO_SCALER_PROJECT_ID}"
    export TF_VAR_region="${AUTO_SCALER_REGION}"
    export TF_VAR_zone="${AUTO_SCALER_ZONE}"
    export TF_VAR_location="${AUTO_SCALER_APP_ENGINE_LOCATION}"
    
  2. 디렉터리를 Terraform scaler-project 디렉터리로 변경하고 초기화합니다.

    cd "${AUTOSCALER_DIR}"
    terraform init
    
  3. 자동 확장 처리 인프라를 만듭니다.

    terraform apply -parallelism=2
    

    리소스를 확인한 후 메시지가 표시되면 yes를 입력합니다.

    Cloud Shell에서 이 명령어를 실행하면 다음과 같은 오류 메시지가 표시될 수 있습니다. "Error: cannot assign requested address"

    이 오류는 Terraform Google 제공업체의 알려진 문제입니다. 오류가 발생하면 다음 명령어를 사용하여 다시 시도하세요.

    terraform apply -parallelism=1
    

애플리케이션 프로젝트 준비

이 섹션에서는 Spanner 인스턴스가 포함된 프로젝트에서 Cloud Scheduler 및 전달자 주제와 함수의 배포를 준비합니다.

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

    Go to project selector

  2. Make sure that billing is enabled for your Google Cloud project.

  3. Enable the Identity and Access Management, Resource Manager, App Engine Admin, Firestore, Spanner, Pub/Sub, Cloud Run functions, and Cloud Build APIs.

    Enable the APIs

  4. Cloud Shell에서 애플리케이션 프로젝트의 ID로 환경 변수를 설정합니다.

    export APP_PROJECT_ID=INSERT_YOUR_APP_PROJECT_ID
    gcloud config set project "${APP_PROJECT_ID}"
    
  5. 애플리케이션 프로젝트에 대해 리전 및 영역App Engine 위치를 설정합니다.

    export APP_REGION=us-central1
    export APP_ZONE=us-central1-c
    export APP_APP_ENGINE_LOCATION=us-central
    
  6. 인프라에서 리소스를 만드는 데 사용할 Terraform의 서비스 계정을 만듭니다.

    gcloud iam service-accounts create terraformer --display-name "Terraform service account"
    
  7. 서비스 계정에 프로젝트 소유자 역할(roles/owner)을 제공합니다.

     gcloud projects add-iam-policy-binding "${APP_PROJECT_ID}" \
        --member "serviceAccount:terraformer@${APP_PROJECT_ID}.iam.gserviceaccount.com" \
        --role roles/owner
    
  8. 서비스 계정 키 파일을 만듭니다.

     gcloud iam service-accounts keys create \
        --iam-account "terraformer@${APP_PROJECT_ID}.iam.gserviceaccount.com"  "${APP_DIR}/key.json"
    
  9. Cloud Scheduler를 사용 설정할 애플리케이션을 만듭니다.

    gcloud app create --region="${APP_APP_ENGINE_LOCATION}"
    

    상태가 자동 확장 처리 프로젝트에 저장되므로 Firestore 데이터베이스를 만들 필요가 없습니다.

애플리케이션 프로젝트 인프라 배포

애플리케이션 프로젝트를 구성하는 Terraform 구성요소는 다음 디렉터리에 있습니다.

이 섹션에서는 Terraform 파일을 사용하여 애플리케이션 프로젝트를 구성하는 구성요소를 배포합니다.

  1. Cloud Shell에서 해당 Terraform 환경 변수에 프로젝트 ID, 리전, 영역, App Engine 위치를 설정합니다.

      export TF_VAR_project_id="${APP_PROJECT_ID}"
      export TF_VAR_region="${APP_REGION}"
      export TF_VAR_zone="${APP_ZONE}"
      export TF_VAR_location="${APP_APP_ENGINE_LOCATION}"
    
  2. 자동 확장 처리 상태가 저장된 프로젝트 ID를 설정합니다.

    export TF_VAR_state_project_id="${AUTO_SCALER_PROJECT_ID}"
    

    자동 확장 처리 상태에는 확장 이벤트가 각 인스턴스에서 트리거될 때 타임스탬프가 포합됩니다.

  3. 자동 확장 처리를 테스트하기 위해 새 Spanner 인스턴스를 만들려면 다음 변수를 설정합니다.

    export TF_VAR_terraform_spanner=true
    

    Terraform이 만드는 Spanner 인스턴스의 이름은 autoscale-test입니다.

    모니터링할 자동 확장 처리를 위한 인스턴스가 이미 있으므로 새 Spanner 인스턴스를 만들지 않으려면 다음 변수의 인스턴스 이름을 설정합니다.

    export TF_VAR_spanner_name=INSERT_YOUR_SPANNER_INSTANCE_NAME
    

    Terraform에서 Spanner 인스턴스를 관리하도록 설정하는 방법에 대한 상세 설명은 Spanner 인스턴스 가져오기를 참조하세요.

  4. 디렉터리를 Terraform app-project 디렉터리로 변경하고 초기화합니다.

    cd "${APP_DIR}"
    terraform init
    
  5. 애플리케이션 프로젝트에 인프라를 만듭니다.

    terraform import module.scheduler.google_app_engine_application.app "${APP_PROJECT_ID}"
    terraform apply -parallelism=2
    

    Terraform이 생성할 리소스 목록이 올바른지 확인한 다음 메시지가 표시되면 yes를 입력합니다.

    Cloud Shell에서 이 명령어를 실행하면 다음과 같은 오류 메시지가 표시될 수 있습니다. "Error: cannot assign requested address"

    이 오류는 Terraform Google 제공업체의 알려진 문제입니다. 오류가 발생하면 다음 명령어를 사용하여 다시 시도하세요.

    terraform apply -parallelism=1
    

전달자 Cloud Run 함수가 Poller 주제에 게시하도록 승인

  1. Cloud Shell에서 자동 확장 처리 Terraform 프로젝트 디렉터리로 다시 전환하여 Terraform 변수가 올바르게 설정되었는지 확인합니다.

    cd "${AUTOSCALER_DIR}"
    
    export TF_VAR_project_id="${AUTO_SCALER_PROJECT_ID}"
    export TF_VAR_region="${AUTO_SCALER_REGION}"
    export TF_VAR_zone="${AUTO_SCALER_ZONE}"
    export TF_VAR_location="${AUTO_SCALER_APP_ENGINE_LOCATION}"
    
  2. 전달자 서비스 계정에 대해 Terraform 변수를 설정합니다. 필요에 따라 서비스 계정을 업데이트하고 추가합니다.

     export TF_VAR_forwarder_sa_emails='["serviceAccount:forwarder-sa@'"${APP_PROJECT_ID}"'.iam.gserviceaccount.com"]'
      terraform apply -parallelism=2
    

    Terraform이 생성할 리소스 목록이 올바른지 확인한 다음 메시지가 표시되면 yes를 입력합니다.

    Cloud Shell에서 이 명령어를 실행하면 다음과 같은 오류 메시지가 표시될 수 있습니다. "Error: cannot assign requested address"

    이 오류는 Terraform Google 제공업체의 알려진 문제입니다. 오류가 발생하면 다음 명령어를 사용하여 다시 시도하세요.

    terraform apply -parallelism=1.
    

배포 확인

자동 확장 처리의 인프라가 준비되면 해당 매개변수를 구성할 수 있습니다. 자세한 내용은 자동 확장 처리 구성을 참조하세요.

이 가이드에서는 분산형 배포를 만들기 때문에 로그에 다음 속성이 포함됩니다.

  • Poller 및 Scaler 함수의 로그는 자동 확장 처리 프로젝트의 로그 탐색기에 표시됩니다.
  • Cloud Scheduler 페이로드의 JSON 구성에서 구문 오류에 대한 로그가 각 애플리케이션 프로젝트에 대한 로그 탐색기에 표시됩니다. 이렇게 하면 특정 Spanner 인스턴스를 관리하는 팀이 해당 구성 문제를 독립적으로 해결할 수 있습니다.

삭제

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

프로젝트 삭제

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

다음 단계