Cloud SQL 인스턴스 시작 또는 중지 예약

Cloud Scheduler를 사용하여 정기적으로 Cloud SQL 인스턴스를 시작하고 중지할 수 있습니다. 예를 들어 특정 시간에만 인스턴스를 실행할 수 있습니다.

이 튜토리얼에서는 Google Cloud 제품을 사용하여 이벤트 기반 아키텍처를 빌드하여 SQL Server용 Cloud SQL 인스턴스를 자동으로 시작하고 중지하는 방법을 보여줍니다.

목표

이 튜토리얼에서는 특정 시간에 실행되도록 env=dev 리소스 라벨을 사용하여 Cloud SQL 인스턴스를 예약하는 Cloud Scheduler 작업을 만듭니다. 하나의 인스턴스만 예약됩니다. 하지만 이 튜토리얼에 설명된 아키텍처는 리소스 라벨이 env=dev인 여러 인스턴스를 중지 및 시작하는 데 사용할 수 있습니다.

이 목표를 달성하려면 다음 단계를 완료하세요.

  1. SQL Server용 Cloud SQL 인스턴스를 만들고 특정 리소스 라벨(env=dev)을 할당합니다.
  2. Eventarc 트리거의 이벤트 소스 및 메시지 브로커 역할을 하는 Pub/Sub 주제를 두 개 만듭니다.
  3. Pub/Sub 주제를 통해 트리거되는 이벤트 기반 Cloud Run 함수 두 개를 만들고 배포합니다. 트리거되면 함수는 Pub/Sub 메시지 페이로드 (env=dev)에 제공된 라벨과 일치하는 프로젝트의 Cloud SQL 인스턴스를 검색합니다.
  4. Eventarc 트리거 2개를 만들고 배포합니다. Pub/Sub 주제 이벤트는 HTTP 요청으로 함수에 라우팅되며 이벤트 메시지 콘텐츠는 함수에 입력 데이터로 전달됩니다.
  5. 특정 시간에 타겟 라벨이 포함된 메시지를 Pub/Sub 주제에 게시하는 Cloud Scheduler 크론 작업 두 개를 만듭니다. 인스턴스가 월요일부터 금요일까지 오전 9시에 시작하고 오후 5시에 중지되도록 예약합니다.

다음 다이어그램은 이벤트 기반 아키텍처를 간략하게 보여줍니다.

일정에 따라 Cloud SQL 인스턴스 시작 및 중지
일정에 따라 Cloud SQL 인스턴스 시작 및 중지 (다이어그램을 클릭하여 확대)

비용

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

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요.

Google Cloud 신규 사용자는 무료 체험판을 사용할 수 있습니다.

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

시작하기 전에

조직에서 정의한 보안 제약조건으로 인해 다음 단계를 완료하지 못할 수 있습니다. 문제 해결 정보는 제한된 Google Cloud 환경에서 애플리케이션 개발을 참조하세요.

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

  3. 외부 ID 공급업체(IdP)를 사용하는 경우 먼저 제휴 ID로 gcloud CLI에 로그인해야 합니다.

  4. gcloud CLI를 초기화하려면, 다음 명령어를 실행합니다.

    gcloud init
  5. Google Cloud 프로젝트를 만들거나 선택합니다.

    프로젝트를 선택하거나 만드는 데 필요한 역할

    • 프로젝트 선택: 프로젝트를 선택하는 데는 특정 IAM 역할이 필요하지 않습니다. 역할이 부여된 프로젝트를 선택하면 됩니다.
    • 프로젝트 만들기: 프로젝트를 만들려면 resourcemanager.projects.create 권한이 포함된 프로젝트 생성자 역할(roles/resourcemanager.projectCreator)이 필요합니다. 역할 부여 방법 알아보기
    • Google Cloud 프로젝트를 만듭니다.

      gcloud projects create PROJECT_ID

      PROJECT_ID를 만들려는 Google Cloud 프로젝트의 이름으로 바꿉니다.

    • 만든 Google Cloud 프로젝트를 선택합니다.

      gcloud config set project PROJECT_ID

      PROJECT_ID을 Google Cloud 프로젝트 이름으로 바꿉니다.

  6. 이 가이드에 기존 프로젝트를 사용하는 경우 이 가이드를 완료하는 데 필요한 권한이 있는지 확인합니다. 새 프로젝트를 만든 경우에는 이미 필요한 권한이 있습니다.

  7. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  8. Cloud Build, Cloud Functions, Cloud Pub/Sub, Cloud Run Admin, Cloud Scheduler, Cloud SQL Admin, Eventarc API를 사용 설정합니다.

    API 사용 설정에 필요한 역할

    API를 사용 설정하려면 serviceusage.services.enable 권한이 필요합니다. 프로젝트를 만든 경우 소유자 역할 (roles/owner)을 통해 이 권한이 이미 있을 수 있습니다. 그렇지 않으면 서비스 사용량 관리자 역할 (roles/serviceusage.serviceUsageAdmin)을 통해 이 권한을 얻을 수 있습니다. 역할을 부여하는 방법 알아보기

    gcloud services enable cloudbuild.googleapis.com cloudfunctions.googleapis.com pubsub.googleapis.com run.googleapis.com cloudscheduler.googleapis.com sqladmin.googleapis.com eventarc.googleapis.com
  9. 인증을 설정합니다.

    1. 서비스 계정 만들기 IAM 역할(roles/iam.serviceAccountCreator)과 프로젝트 IAM 관리자 역할(roles/resourcemanager.projectIamAdmin)이 있는지 확인합니다. 역할 부여 방법 알아보기
    2. 서비스 계정을 만듭니다.

      gcloud iam service-accounts create SERVICE_ACCOUNT_NAME

      SERVICE_ACCOUNT_NAME을 서비스 계정 이름으로 바꿉니다.

    3. 서비스 계정에 역할을 부여합니다. 다음 IAM 역할마다 roles/cloudbuild.builds.builder, roles/cloudsql.editor, roles/run.invoker 명령어를 1회 실행합니다.

      gcloud projects add-iam-policy-binding PROJECT_ID --member="serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com" --role=ROLE

      다음을 바꿉니다.

      • SERVICE_ACCOUNT_NAME: 서비스 계정의 이름입니다.
      • PROJECT_ID: 서비스 계정을 만든 프로젝트 ID입니다.
      • ROLE: 부여할 역할입니다.
  10. Google Cloud CLI를 설치합니다.

  11. 외부 ID 공급업체(IdP)를 사용하는 경우 먼저 제휴 ID로 gcloud CLI에 로그인해야 합니다.

  12. gcloud CLI를 초기화하려면, 다음 명령어를 실행합니다.

    gcloud init
  13. Google Cloud 프로젝트를 만들거나 선택합니다.

    프로젝트를 선택하거나 만드는 데 필요한 역할

    • 프로젝트 선택: 프로젝트를 선택하는 데는 특정 IAM 역할이 필요하지 않습니다. 역할이 부여된 프로젝트를 선택하면 됩니다.
    • 프로젝트 만들기: 프로젝트를 만들려면 resourcemanager.projects.create 권한이 포함된 프로젝트 생성자 역할(roles/resourcemanager.projectCreator)이 필요합니다. 역할 부여 방법 알아보기
    • Google Cloud 프로젝트를 만듭니다.

      gcloud projects create PROJECT_ID

      PROJECT_ID를 만들려는 Google Cloud 프로젝트의 이름으로 바꿉니다.

    • 만든 Google Cloud 프로젝트를 선택합니다.

      gcloud config set project PROJECT_ID

      PROJECT_ID을 Google Cloud 프로젝트 이름으로 바꿉니다.

  14. 이 가이드에 기존 프로젝트를 사용하는 경우 이 가이드를 완료하는 데 필요한 권한이 있는지 확인합니다. 새 프로젝트를 만든 경우에는 이미 필요한 권한이 있습니다.

  15. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  16. Cloud Build, Cloud Functions, Cloud Pub/Sub, Cloud Run Admin, Cloud Scheduler, Cloud SQL Admin, Eventarc API를 사용 설정합니다.

    API 사용 설정에 필요한 역할

    API를 사용 설정하려면 serviceusage.services.enable 권한이 필요합니다. 프로젝트를 만든 경우 소유자 역할 (roles/owner)을 통해 이 권한이 이미 있을 수 있습니다. 그렇지 않으면 서비스 사용량 관리자 역할 (roles/serviceusage.serviceUsageAdmin)을 통해 이 권한을 얻을 수 있습니다. 역할을 부여하는 방법 알아보기

    gcloud services enable cloudbuild.googleapis.com cloudfunctions.googleapis.com pubsub.googleapis.com run.googleapis.com cloudscheduler.googleapis.com sqladmin.googleapis.com eventarc.googleapis.com
  17. 인증을 설정합니다.

    1. 서비스 계정 만들기 IAM 역할(roles/iam.serviceAccountCreator)과 프로젝트 IAM 관리자 역할(roles/resourcemanager.projectIamAdmin)이 있는지 확인합니다. 역할 부여 방법 알아보기
    2. 서비스 계정을 만듭니다.

      gcloud iam service-accounts create SERVICE_ACCOUNT_NAME

      SERVICE_ACCOUNT_NAME을 서비스 계정 이름으로 바꿉니다.

    3. 서비스 계정에 역할을 부여합니다. 다음 IAM 역할마다 roles/cloudbuild.builds.builder, roles/cloudsql.editor, roles/run.invoker 명령어를 1회 실행합니다.

      gcloud projects add-iam-policy-binding PROJECT_ID --member="serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com" --role=ROLE

      다음을 바꿉니다.

      • SERVICE_ACCOUNT_NAME: 서비스 계정의 이름입니다.
      • PROJECT_ID: 서비스 계정을 만든 프로젝트 ID입니다.
      • ROLE: 부여할 역할입니다.

Cloud SQL 인스턴스 만들기

리소스 라벨 env=dev로 SQL Server용 Cloud SQL 인스턴스를 만들려면 gcloud beta sql instances create 명령어를 사용하세요.

gcloud beta sql instances create dev-instance \
    --database-version=SQLSERVER_2019_EXPRESS \
    --region=us-west1 \
    --tier=db-custom-2-3840 \
    --root-password=YourStrongPassword123! \
    --labels=env=dev

인스턴스를 만드는 데 몇 분 정도 걸릴 수 있습니다. 자세한 내용은 인스턴스 만들기를 참조하세요.

Pub/Sub 주제 만들기

Eventarc 트리거의 이벤트 소스 역할을 하는 두 개의 Pub/Sub 주제를 만들려면 gcloud pubsub topics create 명령어를 사용합니다.

gcloud pubsub topics create start-instance-event
gcloud pubsub topics create stop-instance-event

자세한 내용은 주제 만들기를 참고하세요.

Cloud Run 함수 만들기 및 배포

Pub/Sub 주제를 통해 Eventarc에 의해 트리거되는 두 개의 Cloud Run (Node.js) 함수를 만들고 배포합니다. 트리거되면 함수는 Pub/Sub 메시지 페이로드 (env=dev)에 제공된 라벨과 일치하는 프로젝트의 Cloud SQL 인스턴스를 검색합니다.

  • 시작 함수는 인스턴스의 activationPolicyALWAYS로 업데이트하여 인스턴스를 사용 설정합니다.
  • 중지 함수는 activationPolicyNEVER로 업데이트하여 인스턴스를 종료합니다.

자세한 내용은 Cloud Run 함수 작성Cloud Run 함수 트리거를 참고하세요.

함수 만들기

CloudEvents 사양에 따라 자동으로 이벤트 마셜링을 취소하는 이벤트 기반 Cloud Run 함수를 만듭니다. 이 업계 표준 사양은 일반적인 방식으로 이벤트 데이터를 설명합니다.

소스 코드는 Cloud Run이 함수를 호출할 때 실행되는 코드인 함수 진입점을 정의해야 합니다. 함수를 배포할 때 이 진입점을 지정합니다.

  1. 코드를 다운로드합니다.

    git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git

    또는 zip 파일로 샘플을 다운로드하고 압축을 풀 수 있습니다.

  2. 해당 디렉터리로 이동합니다.

    cd nodejs-docs-samples/functions/scheduleinstance/

이벤트 기반 함수 배포

Cloud Run에 함수를 배포하려면 gcloud run deploy 명령어를 사용합니다.

  1. Cloud SQL 인스턴스를 시작하는 함수를 배포합니다.

    gcloud run deploy startinstance \
        --source . \
        --function startInstanceEvent \
        --base-image nodejs24 \
        --region=us-west1 \
        --build-service-account=projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
  2. 지정된 리전에 저장소를 만들라는 메시지가 표시되면 y를 입력합니다.

  3. Allow unauthenticated invocations 프롬프트에서 n를 입력합니다.

  4. Cloud SQL 인스턴스를 종료하는 함수를 배포합니다.

    gcloud run deploy stopinstance \
        --source . \
        --function stopInstanceEvent \
        --base-image nodejs24 \
        --region=us-west1 \
        --build-service-account=projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
  5. 지정된 리전에 저장소를 만들라는 메시지가 표시되면 y를 입력합니다.

  6. Allow unauthenticated invocations 프롬프트에서 n를 입력합니다.

배포가 완료되면 Google Cloud CLI에 서비스가 실행 중인 URL이 표시됩니다.

Eventarc 트리거 만들기

Pub/Sub에서 이벤트를 라우팅하는 Eventarc 트리거를 만들려면 gcloud eventarc triggers create 명령어를 사용합니다. Pub/Sub 주제에 게시된 모든 메시지는 해당 함수를 트리거하며 메시지 내용은 입력 데이터로 전달됩니다.

  1. Cloud SQL 인스턴스를 시작하는 트리거를 만듭니다.

    gcloud eventarc triggers create start-instance-trigger \
        --location=us-west1 \
        --destination-run-service=startinstance \
        --destination-run-region=us-west1 \
        --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
        --transport-topic=start-instance-event \
        --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
  2. Cloud SQL 인스턴스를 중지하는 트리거를 만듭니다.

    gcloud eventarc triggers create stop-instance-trigger \
        --location=us-west1 \
        --destination-run-service=stopinstance \
        --destination-run-region=us-west1 \
        --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
        --transport-topic=stop-instance-event \
        --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com

새 트리거가 활성화되려면 최대 2분이 걸릴 수 있습니다.

선택사항: 함수가 작동하는지 확인

Pub/Sub 주제에 직접 메시지를 게시하여 함수가 작동하는지 확인할 수 있습니다. Cloud SQL 인스턴스를 업데이트하는 데 몇 분 정도 걸릴 수 있습니다.

  1. env=dev 라벨이 지정된 인스턴스를 중지하려면 gcloud pubsub topics publish 명령어를 사용하여 중지 주제에 메시지를 게시합니다.

    gcloud pubsub topics publish stop-instance-event --message='{"label":"env=dev"}'
  2. 인스턴스가 중지되었는지 확인하려면 gcloud sql instances describe 명령어를 사용하여 활성화 정책을 확인합니다.

    gcloud sql instances describe dev-instance --format="value(settings.activationPolicy)"

    출력은 NEVER이어야 합니다.

  3. env=dev 라벨로 인스턴스를 시작하려면 시작 주제에 메시지를 게시합니다.

    gcloud pubsub topics publish start-instance-event --message='{"label":"env=dev"}'
  4. 활성화 정책을 확인하여 인스턴스가 시작되었는지 확인합니다.

    gcloud sql instances describe dev-instance --format="value(settings.activationPolicy)"

    출력은 ALWAYS이어야 합니다.

Cloud Scheduler 작업 만들기

정기적으로 Pub/Sub 주제에 메시지를 게시하는 Cloud Scheduler 작업을 만듭니다.

  1. 오전 9시에 실행되고 인스턴스를 시작하는 작업을 만들려면 gcloud scheduler jobs create 명령어를 사용합니다.

    gcloud scheduler jobs create pubsub startup-dev-instances \
        --schedule '0 9 * * 1-5' \
        --topic start-instance-event \
        --message-body '{"label":"env=dev"}' \
        --time-zone 'America/Los_Angeles' \
        --location us-east1
  2. 월요일부터 금요일까지 오후 5시에 실행되고 인스턴스를 중지하는 작업을 만듭니다.

    gcloud scheduler jobs create pubsub shutdown-dev-instances \
        --schedule '0 17 * * 1-5' \
        --topic stop-instance-event \
        --message-body '{"label":"env=dev"}' \
        --time-zone 'America/Los_Angeles' \
        --location us-east1

초기 구성 때문에 프로젝트에서 만든 첫 번째 작업을 실행하는 데 몇 분 정도 걸릴 수 있습니다.

선택사항: 작업이 작동하는지 확인

Cloud Scheduler 작업을 수동으로 실행하여 시작 및 중지 함수가 성공적으로 트리거되는지 확인할 수 있습니다. Cloud SQL 인스턴스를 업데이트하는 데 몇 분 정도 걸릴 수 있습니다.

  1. 작업을 실행하고 Cloud SQL 인스턴스를 중지하려면 gcloud scheduler jobs run 명령어를 사용합니다.

    gcloud scheduler jobs run shutdown-dev-instances --location="us-east1"
  2. dev-instance의 활성화 정책이 NEVER인지 확인합니다.

    gcloud sql instances describe dev-instance --format="value(settings.activationPolicy)"
  3. 작업을 실행하여 인스턴스를 시작합니다.

    gcloud scheduler jobs run startup-dev-instances --location="us-east1"
  4. dev-instance의 활성화 정책이 ALWAYS인지 확인합니다.

    gcloud sql instances describe dev-instance --format="value(settings.activationPolicy)"

삭제

이 튜토리얼에서 사용한 리소스에 대한 비용이 청구되지 않도록 하려면 리소스를 삭제하여 정리하세요.

  1. Cloud Scheduler 작업을 삭제합니다.
    gcloud scheduler jobs delete startup-dev-instances --location=us-east1 --quiet
    gcloud scheduler jobs delete shutdown-dev-instances --location=us-east1 --quiet
  2. Eventarc 트리거를 삭제합니다.
    gcloud eventarc triggers delete start-instance-trigger --location=us-west1 --quiet
    gcloud eventarc triggers delete stop-instance-trigger --location=us-west1 --quiet
  3. Cloud Run 서비스를 삭제합니다.
    gcloud run services delete startinstance --region=us-west1 --quiet
    gcloud run services delete stopinstance --region=us-west1 --quiet
  4. Pub/Sub 주제를 삭제합니다.
    gcloud pubsub topics delete start-instance-event
    gcloud pubsub topics delete stop-instance-event
  5. Cloud SQL 인스턴스를 삭제합니다.
    gcloud sql instances delete dev-instance --quiet
  6. 또는 Google Cloud 프로젝트를 삭제하여 비용 청구를 방지할 수 있습니다. Google Cloud 프로젝트를 삭제하면 해당 프로젝트 내에서 사용되는 모든 리소스에 대한 청구가 중단됩니다.

    Google Cloud 프로젝트를 삭제합니다.

    gcloud projects delete PROJECT_ID

다음 단계

  • Google Cloud에 대한 참조 아키텍처, 다이어그램, 권장사항 살펴보기 Cloud 아키텍처 센터 살펴보기