本教學課程說明如何使用 Cloud Scheduler 和 Cloud 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 上啟動資料庫備份作業。下圖說明這個工作流程:
Google Cloud 元件
在本文件中,您會使用 Google Cloud的下列計費元件:
如要根據預測用量估算費用,請使用 Pricing Calculator。
- Cloud Storage: 儲存您匯入 Cloud SQL 的測試資料庫。
- Cloud SQL 執行個體: 內含要備份的資料庫。
- Cloud Scheduler: 按照設定的排程將訊息發布至 Pub/Sub 主題。
- Pub/Sub: 包含從 Cloud Scheduler 傳送的訊息。
- Cloud Run 函式:訂閱 Pub/Sub 主題,並在觸發時對 Cloud SQL 執行個體發出 API 呼叫,以啟動備份。
完成本文所述工作後,您可以刪除已建立的資源,避免繼續計費。詳情請參閱清除所用資源一節。
事前準備
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
在 Google Cloud 控制台中,前往「APIs」頁面,然後啟用下列 API:
- Cloud SQL Admin API
- Cloud Run functions API
- Cloud Scheduler API
- Cloud Build API
- App Engine Admin API
在本教學課程的其餘部分,您將使用 Cloud Shell 執行所有指令。
設定環境
如要開始使用,請先複製包含範例資料的存放區。 接著設定環境,並建立具有本教學課程所需權限的自訂角色。
您可以在 Cloud Shell 中完成本教學課程的所有步驟。
複製包含範例資料的存放區:
git clone https://github.com/GoogleCloudPlatform/training-data-analyst.git
您可以使用
training-data-analyst
存放區中的資料建立資料庫,並加入一些模擬記錄。設定下列環境變數:
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"
建立兩個自訂角色,只具備本教學課程所需的權限:
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 執行個體,並授予其服務帳戶建立備份作業的權限。
建立 PostgreSQL 適用的 Cloud SQL 執行個體:
gcloud sql instances create ${SQL_INSTANCE} --database-version POSTGRES_13 --region ${REGION}
此作業需要幾分鐘才能完成。
確認 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
使用 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,並建立及填入範例資料庫。
前往您複製的存放區:
cd training-data-analyst/CPB100/lab3a/cloudsql
將目錄中的檔案上傳到新值區:
gcloud storage cp * gs://${BUCKET_NAME}
建立範例資料庫;在「Do you want to continue (Y/n)?」提示中,輸入 Y (Yes) 繼續。
gcloud sql import sql ${SQL_INSTANCE} gs://${BUCKET_NAME}/table_creation.sql --project ${PROJECT_ID}
填入資料庫;在「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 角色。
建立供 Cloud Run 函式使用的 IAM 服務帳戶:
gcloud iam service-accounts create ${GCF_NAME} \ --display-name "Service Account for GCF and SQL Admin API"
授予 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 函式。
將下列內容貼到 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
將下列內容貼到 Cloud Shell,即可建立
requirements.txt
檔案:cat <<EOF > requirements.txt google-api-python-client Oauth2client EOF
部署程式碼:
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 執行個體進行部署。
為 Cloud Scheduler 工作建立 App Engine 執行個體:
gcloud app create --region=${REGION}
建立 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 工作。
手動執行 Cloud Scheduler 工作,觸發資料庫的 PostgreSQL 傾印作業。
gcloud scheduler jobs run ${SCHEDULER_JOB}
列出在 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 帳戶收取這個教學課程所用資源的費用,請按照下列步驟操作。如要避免付費,最簡單的方法就是刪除您針對教學課程建立的專案。
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
如果不想刪除整個專案,請刪除您建立的每個資源。如要刪除資源,請前往 Google Cloud 控制台中的適當頁面,選取資源並刪除。
後續步驟
- 瞭解如何使用 Cloud Scheduler 為運算執行個體排程。
- 進一步瞭解 Cloud SQL 備份。
- 探索 Google Cloud的參考架構、圖表和最佳做法。歡迎瀏覽我們的雲端架構中心。