排定 Cloud SQL 執行個體的啟動或停止時間

您可以使用 Cloud Scheduler 定期啟動及停止 Cloud SQL 執行個體。舉例來說,您可能只希望執行個體在特定時段執行。

本教學課程將示範如何使用 Google Cloud 產品建構事件導向架構,自動啟動及停止 SQL Server 適用的 Cloud SQL 執行個體。

目標

在本教學課程中,您將建立 Cloud Scheduler 工作,排定在特定時段執行具有 env=dev 資源標籤的 Cloud SQL 執行個體。你只會排定一個活動。不過,本教學課程中說明的架構可用於停止及啟動資源標籤為 env=dev 的多個執行個體。

如要達成這個目標,請完成下列步驟:

  1. 建立 SQL Server 適用的 Cloud SQL 執行個體,並為其指派特定資源標籤 (env=dev)。
  2. 建立兩個 Pub/Sub 主題,做為 Eventarc 觸發條件的事件來源和訊息代理程式。
  3. 建立並部署兩個事件導向的 Cloud Run 函式,透過 Pub/Sub 主題觸發。觸發後,函式會在專案中搜尋符合 Pub/Sub 訊息酬載 (env=dev) 中所提供標籤的 Cloud SQL 執行個體。
  4. 建立並部署兩個 Eventarc 觸發條件。 Pub/Sub 主題事件會以 HTTP 要求的形式傳送至函式,事件訊息內容則會以輸入資料的形式傳遞至函式。
  5. 建立兩個 Cloud Scheduler Cron 工作,在特定時間將含有目標標籤的訊息發布至 Pub/Sub 主題。排定執行個體在週一至週五的上午 9:00 啟動,下午 5:00 停止。

下圖為事件驅動架構總覽:

依時間表啟動及停止 Cloud SQL 執行個體
依排程啟動及停止 Cloud SQL 執行個體 (按一下圖表即可放大)。

費用

在本文件中,您會使用下列 Google Cloud的計費元件:

如要根據預測用量估算費用,請使用 Pricing Calculator

初次使用 Google Cloud 的使用者可能符合免費試用期資格。

完成本文所述工作後,您可以刪除建立的資源,避免繼續計費,詳情請參閱「清除所用資源」。

事前準備

貴機構定義的安全性限制,可能會導致您無法完成下列步驟。如需疑難排解資訊,請參閱「在受限的 Google Cloud 環境中開發應用程式」。

  1. 登入 Google Cloud 帳戶。如果您是 Google Cloud新手,歡迎 建立帳戶,親自評估產品在實際工作環境中的成效。新客戶還能獲得價值 $300 美元的免費抵免額,可用於執行、測試及部署工作負載。
  2. 安裝 Google Cloud CLI。

  3. 若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI

  4. 執行下列指令,初始化 gcloud CLI:

    gcloud init
  5. 建立或選取 Google Cloud 專案

    選取或建立專案所需的角色

    • 選取專案:選取專案時,不需要具備特定 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 專案名稱。

  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. 確認您具備「建立服務帳戶」身分與存取權管理角色 (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

      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. 若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI

  12. 執行下列指令,初始化 gcloud CLI:

    gcloud init
  13. 建立或選取 Google Cloud 專案

    選取或建立專案所需的角色

    • 選取專案:選取專案時,不需要具備特定 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 專案名稱。

  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. 確認您具備「建立服務帳戶」身分與存取權管理角色 (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

      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 函式

建立及部署兩個由 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 叫用函式時執行的程式碼。部署函式時,您會指定這個進入點。

  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 會顯示服務執行的網址。

建立 Eventarc 觸發條件

如要建立 Eventarc 觸發條件,將事件從 Pub/Sub 轉送至 Cloud Functions,請使用 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 標籤啟動執行個體,請將訊息發布至 start 主題:

    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 工作

建立 Cloud Scheduler 工作,定期將訊息發布至 Pub/Sub 主題。

  1. 如要建立在週一至週五上午 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
  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

後續步驟