バックアップのスケジュール設定


このチュートリアルでは、Cloud Scheduler と Cloud Run 関数を使用して Filestore インスタンスのバックアップをスケジュールする方法について説明します。

目標

  • Cloud Run functions の関数を呼び出すために必要な認証情報を含む Cloud Scheduler のクライアント サービス アカウントを作成する。
  • Filestore エンドポイントを呼び出すための認証情報を持つ Cloud Run 関数のクライアント サービス アカウントを作成します。
  • Filestore インスタンスのバックアップを作成する Cloud Run functions の関数を作成します。
  • Filestore インスタンスのバックアップを削除する Cloud Run functions の関数を作成します。
  • いずれかの関数を定期的に実行する Cloud Scheduler ジョブを作成します。

料金

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

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

始める前に

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Artifact Registry, Cloud Build, Filestore, Cloud Run functions, Cloud Logging, Pub/Sub, Cloud Run, and Cloud Scheduler APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  8. Make sure that billing is enabled for your Google Cloud project.

  9. Enable the Artifact Registry, Cloud Build, Filestore, Cloud Run functions, Cloud Logging, Pub/Sub, Cloud Run, and Cloud Scheduler APIs.

    Enable the APIs

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    gcloud init
  12. プロジェクトに Filestore インスタンスがない場合は、最初に 1 つを作成する必要があります。

Cloud Scheduler 関数と Cloud Run 関数のクライアント サービス アカウントを作成する

  1. まだ行っていない場合は、Google Cloud コンソールで [Cloud Shell をアクティブにする] をクリックします。

  2. Cloud Scheduler が Cloud Run functions 関数の呼び出しに応じて実行するクライアント サービス アカウントを作成します。この例では、iam service-accounts create コマンドを使用してアカウント schedulerunner に名前を付け、表示名を「Service Account for FS Backups-Schedule」に設定します。

    gcloud iam service-accounts create schedulerunner \
        --display-name="Service Account for FS Backups-Scheduler"
    
  3. Cloud Run 関数が Filestore エンドポイントを呼び出すために実行するクライアント サービス アカウントを作成します。この例では、アカウントに backupagent という名前を付けて、表示名を「Service Account for FS Backups-GCF」に設定します。

    gcloud iam service-accounts create backupagent \
        --display-name="Service Account for FS Backups-GCF"
    

    サービス アカウントが作成されたかどうかを確認するには、iam service-accounts list コマンドを実行します。

    gcloud iam service-accounts list
    

    コマンドは次のような結果を返します。

    NAME                                         EMAIL                                                   DISABLED
    Service Account for FS Backups-GCF           backupagent@$PROJECT_ID.iam.gserviceaccount.com         False
    Service Account for FS Backups-Scheduler     schedulerunner@$PROJECT_ID.iam.gserviceaccount.com      False
    

環境変数を設定する

ローカル環境に、次の環境変数を設定します。

  • Google Cloud プロジェクト ID とプロジェクト:

    export PROJECT_ID=`gcloud config get-value core/project`
    export PROJECT_NUMBER=`gcloud projects describe $PROJECT_ID --format="value(projectNumber)"`
    
  • Cloud Scheduler サービス エージェント、および Cloud Scheduler と Cloud Run 関数のクライアント サービス アカウント:

    export SCHEDULER_SA=service-$PROJECT_NUMBER@gcp-sa-cloudscheduler.iam.gserviceaccount.com
    export SCHEDULER_CLIENT_SA=schedulerunner@$PROJECT_ID.iam.gserviceaccount.com
    export GCF_CLIENT_SA=backupagent@$PROJECT_ID.iam.gserviceaccount.com
    
  • Filestore インスタンス:

    export SOURCE_INSTANCE_LOCATION=fs-location
    export SOURCE_INSTANCE_NAME=instance-id
    export SHARE_NAME=file-share-name
    

    次のように置き換えます。

    • fs-location は、ソース Filestore インスタンスが存在するゾーンまたはリージョンに置き換えます。
    • instance-id は、ソース Filestore インスタンスのインスタンス ID に置き換えます。
    • file-share-name は、インスタンスから提供される NFS ファイル共有に指定する名前。
  • Filestore バックアップの環境変数を設定します。

    export BACKUP_REGION=backup-region
    

    backup-region は、バックアップを保存するリージョンに置き換えます。

バックアップを作成する関数を作成する

  1. Google Cloud コンソールで、[Cloud Run 関数] ページに移動します。

    [Cloud Run 関数] ページに移動します

  2. [関数を作成] をクリックして、次のように関数を構成します。

    • 基本:
      • 環境: この例では、デフォルトの 2nd gen を選択します。
      • 関数名: この例では、関数に fsbackup と名前を付けます。
      • リージョン: この例では、us-central1 を選択します。
    • トリガー:
      • トリガーのタイプ: メニューから HTTPS を選択します。
      • Authentication: Require authentication を選択します。
    • ランタイム、ビルド、接続、セキュリティの設定:
      • [ランタイム] > [ランタイム サービス アカウント] > [サービス アカウント]: メニューから Service Account for FS Backups-GCFbackupagent@$PROJECT_ID.iam.gserviceaccount.com)を選択します。
      • [接続] > [上り(内向き)の設定]: Allow all traffic を選択します。
  3. [次へ] をクリックして、次のように構成を続行します。

    • ランタイム: メニューから Python 3.8 または Cloud Run functions で完全にサポートされているそれ以降のバージョンを選択します。
    • ソースコード: Inline editor
    • エントリ ポイント: 「create_backup」と入力します。
    • 次の依存関係を requirements.txt ファイルに追加します。

      google-auth==2.29.0
      requests==2.31.0
      

      ユースケースによっては、他の依存関係、および対応するバージョン番号を指定しなければならない場合があります。詳細については、プリインストール パッケージをご覧ください。

    • インライン エディタを使用して、次の Python コードサンプルを main.py ファイルにコピーします。

      バックアップを作成

      1. このコードサンプルは、作成時間が付加された mybackup- という名前のバックアップを作成します。
      PROJECT_ID = 'project-id'
      SOURCE_INSTANCE_LOCATION = 'fs-location'
      SOURCE_INSTANCE_NAME = 'instance-id'
      SOURCE_FILE_SHARE_NAME = 'file-share-name'
      BACKUP_REGION = 'backup-region'
      
      import google.auth
      import google.auth.transport.requests
      from google.auth.transport.requests import AuthorizedSession
      import time
      import requests
      import json
      
      credentials, project = google.auth.default()
      request = google.auth.transport.requests.Request()
      credentials.refresh(request)
      authed_session = AuthorizedSession(credentials)
      
      def get_backup_id():
          return "mybackup-" + time.strftime("%Y%m%d-%H%M%S")
      
      def create_backup(request):
          trigger_run_url = "https://file.googleapis.com/v1/projects/{}/locations/{}/backups?backupId={}".format(PROJECT_ID, BACKUP_REGION, get_backup_id())
          headers = {
            'Content-Type': 'application/json'
          }
          post_data = {
            "description": "my new backup",
            "source_instance": "projects/{}/locations/{}/instances/{}".format(PROJECT_ID, SOURCE_INSTANCE_LOCATION, SOURCE_INSTANCE_NAME),
            "source_file_share": "{}".format(SOURCE_FILE_SHARE_NAME)
          }
          print("Making a request to " + trigger_run_url)
          r = authed_session.post(url=trigger_run_url, headers=headers, data=json.dumps(post_data))
          data = r.json()
          print(data)
          if r.status_code == requests.codes.ok:
            print(str(r.status_code) + ": The backup is uploading in the background.")
          else:
            raise RuntimeError(data['error'])
          return "Backup creation has begun!"
      

      次のように置き換えます。

      • project-id は、ソース Filestore インスタンスの Google Cloud プロジェクト ID に置き換えます。
      • fs-location は、ソース Filestore インスタンスのゾーンまたはリージョンに置き換えます。
      • instance-id は、ソース Filestore インスタンスの名前に置き換えます。
      • file-share-name を、ファイル共有の名前に置き換えます。
      • backup-region を、バックアップを保存するリージョンに置き換えます。
      1. [関数をテスト] をクリックします。

        Cloud Shell で新しいタブ セッションが開きます。成功すると、次のメッセージが返されます。

        Function is ready to test.
        
      2. [デプロイ] をクリックして、デプロイが完了するまで待ちます。

      3. 前の Cloud Shell タブに戻ります。

      バックアップを削除する

      このサンプルコードは、事前定義された期間よりも古いバックアップを削除します。

      一度に削除できるバックアップは、ソース インスタンスごとに 1 つのみです。詳細については、バックアップをご覧ください。

      この関数は、バックアップの作成に使用した関数と同じ方法で構成します。ただし、次の変更を行います。

      • 関数名: deletefsbackup
      • エントリ ポイント: delete_backup
      PROJECT_ID = 'project-id'
      BACKUP_REGION = 'region'
      BACKUP_RETENTION_TIME_HRS = hours
      
      import google.auth
      import google.auth.transport.requests
      from google.auth.transport.requests import AuthorizedSession
      import time
      import requests
      import json
      
      credentials, project = google.auth.default()
      request = google.auth.transport.requests.Request()
      credentials.refresh(request)
      authed_session = AuthorizedSession(credentials)
      
      retention_seconds = BACKUP_RETENTION_TIME_HRS * 60 * 60
      
      def delete_backup(request):
          now = time.time()
          backup_list = []
          trigger_run_url = "https://file.googleapis.com/v1/projects/{}/locations/{}/backups".format(PROJECT_ID, BACKUP_REGION)
          r = authed_session.get(trigger_run_url)
          data = r.json()
          if not data:
              print("No backups to delete.")
              return "No backups to delete."
          else:
              backup_list.extend(data['backups'])
              while "nextPageToken" in data.keys():
                  nextPageToken = data['nextPageToken']
                  trigger_run_url_next = "https://file.googleapis.com/v1/projects/{}/locations/{}/backups?pageToken={}".format(PROJECT_ID, BACKUP_REGION, nextPageToken)
                  r = authed_session.get(trigger_run_url_next)
                  data = r.json()
                  backup_list.extend(data['backups'])
          for i in backup_list:
              backup_time = i['createTime']
              backup_time = backup_time[:-4]
              backup_time = float(time.mktime(time.strptime(backup_time, "%Y-%m-%dT%H:%M:%S.%f")))
              i['backup_timestamp'] = backup_time
          sorted_backup_list = sorted(backup_list, key=lambda d: d['backup_timestamp'])
          oldest_backup = sorted_backup_list[0]
          if now - oldest_backup['backup_timestamp'] > retention_seconds:
              print(oldest_backup['name'] + " is older than the indicated retention time.")
              r = authed_session.delete("https://file.googleapis.com/v1/{}".format(oldest_backup['name']))
              data = r.json()
              print(data)
              if r.status_code == requests.codes.ok:
                  print(str(r.status_code) + ": Deleting " + oldest_backup['name'] + " in the background.")
              else:
                  raise RuntimeError(data['error'])
              return "Backup deletion has begun!"
          return "All backups are within the indicated retention period."
      

      次のように置き換えます。

      • project-id は、バックアップの Google Cloud プロジェクト ID に置き換えます。
      • region は、バックアップが存在するリージョンに置き換えます。バックアップ、スケジューラ ジョブ、関数はすべて同じロケーションに存在する必要があります。
      • hours をバックアップを保持する時間に置き換えます。たとえば、バックアップを 10 日間保持する場合は「240」を入力します。

クライアント サービス アカウントに IAM のロールを割り当てる

  1. Cloud Scheduler サービス エージェントを、roles/cloudscheduler.serviceAgent のロールを持つ Cloud Scheduler クライアント サービス アカウントの IAM ポリシーに追加します。これにより、サービス エージェントは、バックアップを作成する関数を呼び出すために、クライアント サービス アカウントの権限を借用できます。iam service-accounts add-iam-policy-binding コマンドを実行する

    gcloud iam service-accounts add-iam-policy-binding $SCHEDULER_CLIENT_SA \
        --member=serviceAccount:$SCHEDULER_SA \
        --role=roles/cloudscheduler.serviceAgent
    
  2. Cloud Run 関数のクライアント サービス アカウントに roles/file.editor ロールを付与して、Filestore エンドポイントを呼び出せるようにします。projects add-iam-policy-binding コマンドを実行する

    gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member=serviceAccount:$GCF_CLIENT_SA \
        --role=roles/file.editor
    
  3. Cloud Scheduler のクライアント サービス アカウントに、使用する関数の roles/cloudfunctions.invoker ロールを付与します。次の functions add-iam-policy-binding コマンドを実行します。

    バックアップを作成

    gcloud functions add-iam-policy-binding fsbackup \
        --member serviceAccount:$SCHEDULER_CLIENT_SA \
        --role roles/cloudfunctions.invoker
    

    基盤となる Cloud Run サービスにロール roles/run.invoker を付与する必要があること、および gcloud functions add-invoker-policy-binding コマンドを実行してロールを適用できることを示すプロンプトが表示されます。回答を求められたら、「Y」と入力します。

    これで、Cloud Scheduler のクライアント サービス アカウントだけが fsbackup を呼び出せるようになりました。

    バックアップを削除する

    gcloud functions add-iam-policy-binding deletefsbackup \
        --member serviceAccount:$SCHEDULER_CLIENT_SA \
        --role roles/cloudfunctions.invoker
    

    基盤となる Cloud Run サービスにロール roles/run.invoker を付与する必要があること、および gcloud functions add-invoker-policy-binding コマンドを実行してロールを適用できることを示すプロンプトが表示されます。回答を求められたら、「Y」と入力します。

    これで、Cloud Scheduler のクライアント サービス アカウントだけが deletefsbackup を呼び出せるようになりました。

指定されたスケジュールで関数をトリガーする Cloud Scheduler ジョブを作成する

バックアップを作成

  1. このチュートリアルの例では、毎週午後 10 時にバックアップをスケジュールを設定する場合に、scheduler jobs create http のようなコマンドを使用します。

    gcloud scheduler jobs create http fsbackupschedule \
        --schedule "0 22 * * 1-5" \
        --http-method=GET \
        --uri=https://us-central1-$PROJECT_ID.cloudfunctions.net/fsbackup \
        --oidc-service-account-email=$SCHEDULER_CLIENT_SA    \
        --oidc-token-audience=https://us-central1-$PROJECT_ID.cloudfunctions.net/fsbackup
    

    --schedule フラグでは、unix-cron 形式を使用して、ジョブの実行頻度を指定します。詳細については、cron ジョブ スケジュールの構成をご覧ください。

    1 時間あたりインスタンスごとに最大 6 つのバックアップを作成できます。

  2. 前の手順で作成した Cloud Scheduler ジョブを開始します。この例では、scheduler jobs runs コマンドを使用してすぐに実行します。

    gcloud scheduler jobs run fsbackupschedule
    

    fsbackupschedule ジョブは、コマンドの実行後すぐに fsbackup 関数を呼び出し、ジョブが一時停止されるまで毎週午後 10 時に関数が呼び出されます。

  3. 関数が適切に実行され、status 200 を返しているかどうかを確認するには、fsbackup 関数のログを調べます。

    Google Cloud コンソールでログを表示するには、ログ エクスプローラを使用します。

    1. Google Cloud コンソールで、[ログ エクスプローラ] ページに移動します。

      [ログ エクスプローラ] に移動

      検索バーを使用してこのページを検索する場合は、小見出しが「Logging」の結果を選択します。

      最新のログが [クエリ結果] ペインに表示されます。

  4. backups list コマンドを使用して、既存のバックアップのステータスを確認します。

    gcloud filestore backups list
    

    このコマンドは次のような出力を返します。

    NAME                      LOCATION     SRC_INSTANCE                        SRC_FILE_SHARE  STATE
    mybackup-20201123-184500  us-central1  us-central1-c/instances/nfs-server  vol1            READY
    

バックアップを削除する

  1. このチュートリアルの例では、毎週午後 10 時にバックアップを削除するオペレーションをスケジュール設定する場合に、scheduler jobs create http のようなコマンドを使用します。

    gcloud scheduler jobs create http deletefsbackupschedule \
        --schedule "0 22 * * 1-5" \
        --http-method=GET \
        --uri=https://us-central1-$PROJECT_ID.cloudfunctions.net/deletefsbackup \
        --oidc-service-account-email=$SCHEDULER_CLIENT_SA    \
        --oidc-token-audience=https://us-central1-$PROJECT_ID.cloudfunctions.net/deletefsbackup
    

    --schedule フラグでは、unix-cron 形式を使用して、ジョブの実行頻度を指定します。詳細については、cron ジョブ スケジュールの構成をご覧ください。

    同じソース インスタンスに関連付けられるバックアップ delete オペレーションは、一度に 1 つずつ実行する必要があります。詳細については、バックアップをご覧ください。

  2. 前の手順で作成した Cloud Scheduler ジョブを開始します。この例では、scheduler jobs runs コマンドを使用してすぐに実行します。

    gcloud scheduler jobs run deletefsbackupschedule
    

    deletefsbackupschedule ジョブは、コマンドの実行後すぐに deletefsbackup 関数を呼び出し、ジョブが一時停止されるまで毎週午後 10 時に関数が呼び出されます。

  3. 関数が適切に実行され、status 200 を返しているかどうかを確認するには、deletefsbackup 関数のログを調べます。

    Google Cloud コンソールでログを表示するには、ログ エクスプローラを使用します。

    1. Google Cloud コンソールで、[ログ エクスプローラ] ページに移動します。

      [ログ エクスプローラ] に移動

      検索バーを使用してこのページを検索する場合は、小見出しが「Logging」の結果を選択します。

      最新のログが [クエリ結果] ペインに表示されます。

  4. backups list コマンドを使用して、既存のバックアップのステータスを確認します。

    gcloud filestore backups list
    

    このコマンドは次のような出力を返します。

    NAME                      LOCATION     SRC_INSTANCE                        SRC_FILE_SHARE  STATE
    mybackup-20201123-184500  us-central1  us-central1-c/instances/nfs-server  vol1            READY
    

バックアップの割り当て不足のアラート

バックアップのスケジュールを実装すると、バックアップの割り当てが不足するおそれがあります。その場合、バックアップの割り当て不足のアラートを設定することをおすすめします。そうすれば、バックアップの割り当てが不足している際に通知を受け取ることができます。

クリーンアップ

チュートリアルが終了したら、作成したリソースをクリーンアップして、割り当ての使用を停止し、課金されないようにできます。次のセクションで、リソースを削除または無効にする方法を説明します。

プロジェクトの削除

課金をなくす最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。

プロジェクトを削除するには:

  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.

次のステップ