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

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

目標

  • Cloud Scheduler 用のクライアント サービス アカウントを作成します。このサービス アカウントには、Cloud Functions 関数を呼び出すために必要な認証情報があります。
  • Cloud Functions で使用するクライアント サービス アカウントを作成します。このサービス アカウントは、Filestore エンドポイントを呼び出す認証情報を持つものとして実行されます。
  • ファイル共有のバックアップを作成(または削除)する Cloud Functions の関数を作成します。
  • 定期的な Cloud Functions の関数の作成(または削除)を実行する Cloud Scheduler ジョブを作成します。

料金

このチュートリアルでは、Google Cloud の課金対象となる以下のコンポーネントを使用します。

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

始める前に

  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

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

    [プロジェクトの選択] ページに移動

  3. Cloud プロジェクトに対して課金が有効になっていることを確認します。プロジェクトに対して課金が有効になっていることを確認する方法を学習する

  4. Cloud Scheduler, Cloud Functions, and Filestore API を有効にします。

    API を有効にする

  5. Cloud SDK をインストールして初期化します。
  6. プロジェクトに Filestore インスタンスがない場合は、最初にインスタンスを作成する必要があります。

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

  1. Cloud Scheduler が Cloud Functions 関数の呼び出しに応じて実行するクライアント サービス アカウントを作成します。この例では、アカウントに schedulerunner という名前を付けて、表示名を「Service Account for FS Backups-Schedule」に設定します。

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

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

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

    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 Functions のデフォルトのクライアント サービス アカウント:

    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 FS_ZONE=zone
    export INSTANCE_NAME=instance-id
    export SHARE_NAME=datafile-share-name
    

    ここで

    • zone は、Filestore インスタンスが存在するゾーンです。
    • instance-id は、Filestore インスタンスのインスタンス ID です。
    • file-share-name は、インスタンスから提供される NFS ファイル共有に指定する名前です。
  1. Filestore バックアップの環境変数を設定します。

    export FS_BACKUP_LOCATION=region
    

    ここで、region はバックアップを保存するリージョンです。

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

  1. Cloud Console で、[Cloud Functions] ページに移動します。

    [Cloud Functions] ページに移動

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

    • 関数名: この例では、関数に fsbackup と名前を付けます。
    • トリガー: HTTP
    • 認証: Require authentication を選択します。
    • ソースコード: Inline editor を選択します。
    • ランタイム: Python 3.7 を選択します。
    • エントリ ポイント: create_backup
    • 次の Python コードサンプルを main.py インライン エディタにコピーします。

      バックアップの作成

      このコードサンプルは、作成時間が付加された mybackup- という名前のバックアップを作成します。

      PROJECT_ID = 'project-id'
      SOURCE_INSTANCE_ZONE = 'filestore-zone'
      SOURCE_INSTANCE_NAME = 'filestore-name'
      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/v1beta1/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_ZONE, 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'])
      

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

      • project-id をソース Filestore インスタンスの Google Cloud プロジェクト ID に置き換えます。
      • filestore-zone をソース Filestore インスタンスのゾーンに置き換えます。
      • filestore-name を、ソース Filestore インスタンスの名前に置き換えます。
      • file-share-name を、ファイル共有の名前に置き換えます。
      • backup-region を、バックアップを保存するリージョンに置き換えます。

      バックアップの削除

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

      この関数は、次の項目を除いてバックアップ関数の作成と同じように構成します。

      • 関数名: deletefsbackups
      • エントリ ポイント: 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)
      
      now = time.time()
      retention_seconds = BACKUP_RETENTION_TIME_HRS * 60 * 60
      
      def delete_backup(request):
          list = []
          trigger_run_url = "https://file.googleapis.com/v1beta1/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.")
          else:
              list.extend(data['backups'])
              while 'nextPageToken' in data.keys():
                  nextPageToken = data['nextPageToken']
                  trigger_run_url_next = "https://file.googleapis.com/v1beta1/projects/{}/locations/{}/backups?pageToken={}".format(PROJECT_ID, BACKUP_REGION, nextPageToken)
                  r = authed_session.get(trigger_run_url_next)
                  data = r.json()
                  list.extend(data['backups'])
          for i in 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")))
              if now - backup_time > retention_seconds:
                  print("Deleting " + i['name'] + " in the background.")
                  r = authed_session.delete("https://file.googleapis.com/v1beta1/{}".format(i['name']))
                  data = r.json()
                  print(data)
                  if r.status_code == requests.codes.ok:
                    print(str(r.status_code) + ": Deleting " + i['name'] + " in the background.")
                  else:
                    raise RuntimeError(data['error'])
      

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

      • project-id をバックアップの Google Cloud プロジェクト ID に置き換えます。
      • region をバックアップが存在するリージョンに置き換えます。
      • hours は、バックアップを保持する時間数に置き換えます。たとえば、バックアップを 10 日間保持する場合は「240」と入力します。

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

  1. Cloud Scheduler のクライアント サービス アカウントに roles/cloudscheduler.serviceAgent ロールを付与して、バックアップを作成する関数を呼び出せるようにします。

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

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

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

    現在、fsbackup は Cloud Scheduler のクライアント サービス アカウントでのみ呼び出すことができます。

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

  1. このチュートリアルの例では、15 分ごとにバックアップをスケジュール設定する場合に、次のようなコマンドを使用します。

    gcloud beta scheduler jobs create http fsbackupschedule  --schedule "15 * * * *" --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 ジョブ スケジュールの構成をご覧ください。

  2. 前の手順で作成した Cloud Scheduler ジョブを開始します。この例の場合、以下のコマンドを使用します。

    gcloud scheduler jobs run fsbackupschedule
    

    fsbackupschedule ジョブは、コマンドの実行後すぐに「fsbackups」関数を呼び出し、ジョブが一時停止されるまで 15 分ごとに関数が呼び出されます。

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

  4. バックアップが作成されているかどうかを確認します。

    gcloud beta filestore backups list
    

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

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

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

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

クリーンアップ

バックアップのスケジュールのチュートリアルが終了したら、Google Cloud で作成したリソースをクリーンアップして、今後割り当ての消費や課金が発生しないようにします。次のセクションで、リソースを削除または無効にする方法を説明します。

プロジェクトの削除

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

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

  1. Cloud Console で [リソースの管理] ページに移動します。

    [リソースの管理] に移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

次のステップ