排定 Cloud SQL 資料庫備份作業

本教學課程說明如何使用 Cloud SchedulerCloud Run 函式,排定 Cloud SQL 資料庫的手動備份作業。

本教學課程大約需要 30 分鐘才能完成。

首先,您要複製含有測試資料庫的 Git 存放區,並將這些資料庫儲存在 Cloud Storage bucket 中,藉此設定環境。

接著,您會建立 PostgreSQL 適用的 Cloud SQL 資料庫執行個體,並將 Cloud Storage 值區中的測試資料庫匯入該執行個體。

設定環境後,請建立 Cloud Scheduler 工作,在排定的日期和時間,將備份觸發訊息發布至 Pub/Sub 主題。這則訊息包含 Cloud SQL 執行個體名稱和專案 ID 的相關資訊。訊息會觸發 Cloud Run 函式。這個函式會使用 Cloud SQL Admin API,在 Cloud SQL 上啟動資料庫備份作業。下圖說明這個工作流程:

從 Cloud Scheduler 到 Pub/Sub 的工作流程,會觸發啟動備份作業的 Cloud Run 函式。

Google Cloud 元件

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

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

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

  • Cloud Storage: 儲存您匯入 Cloud SQL 的測試資料庫。
  • Cloud SQL 執行個體: 內含要備份的資料庫。
  • Cloud Scheduler: 按照設定的排程將訊息發布至 Pub/Sub 主題。
  • Pub/Sub: 包含從 Cloud Scheduler 傳送的訊息。
  • Cloud Run 函式:訂閱 Pub/Sub 主題,並在觸發時對 Cloud SQL 執行個體發出 API 呼叫,以啟動備份。

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

事前準備

  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. 在 Google Cloud 控制台中,前往「APIs」頁面,然後啟用下列 API:

    • Cloud SQL Admin API
    • Cloud Run functions API
    • Cloud Scheduler API
    • Cloud Build API
    • App Engine Admin API

    前往 API 頁面

在本教學課程的其餘部分,您將使用 Cloud Shell 執行所有指令。

設定環境

如要開始使用,請先複製包含範例資料的存放區。 接著設定環境,並建立具有本教學課程所需權限的自訂角色。

您可以在 Cloud Shell 中完成本教學課程的所有步驟。

  1. 複製包含範例資料的存放區:

    git clone https://github.com/GoogleCloudPlatform/training-data-analyst.git
    

    您可以使用 training-data-analyst 存放區中的資料建立資料庫,並加入一些模擬記錄。

  2. 設定下列環境變數:

    export PROJECT_ID=`gcloud config get-value project`
    export DEMO="sql-backup-tutorial"
    export BUCKET_NAME=${USER}-PostgreSQL-$(date +%s)
    export SQL_INSTANCE="${DEMO}-sql"
    export GCF_NAME="${DEMO}-gcf"
    export PUBSUB_TOPIC="${DEMO}-topic"
    export SCHEDULER_JOB="${DEMO}-job"
    export SQL_ROLE="sqlBackupCreator"
    export STORAGE_ROLE="simpleStorageRole"
    export REGION="us-west2"
    
  3. 建立兩個自訂角色,只具備本教學課程所需的權限:

    gcloud iam roles create ${STORAGE_ROLE} --project ${PROJECT_ID} \
        --title "Simple Storage role" \
        --description "Grant permissions to view and create objects in Cloud Storage" \
        --permissions "storage.objects.create,storage.objects.get"
    
    gcloud iam roles create ${SQL_ROLE} --project ${PROJECT_ID} \
        --title "SQL Backup role" \
        --description "Grant permissions to backup data from a Cloud SQL instance" \
        --permissions "cloudsql.backupRuns.create"
    

    這些角色會遵循最低權限原則,縮減 Cloud Run 函式和 Cloud SQL 服務帳戶的存取範圍。

建立 Cloud SQL 執行個體

在本節中,您會建立 Cloud Storage 值區和 PostgreSQL 適用的 Cloud SQL 執行個體。接著,將測試資料庫上傳至 Cloud Storage 值區,然後從該處將資料庫匯入 Cloud SQL 執行個體。

建立 Cloud Storage 值區

您可以使用 gcloud CLI 建立 Cloud Storage bucket。

gcloud storage buckets create gs://${BUCKET_NAME} --location=${REGION}

建立 Cloud SQL 執行個體,並授予服務帳戶權限

接著,您要建立 Cloud SQL 執行個體,並授予其服務帳戶建立備份作業的權限。

  1. 建立 PostgreSQL 適用的 Cloud SQL 執行個體:

    gcloud sql instances create ${SQL_INSTANCE} --database-version POSTGRES_13 --region ${REGION}
    

    此作業需要幾分鐘才能完成。

  2. 確認 Cloud SQL 執行個體正在執行:

    gcloud sql instances list --filter name=${SQL_INSTANCE}
    

    輸出看起來類似以下內容:

    NAME                     DATABASE_VERSION  LOCATION    TIER              PRIMARY_ADDRESS  PRIVATE_ADDRESS  STATUS
    sql-backup-tutorial      POSTGRES_13       us-west2-b  db-n1-standard-1  x.x.x.x          -                RUNNABLE
    

  3. 使用 Simple Storage 角色,授予 Cloud SQL 服務帳戶將資料匯出至 Cloud Storage 的權限:

    export SQL_SA=(`gcloud sql instances describe ${SQL_INSTANCE} \
        --project ${PROJECT_ID} \
        --format "value(serviceAccountEmailAddress)"`)
    
    gcloud storage buckets add-iam-policy-binding gs://${BUCKET_NAME} \
        --member=serviceAccount:${SQL_SA} \
        --role=projects/${PROJECT_ID}/roles/${STORAGE_ROLE}
    

將範例資料填入 Cloud SQL 執行個體

現在,您可以將檔案上傳至 bucket,並建立及填入範例資料庫。

  1. 前往您複製的存放區:

    cd training-data-analyst/CPB100/lab3a/cloudsql
    
  2. 將目錄中的檔案上傳到新值區:

    gcloud storage cp * gs://${BUCKET_NAME}
    
  3. 建立範例資料庫;在「Do you want to continue (Y/n)?」提示中,輸入 Y (Yes) 繼續。

    gcloud sql import sql ${SQL_INSTANCE} gs://${BUCKET_NAME}/table_creation.sql --project ${PROJECT_ID}
    
  4. 填入資料庫;在「Do you want to continue (Y/n)?」提示中,輸入 Y (Yes) 繼續操作。

    gcloud sql import csv ${SQL_INSTANCE} gs://${BUCKET_NAME}/accommodation.csv \
        --database recommendation_spark \
        --table Accommodation
    
    gcloud sql import csv ${SQL_INSTANCE} gs://${BUCKET_NAME}/rating.csv \
        --database recommendation_spark \
        --table Rating
    

建立主題、函式和排程器工作

在本節中,您將建立自訂 IAM 服務帳戶,並將其繫結至在「設定環境」中建立的自訂 SQL 角色。接著,您會建立 Pub/Sub 主題和訂閱該主題的 Cloud Run 函式,並使用 Cloud SQL Admin API 啟動備份作業。最後,您會建立 Cloud Scheduler 工作,定期將訊息發布至 Pub/Sub 主題。

為 Cloud Run 函式建立服務帳戶

第一步是建立自訂服務帳戶,並將其繫結至您在「設定環境」中建立的自訂 SQL 角色。

  1. 建立供 Cloud Run 函式使用的 IAM 服務帳戶:

    gcloud iam service-accounts create ${GCF_NAME} \
        --display-name "Service Account for GCF and SQL Admin API"
    
  2. 授予 Cloud Run 函式服務帳戶自訂 SQL 角色存取權:

    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
        --member="serviceAccount:${GCF_NAME}@${PROJECT_ID}.iam.gserviceaccount.com" \
        --role="projects/${PROJECT_ID}/roles/${SQL_ROLE}"
    

建立 Pub/Sub 主題

下一個步驟是建立 Pub/Sub 主題,用於觸發與 Cloud SQL 資料庫互動的 Cloud Run 函式。

gcloud pubsub topics create ${PUBSUB_TOPIC}

建立 Cloud Run 函式

接著,您要建立 Cloud Run 函式。

  1. 將下列內容貼到 Cloud Shell,建立 main.py 檔案:

    cat <<EOF > main.py
    
    import base64
    import logging
    import json
    
    from datetime import datetime
    from httplib2 import Http
    
    from googleapiclient import discovery
    from googleapiclient.errors import HttpError
    from oauth2client.client import GoogleCredentials
    
    def main(event, context):
        pubsub_message = json.loads(base64.b64decode(event['data']).decode('utf-8'))
        credentials = GoogleCredentials.get_application_default()
    
        service = discovery.build('sqladmin', 'v1beta4', http=credentials.authorize(Http()), cache_discovery=False)
    
        try:
          request = service.backupRuns().insert(
                project=pubsub_message['project'],
                instance=pubsub_message['instance']
            )
          response = request.execute()
        except HttpError as err:
            logging.error("Could NOT run backup. Reason: {}".format(err))
        else:
          logging.info("Backup task status: {}".format(response))
    EOF
    
  2. 將下列內容貼到 Cloud Shell,即可建立 requirements.txt 檔案:

    cat <<EOF > requirements.txt
    google-api-python-client
    Oauth2client
    EOF
    
  3. 部署程式碼:

    gcloud functions deploy ${GCF_NAME} \
        --trigger-topic ${PUBSUB_TOPIC} \
        --runtime python37 \
        --entry-point main \
        --service-account ${GCF_NAME}@${PROJECT_ID}.iam.gserviceaccount.com
    

建立 Cloud Scheduler 工作

最後,您會建立 Cloud Scheduler 工作,每小時定期觸發資料備份函式。Cloud Scheduler 會使用 App Engine 執行個體進行部署。

  1. 為 Cloud Scheduler 工作建立 App Engine 執行個體:

    gcloud app create --region=${REGION}
    
  2. 建立 Cloud Scheduler 工作:

    gcloud scheduler jobs create pubsub ${SCHEDULER_JOB} \
    --schedule "0 * * * *" \
    --topic ${PUBSUB_TOPIC} \
    --message-body '{"instance":'\"${SQL_INSTANCE}\"',"project":'\"${PROJECT_ID}\"'}' \
    --time-zone 'America/Los_Angeles'
    

測試解決方案

最後一個步驟是測試解決方案。首先,請執行 Cloud Scheduler 工作。

  1. 手動執行 Cloud Scheduler 工作,觸發資料庫的 PostgreSQL 傾印作業。

    gcloud scheduler jobs run ${SCHEDULER_JOB}
    
  2. 列出在 PostgreSQL 執行個體上執行的作業,並確認有 BACKUP_VOLUME 類型的作業:

    gcloud sql operations list --instance ${SQL_INSTANCE} --limit 1
    

    輸出內容會顯示已完成的備份工作。例如:

    NAME                                  TYPE           START                          END                            ERROR  STATUS
    8b031f0b-9d66-47fc-ba21-67dc20193749  BACKUP_VOLUME  2020-02-06T21:55:22.240+00:00  2020-02-06T21:55:32.614+00:00  -      DONE
    

清除所用資源

如要避免系統向您的 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.

如果不想刪除整個專案,請刪除您建立的每個資源。如要刪除資源,請前往 Google Cloud 控制台中的適當頁面,選取資源並刪除。

後續步驟