您可以使用 Cloud Scheduler 定期啟動及停止 Cloud SQL 執行個體。舉例來說,您可能只希望執行個體在特定時段執行。
本教學課程將示範如何使用 Google Cloud 產品建構事件導向架構,自動啟動及停止 SQL Server 適用的 Cloud SQL 執行個體。
目標
在本教學課程中,您將建立 Cloud Scheduler 工作,排定在特定時段執行具有 env=dev 資源標籤的 Cloud SQL 執行個體。你只會排定一個活動。不過,本教學課程中說明的架構可用於停止及啟動資源標籤為 env=dev 的多個執行個體。
如要達成這個目標,請完成下列步驟:
- 建立 SQL Server 適用的 Cloud SQL 執行個體,並為其指派特定資源標籤 (
env=dev)。 - 建立兩個 Pub/Sub 主題,做為 Eventarc 觸發條件的事件來源和訊息代理程式。
- 建立並部署兩個事件導向的 Cloud Run 函式,透過 Pub/Sub 主題觸發。觸發後,函式會在專案中搜尋符合 Pub/Sub 訊息酬載 (
env=dev) 中所提供標籤的 Cloud SQL 執行個體。 - 建立並部署兩個 Eventarc 觸發條件。 Pub/Sub 主題事件會以 HTTP 要求的形式傳送至函式,事件訊息內容則會以輸入資料的形式傳遞至函式。
- 建立兩個 Cloud Scheduler Cron 工作,在特定時間將含有目標標籤的訊息發布至 Pub/Sub 主題。排定執行個體在週一至週五的上午 9:00 啟動,下午 5:00 停止。
下圖為事件驅動架構總覽:
費用
在本文件中,您會使用下列 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
如要根據預測用量估算費用,請使用 Pricing Calculator。
完成本文所述工作後,您可以刪除建立的資源,避免繼續計費,詳情請參閱「清除所用資源」。
事前準備
貴機構定義的安全性限制,可能會導致您無法完成下列步驟。如需疑難排解資訊,請參閱「在受限的 Google Cloud 環境中開發應用程式」。
- 登入 Google Cloud 帳戶。如果您是 Google Cloud新手,歡迎 建立帳戶,親自評估產品在實際工作環境中的成效。新客戶還能獲得價值 $300 美元的免費抵免額,可用於執行、測試及部署工作負載。
-
安裝 Google Cloud CLI。
-
若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI。
-
執行下列指令,初始化 gcloud CLI:
gcloud init -
選取或建立專案所需的角色
- 選取專案:選取專案時,不需要具備特定 IAM 角色,只要您在專案中獲派角色,即可選取該專案。
-
建立專案:如要建立專案,您需要「專案建立者」角色 (
roles/resourcemanager.projectCreator),其中包含resourcemanager.projects.create權限。瞭解如何授予角色。
-
建立 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 -
設定驗證方法:
-
確認您具備「建立服務帳戶」身分與存取權管理角色 (
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: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:您建立服務帳戶的專案 IDROLE:要授予的角色
-
確認您具備「建立服務帳戶」身分與存取權管理角色 (
-
安裝 Google Cloud CLI。
-
若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI。
-
執行下列指令,初始化 gcloud CLI:
gcloud init -
選取或建立專案所需的角色
- 選取專案:選取專案時,不需要具備特定 IAM 角色,只要您在專案中獲派角色,即可選取該專案。
-
建立專案:如要建立專案,您需要「專案建立者」角色 (
roles/resourcemanager.projectCreator),其中包含resourcemanager.projects.create權限。瞭解如何授予角色。
-
建立 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 -
設定驗證方法:
-
確認您具備「建立服務帳戶」身分與存取權管理角色 (
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: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:您建立服務帳戶的專案 IDROLE:要授予的角色
-
確認您具備「建立服務帳戶」身分與存取權管理角色 (
建立 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 函式
建立及部署兩個由 Eventarc 透過 Pub/Sub 主題觸發的 Cloud Run (Node.js) 函式。觸發時,函式會在專案中搜尋符合 Pub/Sub 訊息酬載中標籤的 Cloud SQL 執行個體 (env=dev):
- 啟動函式會將執行個體的
activationPolicy更新為ALWAYS,藉此開啟執行個體。 - 停止函式會將
activationPolicy更新為NEVER,藉此關閉執行個體。
詳情請參閱「編寫 Cloud Run 函式」和「Cloud Run 函式觸發條件」。
建立函式
建立事件導向 Cloud Run 函式,自動將符合 CloudEvents 規格的事件解除封送。這項業界標準規格以通用方式描述事件資料。
原始碼必須定義函式進入點,也就是 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 會顯示服務執行的網址。
建立 Eventarc 觸發條件
如要建立 Eventarc 觸發條件,將事件從 Pub/Sub 轉送至 Cloud Functions,請使用 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標籤啟動執行個體,請將訊息發布至 start 主題:gcloud pubsub topics publish start-instance-event --message='{"label":"env=dev"}'
檢查執行個體的啟用政策,確認執行個體已啟動:
gcloud sql instances describe dev-instance --format="value(settings.activationPolicy)"
輸出應如
ALWAYS。
建立 Cloud Scheduler 工作
建立 Cloud Scheduler 工作,定期將訊息發布至 Pub/Sub 主題。
如要建立在週一至週五上午 9:00 執行的工作,並啟動執行個體,請使用
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 Architecture Center。