Cloud Scheduler를 사용하여 정기적으로 Cloud SQL 인스턴스를 시작하고 중지할 수 있습니다. 예를 들어 특정 시간에만 인스턴스를 실행할 수 있습니다.
이 튜토리얼에서는 Google Cloud 제품을 사용하여 이벤트 기반 아키텍처를 빌드하여 SQL Server용 Cloud SQL 인스턴스를 자동으로 시작하고 중지하는 방법을 보여줍니다.
목표
이 튜토리얼에서는 특정 시간에 실행되도록 env=dev 리소스 라벨을 사용하여 Cloud SQL 인스턴스를 예약하는 Cloud Scheduler 작업을 만듭니다. 하나의 인스턴스만 예약됩니다. 하지만 이 튜토리얼에 설명된 아키텍처는 리소스 라벨이 env=dev인 여러 인스턴스를 중지 및 시작하는 데 사용할 수 있습니다.
이 목표를 달성하려면 다음 단계를 완료하세요.
- SQL Server용 Cloud SQL 인스턴스를 만들고 특정 리소스 라벨(
env=dev)을 할당합니다. - Eventarc 트리거의 이벤트 소스 및 메시지 브로커 역할을 하는 Pub/Sub 주제를 두 개 만듭니다.
- Pub/Sub 주제를 통해 트리거되는 이벤트 기반 Cloud Run 함수 두 개를 만들고 배포합니다. 트리거되면 함수는 Pub/Sub 메시지 페이로드 (
env=dev)에 제공된 라벨과 일치하는 프로젝트의 Cloud SQL 인스턴스를 검색합니다. - Eventarc 트리거 2개를 만들고 배포합니다. Pub/Sub 주제 이벤트는 HTTP 요청으로 함수에 라우팅되며 이벤트 메시지 콘텐츠는 함수에 입력 데이터로 전달됩니다.
- 특정 시간에 타겟 라벨이 포함된 메시지를 Pub/Sub 주제에 게시하는 Cloud Scheduler 크론 작업 두 개를 만듭니다. 인스턴스가 월요일부터 금요일까지 오전 9시에 시작하고 오후 5시에 중지되도록 예약합니다.
다음 다이어그램은 이벤트 기반 아키텍처를 간략하게 보여줍니다.
비용
이 문서에서는 비용이 청구될 수 있는 Google Cloud구성요소를 사용합니다.
-
Cloud Run functions
Cloud Run functions operate as Cloud Run services and are billed accordingly.
- Cloud Scheduler
- Cloud SQL for SQL Server
-
Eventarc
Cloud Run uses Eventarc for event delivery. Pricing for Eventarc is not included in the Cloud Run pricing.
- Pub/Sub
프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요.
이 문서에 설명된 태스크를 완료했으면 만든 리소스를 삭제하여 청구가 계속되는 것을 방지할 수 있습니다. 자세한 내용은 삭제를 참조하세요.
시작하기 전에
조직에서 정의한 보안 제약조건으로 인해 다음 단계를 완료하지 못할 수 있습니다. 문제 해결 정보는 제한된 Google Cloud 환경에서 애플리케이션 개발을 참조하세요.
- Google Cloud 계정에 로그인합니다. Google Cloud를 처음 사용하는 경우 계정을 만들고 Google 제품의 실제 성능을 평가해 보세요. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
-
Google Cloud CLI를 설치합니다.
-
외부 ID 공급업체(IdP)를 사용하는 경우 먼저 제휴 ID로 gcloud CLI에 로그인해야 합니다.
-
gcloud CLI를 초기화하려면, 다음 명령어를 실행합니다.
gcloud init -
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 프로젝트 이름으로 바꿉니다.
-
이 가이드에 기존 프로젝트를 사용하는 경우 이 가이드를 완료하는 데 필요한 권한이 있는지 확인합니다. 새 프로젝트를 만든 경우에는 이미 필요한 권한이 있습니다.
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 -
인증을 설정합니다.
-
서비스 계정 만들기 IAM 역할(
roles/iam.serviceAccountCreator)과 프로젝트 IAM 관리자 역할(roles/resourcemanager.projectIamAdmin)이 있는지 확인합니다. 역할 부여 방법 알아보기 -
서비스 계정을 만듭니다.
gcloud iam service-accounts create SERVICE_ACCOUNT_NAME
SERVICE_ACCOUNT_NAME을 서비스 계정 이름으로 바꿉니다. -
서비스 계정에 역할을 부여합니다. 다음 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: 부여할 역할입니다.
-
서비스 계정 만들기 IAM 역할(
-
Google Cloud CLI를 설치합니다.
-
외부 ID 공급업체(IdP)를 사용하는 경우 먼저 제휴 ID로 gcloud CLI에 로그인해야 합니다.
-
gcloud CLI를 초기화하려면, 다음 명령어를 실행합니다.
gcloud init -
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 프로젝트 이름으로 바꿉니다.
-
이 가이드에 기존 프로젝트를 사용하는 경우 이 가이드를 완료하는 데 필요한 권한이 있는지 확인합니다. 새 프로젝트를 만든 경우에는 이미 필요한 권한이 있습니다.
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 -
인증을 설정합니다.
-
서비스 계정 만들기 IAM 역할(
roles/iam.serviceAccountCreator)과 프로젝트 IAM 관리자 역할(roles/resourcemanager.projectIamAdmin)이 있는지 확인합니다. 역할 부여 방법 알아보기 -
서비스 계정을 만듭니다.
gcloud iam service-accounts create SERVICE_ACCOUNT_NAME
SERVICE_ACCOUNT_NAME을 서비스 계정 이름으로 바꿉니다. -
서비스 계정에 역할을 부여합니다. 다음 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: 부여할 역할입니다.
-
서비스 계정 만들기 IAM 역할(
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 인스턴스를 검색합니다.
- 시작 함수는 인스턴스의
activationPolicy를ALWAYS로 업데이트하여 인스턴스를 사용 설정합니다. - 중지 함수는
activationPolicy를NEVER로 업데이트하여 인스턴스를 종료합니다.
자세한 내용은 Cloud Run 함수 작성 및 Cloud Run 함수 트리거를 참고하세요.
함수 만들기
CloudEvents 사양에 따라 자동으로 이벤트 마셜링을 취소하는 이벤트 기반 Cloud Run 함수를 만듭니다. 이 업계 표준 사양은 일반적인 방식으로 이벤트 데이터를 설명합니다.
소스 코드는 Cloud Run이 함수를 호출할 때 실행되는 코드인 함수 진입점을 정의해야 합니다. 함수를 배포할 때 이 진입점을 지정합니다.
코드를 다운로드합니다.
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
또는 zip 파일로 샘플을 다운로드하고 압축을 풀 수 있습니다.
해당 디렉터리로 이동합니다.
cd nodejs-docs-samples/functions/scheduleinstance/
이벤트 기반 함수 배포
Cloud Run에 함수를 배포하려면 gcloud run deploy 명령어를 사용합니다.
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
지정된 리전에 저장소를 만들라는 메시지가 표시되면
y를 입력합니다.Allow unauthenticated invocations프롬프트에서n를 입력합니다.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
지정된 리전에 저장소를 만들라는 메시지가 표시되면
y를 입력합니다.Allow unauthenticated invocations프롬프트에서n를 입력합니다.
배포가 완료되면 Google Cloud CLI에 서비스가 실행 중인 URL이 표시됩니다.
Eventarc 트리거 만들기
Pub/Sub에서 이벤트를 라우팅하는 Eventarc 트리거를 만들려면 gcloud eventarc triggers create 명령어를 사용합니다. Pub/Sub 주제에 게시된 모든 메시지는 해당 함수를 트리거하며 메시지 내용은 입력 데이터로 전달됩니다.
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
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 인스턴스를 업데이트하는 데 몇 분 정도 걸릴 수 있습니다.
env=dev라벨이 지정된 인스턴스를 중지하려면gcloud pubsub topics publish명령어를 사용하여 중지 주제에 메시지를 게시합니다.gcloud pubsub topics publish stop-instance-event --message='{"label":"env=dev"}'
인스턴스가 중지되었는지 확인하려면
gcloud sql instances describe명령어를 사용하여 활성화 정책을 확인합니다.gcloud sql instances describe dev-instance --format="value(settings.activationPolicy)"
출력은
NEVER이어야 합니다.env=dev라벨로 인스턴스를 시작하려면 시작 주제에 메시지를 게시합니다.gcloud pubsub topics publish start-instance-event --message='{"label":"env=dev"}'
활성화 정책을 확인하여 인스턴스가 시작되었는지 확인합니다.
gcloud sql instances describe dev-instance --format="value(settings.activationPolicy)"
출력은
ALWAYS이어야 합니다.
Cloud Scheduler 작업 만들기
정기적으로 Pub/Sub 주제에 메시지를 게시하는 Cloud Scheduler 작업을 만듭니다.
오전 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
월요일부터 금요일까지 오후 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 인스턴스를 업데이트하는 데 몇 분 정도 걸릴 수 있습니다.
작업을 실행하고 Cloud SQL 인스턴스를 중지하려면
gcloud scheduler jobs run명령어를 사용합니다.gcloud scheduler jobs run shutdown-dev-instances --location="us-east1"
dev-instance의 활성화 정책이NEVER인지 확인합니다.gcloud sql instances describe dev-instance --format="value(settings.activationPolicy)"
작업을 실행하여 인스턴스를 시작합니다.
gcloud scheduler jobs run startup-dev-instances --location="us-east1"
dev-instance의 활성화 정책이ALWAYS인지 확인합니다.gcloud sql instances describe dev-instance --format="value(settings.activationPolicy)"
삭제
이 튜토리얼에서 사용한 리소스에 대한 비용이 청구되지 않도록 하려면 리소스를 삭제하여 정리하세요.
- Cloud Scheduler 작업을 삭제합니다.
gcloud scheduler jobs delete startup-dev-instances --location=us-east1 --quiet gcloud scheduler jobs delete shutdown-dev-instances --location=us-east1 --quiet
- Eventarc 트리거를 삭제합니다.
gcloud eventarc triggers delete start-instance-trigger --location=us-west1 --quiet gcloud eventarc triggers delete stop-instance-trigger --location=us-west1 --quiet
- Cloud Run 서비스를 삭제합니다.
gcloud run services delete startinstance --region=us-west1 --quiet gcloud run services delete stopinstance --region=us-west1 --quiet
- Pub/Sub 주제를 삭제합니다.
gcloud pubsub topics delete start-instance-event gcloud pubsub topics delete stop-instance-event
- Cloud SQL 인스턴스를 삭제합니다.
gcloud sql instances delete dev-instance --quiet
- 또는 Google Cloud 프로젝트를 삭제하여 비용 청구를 방지할 수 있습니다. Google Cloud 프로젝트를 삭제하면 해당 프로젝트 내에서 사용되는 모든 리소스에 대한 청구가 중단됩니다.
Google Cloud 프로젝트를 삭제합니다.
gcloud projects delete PROJECT_ID
다음 단계
- Google Cloud에 대한 참조 아키텍처, 다이어그램, 권장사항 살펴보기 Cloud 아키텍처 센터 살펴보기