このチュートリアルでは、Cloud Scheduler と Cloud Functions を使用して、基本 HDD 階層と基本 SSD 階層の Filestore インスタンスのバックアップをスケジュールする方法について説明します。
目標
- Cloud Scheduler 用のクライアント サービス アカウントを作成します。このサービス アカウントには、Cloud Functions 関数を呼び出すために必要な認証情報があります。
- Cloud Functions で使用するクライアント サービス アカウントを作成します。このサービス アカウントは、Filestore エンドポイントを呼び出す認証情報を持つものとして実行されます。
- ファイル共有のバックアップを作成(または削除)する Cloud Functions の関数を作成します。
- 定期的な Cloud Functions の関数の作成(または削除)を実行する Cloud Scheduler ジョブを作成します。
料金
このチュートリアルでは、Google Cloud の課金対象となる以下のコンポーネントを使用します。
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを出すことができます。新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。
始める前に
- Google アカウントにログインします。
Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。
-
Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。
-
Cloud プロジェクトに対して課金が有効になっていることを確認します。プロジェクトに対して課金が有効になっていることを確認する方法を学習する。
- Cloud Scheduler, Cloud Functions, and Filestore API を有効にします。
- Cloud SDK をインストールして初期化します。
- プロジェクトに Filestore インスタンスがない場合は、最初にインスタンスを作成する必要があります。
Cloud Scheduler と Cloud Functions 用のクライアント サービス アカウントを作成する
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"
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 ファイル共有に指定する名前です。
Filestore バックアップの環境変数を設定します。
export FS_BACKUP_LOCATION=region
ここで、region はバックアップを保存するリージョンです。
バックアップを作成する関数を作成する
Cloud Console で、[Cloud Functions] ページに移動します。
[関数を作成] をクリックして、次のように関数を構成します。
- 関数名: この例では、関数に
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 のロールを割り当てる
Cloud Scheduler のクライアント サービス アカウントに
roles/cloudscheduler.serviceAgent
ロールを付与して、バックアップを作成する関数を呼び出せるようにします。gcloud iam service-accounts add-iam-policy-binding $SCHEDULER_CLIENT_SA \ --member=serviceAccount:$SCHEDULER_SA \ --role=roles/cloudscheduler.serviceAgent
Cloud Functions のクライアント サービス アカウントに
roles/file.editor
ロールを付与して、Filestore エンドポイントを呼び出せるようにします。gcloud projects add-iam-policy-binding $PROJECT_ID \ --member=serviceAccount:$GCF_CLIENT_SA \ --role=roles/file.editor
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 ジョブを作成する
このチュートリアルの例では、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 ジョブ スケジュールの構成をご覧ください。前の手順で作成した Cloud Scheduler ジョブを開始します。この例の場合、以下のコマンドを使用します。
gcloud scheduler jobs run fsbackupschedule
fsbackupschedule
ジョブは、コマンドの実行後すぐに「fsbackups」関数を呼び出し、ジョブが一時停止されるまで 15 分ごとに関数が呼び出されます。関数が適切に実行され、
status 200
を返しているかどうかを確認するには、fsbackups
関数のログを調べます。バックアップが作成されているかどうかを確認します。
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 で作成したリソースをクリーンアップして、今後割り当ての消費や課金が発生しないようにします。次のセクションで、リソースを削除または無効にする方法を説明します。
プロジェクトの削除
課金をなくす最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。
プロジェクトを削除するには:
- Cloud Console で [リソースの管理] ページに移動します。
- プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
- ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。
次のステップ
- Google Cloud のその他の機能を試す。チュートリアルをご覧ください。