本教學課程將說明如何使用 Cloud Scheduler 和 Cloud 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 上啟動資料庫備份作業。下圖說明這個工作流程:
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.
- 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.
事前準備
-
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 控制台中,前往「API」頁面,並啟用下列 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
授予 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 (是) 即可繼續。
gcloud sql import sql ${SQL_INSTANCE} gs://${BUCKET_NAME}/table_creation.sql --project ${PROJECT_ID}
填入資料庫;當系統顯示「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 角色。
建立 Cloud Run 函式可使用的身分與存取權管理服務帳戶:
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的參考架構、圖表和最佳做法。歡迎瀏覽我們的雲端架構中心。