このチュートリアルでは、Cloud Scheduler と Cloud Run 関数を使用して、Cloud SQL データベースの手動バックアップをスケジュールする方法について説明します。
このチュートリアルを完了するには 30 分程度かかります。
まず、テスト データベースを含む git リポジトリのクローンを作成して Cloud Storage バケットに保存し、環境を設定します。
次に、Cloud SQL for PostgreSQL データベース インスタンスを作成し、Cloud Storage バケットからインスタンスにテスト データベースをインポートします。
環境を設定したら、スケジュールされた日時にバックアップ トリガー メッセージを Pub/Sub トピックに投稿する Cloud Scheduler ジョブを作成します。このメッセージには、Cloud SQL のインスタンス名とプロジェクト ID に関する情報が含まれます。このメッセージによって Cloud Run 関数がトリガーされます。この関数は、Cloud SQL Admin API を使用して Cloud SQL でデータベースのバックアップを開始します。次の図に、このワークフローを示します。
Google Cloud コンポーネント
このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
- 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 Console で [API] ページに移動し、次の API を有効にします。
- Cloud SQL Admin API
- Cloud Run 関数の 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"
このチュートリアルで必要な権限のみを持つ 2 つのカスタムロールを作成します。
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 バケットと Cloud SQL for PostgreSQL インスタンスを作成します。次に、テスト データベースを Cloud Storage バケットにアップロードし、そこから Cloud SQL インスタンスにデータベースをインポートします。
Cloud Storage バケットの作成
gcloud CLI を使用して Cloud Storage バケットを作成します。
```sh
gcloud storage buckets create gs://${BUCKET_NAME} --location=${REGION}
```
Cloud SQL インスタンスを作成してサービス アカウントに権限を付与する
Cloud SQL インスタンスを作成して、そのサービス アカウントにバックアップ実行の作成権限を付与します。
Cloud SQL for PostgreSQL のインスタンスを作成します。
sh 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 インスタンスにサンプルデータを入力する
これで、ファイルをバケットにアップロードし、サンプル データベースを作成してデータを入力できるようになりました。
クローンを作成したリポジトリに移動します。
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 を使用してバックアップを開始します。最後に、定期的にスケジューラ メッセージを Pub/Sub トピックに送信する Cloud Scheduler ジョブを作成します。
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 トピックを作成する
次のステップでは、Cloud SQL データベースとやり取りする Cloud Run 関数をトリガーする Pub/Sub トピックを作成します。
```sh
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 ジョブを作成する
最後に、1 時間ごとに定期的にデータ バックアップ関数をトリガーする 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 に関するリファレンス アーキテクチャ、図、ベスト プラクティスを確認する。Cloud アーキテクチャ センターをご覧ください。