Cloud SQL データベースのバックアップをスケジュールする

Cloud SQL データベースのバックアップをスケジュールする

このチュートリアルでは、Cloud SchedulerCloud Functions を使用して、Cloud SQL データベースの手動バックアップをスケジュールする方法について説明します。

このチュートリアルを完了するには 30 分程度かかります。

まず、テスト データベースを含む git リポジトリのクローンを作成して Cloud Storage バケットに保存し、環境を設定します。

次に、Cloud SQL for MySQL データベース インスタンスを作成し、Cloud Storage バケットからインスタンスにテスト データベースをインポートします。

環境を設定したら、スケジュールされた日時にバックアップ トリガー メッセージを Pub/Sub トピックに投稿する Cloud Scheduler ジョブを作成します。このメッセージには、Cloud SQL のインスタンス名とプロジェクト ID に関する情報が含まれます。このメッセージによって Cloud Functions の関数がトリガーされます。この関数は、Cloud SQL Admin API を使用して Cloud SQL でデータベースのバックアップを開始します。次の図に、このワークフローを示します。

Cloud Scheduler から Pub/Sub へのワークフロー。バックアップを開始する Cloud Function の関数がトリガーされます。

Google Cloud コンポーネント

このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。 新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

  • Cloud Storage: Cloud SQL にインポートするテスト データベースを格納します。
  • Cloud SQL インスタンス: バックアップするデータベースが含まれます。
  • Cloud Scheduler: 設定されたスケジュールで Pub/Sub トピックにメッセージを投稿します。
  • Pub/Sub: Cloud Scheduler から送信されたメッセージが含まれます。
  • Cloud Functions: Pub/Sub トピックに登録します。トリガーされると、Cloud SQL インスタンスに対して API 呼び出しを行い、バックアップを開始します。

このドキュメントに記載されているタスクの完了後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。

始める前に

  1. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  2. Google Cloud プロジェクトで課金が有効になっていることを確認します

  3. Google Cloud Console で [API] ページに移動し、次の API を有効にします。

    • Cloud SQL Admin API
    • Cloud 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}-MySQL-$(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. このチュートリアルで必要な権限のみを持つ 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 Functions と Cloud SQL サービス アカウントのアクセス範囲を制限します。

Cloud SQL インスタンスを作成する

このセクションでは、Cloud Storage バケットと Cloud SQL for MySQL インスタンスを作成します。次に、テスト データベースを Cloud Storage バケットにアップロードし、そこから Cloud SQL インスタンスにデータベースをインポートします。

Cloud Storage バケットを作成する

gsutil コマンドライン ツールを使用して Cloud Storage バケットを作成します。

```sh
gsutil mb -l ${REGION} gs://${BUCKET_NAME}
```

Cloud SQL インスタンスを作成してサービス アカウントに権限を付与する

Cloud SQL インスタンスを作成して、そのサービス アカウントにバックアップ実行の作成権限を付与します。

  1. Cloud SQL for MySQL インスタンスを作成する

    sh gcloud sql instances create ${SQL_INSTANCE} --database-version MYSQL_5_7 --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      MYSQL_5_7         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)"`)
    
    gsutil iam ch serviceAccount:${SQL_SA}:projects/${PROJECT_ID}/roles/${STORAGE_ROLE} gs://${BUCKET_NAME}
    

Cloud SQL インスタンスにサンプルデータを入力する

これで、ファイルをバケットにアップロードし、サンプル データベースを作成してデータを入力できるようになりました。

  1. クローンを作成したリポジトリに移動します。

    cd training-data-analyst/CPB100/lab3a/cloudsql
    
  2. ディレクトリ内のファイルを新しいバケットにアップロードします。

    gsutil 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 Functions の関数を作成し、Cloud SQL Admin API を使用してバックアップを開始します。最後に、定期的にスケジューラ メッセージを Pub/Sub トピックに送信する Cloud Scheduler ジョブを作成します。

Cloud Function のサービス アカウントを作成する

まず、カスタム サービス アカウントを作成して、環境の設定で作成したカスタム SQL ロールにバインドします。

  1. Cloud Function で使用する IAM サービス アカウントを作成します。

    gcloud iam service-accounts create ${GCF_NAME} \
        --display-name "Service Account for GCF and SQL Admin API"
    
  2. Cloud Function サービス アカウントにカスタム 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 Functions の関数をトリガーする Pub/Sub トピックを作成します。

```sh
gcloud pubsub topics create ${PUBSUB_TOPIC}
```

Cloud Functions の関数を作成する

次に、Cloud Function を作成します。

  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 ジョブを作成する

最後に、1 時間ごとに定期的にデータ バックアップ関数をトリガーする 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 ジョブを手動で実行して、データベースの MySQL ダンプをトリガーします。

    gcloud scheduler jobs run ${SCHEDULER_JOB}
    
  2. MySQL インスタンスで実行されたオペレーションを一覧表示し、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 コンソールで適切なページに移動し、リソースを選択して削除します。

次のステップ