排定 Cloud SQL 資料庫備份作業

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

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

首先,您必須設定環境,方法是複製包含測試資料庫的 Git 存放區,並將這些資料庫儲存在 Cloud Storage 值區中。

接著,您會建立 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 元件

In this document, you use the following billable components of Google Cloud:

To generate a cost estimate based on your projected usage, use the pricing calculator. New Google Cloud users might be eligible for a free trial.

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

When you finish the tasks that are described in this document, you can avoid continued billing by deleting the resources that you created. For more information, see Clean up.

事前準備

  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 控制台中,前往「API」頁面,並啟用下列 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. 授予 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 (是) 即可繼續。

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

    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 函式可使用的身分與存取權管理服務帳戶:

    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 控制台中的適當頁面,選取資源並刪除。

後續步驟