このチュートリアルでは、Cloud Scheduler と Cloud Functions を使用して、Filestore インスタンスのバックアップをスケジュールする方法について説明します。
目標
- Cloud Functions の関数を呼び出すために必要な認証情報を含む Cloud Scheduler のクライアント サービス アカウントを作成する。
- Cloud Functions が使用するクライアント サービス アカウントを作成する。このアカウントには、Filestore エンドポイントを呼び出すための認証情報が含まれます。
- ファイル共有のバックアップを作成(または削除)する Cloud Functions の関数を作成する。
- 定期的にバックアップ作成(またはバックアップ削除)関数を実行する Cloud Scheduler ジョブを作成する。
費用
このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。
- Artifact Registry API
- Cloud Build API
- Filestore API
- Cloud Functions API
- Cloud Logging API
- Pub/Sub API
- Cloud Run Admin API
- Cloud Scheduler API
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
始める前に
- 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.
-
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.
-
Enable the Artifact Registry, Cloud Build, Filestore, Cloud Functions, Cloud Logging, Pub/Sub, Cloud Run, and Cloud Scheduler APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
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.
-
Enable the Artifact Registry, Cloud Build, Filestore, Cloud Functions, Cloud Logging, Pub/Sub, Cloud Run, and Cloud Scheduler APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
- プロジェクトに Filestore インスタンスがない場合は、最初に 1 つを作成する必要があります。
Cloud Scheduler と Cloud Functions 用のクライアント サービス アカウントを作成する
まだ行っていない場合は、Google Cloud コンソールで [Cloud Shell をアクティブにする] をクリックします。
Cloud Scheduler が Cloud 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"
Cloud Functions が 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 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_LOCATION=fs-location export INSTANCE_NAME=instance-id export SHARE_NAME=datafile-share-name
次のように置き換えます。
- fs-locationは Filestore インスタンスが存在するリージョンまたはゾーン。
- instance-id は、Filestore インスタンスのインスタンス ID。
- file-share-name は、インスタンスから提供される NFS ファイル共有に指定する名前。
Filestore バックアップの環境変数を設定します。
export FS_BACKUP_LOCATION=region
region は、バックアップを保存するリージョンに置き換えます。
バックアップを作成する関数を作成する
Google Cloud Console で、[Cloud Functions] ページに移動します。
[関数を作成] をクリックして、次のように関数を構成します。
- 基本:
- 環境: この例では、デフォルトである
2nd gen
を選択します。 - 関数名: この例では、関数に
fsbackup
と名前を付けます。 - リージョン: この例では、
us-central1
を選択します。
- 環境: この例では、デフォルトである
- トリガー:
- トリガーのタイプ: メニューから [
HTTPS
] を選択します。 - Authentication:
Require authentication
を選択します。
- トリガーのタイプ: メニューから [
- ランタイム、ビルド、接続、セキュリティの設定:
- [ランタイム] > [ランタイム サービス アカウント] > [サービス アカウント]: メニューから
Service Account for FS Backups-GCF
(backupagent@$PROJECT_ID.iam.gserviceaccount.com
)を選択します。 - [接続] > [上り(内向き)設定]:
Allow all traffic
を選択します。
- [ランタイム] > [ランタイム サービス アカウント] > [サービス アカウント]: メニューから
- 基本:
[次へ] をクリックし、次のように構成を続けます。
- ランタイム: メニューから
Python 3.8
以降のバージョン(Cloud Functions で完全にサポートされている)を選択します。 - ソースコード:
Inline editor
。 - エントリ ポイント: 「
create_backup
」と入力します。 次の依存関係を
requirements.txt
ファイルに追加します。google-auth==2.29.0 requests==2.31.0
ユースケースによっては、他の依存関係、および対応するバージョン番号を指定しなければならない場合があります。詳細については、プリインストールされているパッケージをご覧ください。
インライン エディタを使用して、次の 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/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_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']) return "Backup creation has begun!"
次のように置き換えます。
- project-id をソース Filestore インスタンスの Google Cloud プロジェクト ID に置き換えます。
- filestore-zone をソース Filestore インスタンスのゾーンに置き換えます。
- filestore-name を、ソース Filestore インスタンスの名前に置き換えます。
- file-share-name を、ファイル共有の名前に置き換えます。
- backup-region を、バックアップを保存するリージョンに置き換えます。
[関数をテスト] をクリックします。
Cloud Shell で新しいタブセッションが開きます。成功した場合は、次のメッセージが返されます。
Function is ready to test.
[デプロイ] をクリックして、デプロイが完了するまで待ちます。
前の Cloud Shell タブに戻ります。
バックアップの削除
このサンプルコードは、事前定義された期間よりも古いバックアップを削除します。
この関数は、次の項目を除いてバックアップ関数の作成と同じように構成します。
- 関数名:
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) retention_seconds = BACKUP_RETENTION_TIME_HRS * 60 * 60 def delete_backup(request): now = time.time() 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.") return "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']) return "Backup deletion has begun!"
以下を置き換えます。
- project-id をバックアップの Google Cloud プロジェクト ID に置き換えます。
- region をバックアップが存在するリージョンに置き換えます。
- hours をバックアップを保持する時間に置き換えます。たとえば、バックアップを 10 日間保持する場合は「
240
」を入力します。
- このコードサンプルは、作成時間が付加された
- ランタイム: メニューから
クライアント サービス アカウントに IAM のロールを割り当てる
roles/cloudscheduler.serviceAgent
ロールを持つ Cloud Scheduler クライアント サービス アカウントの IAM ポリシーに、Cloud Scheduler サービス エージェントを追加します。これにより、サービス エージェントは、バックアップを作成する関数を呼び出すために、クライアント サービス アカウントの権限を借用できます。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
Cloud Functions のクライアント サービス アカウントに
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
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 Scheduler のクライアント サービス アカウントだけが
fsbackup
を呼び出せるようになりました。バックアップの削除
gcloud functions add-iam-policy-binding deletefsbackups \ --member serviceAccount:$SCHEDULER_CLIENT_SA \ --role roles/cloudfunctions.invoker
これで、Cloud Scheduler のクライアント サービス アカウントだけが
deletefsbackups
を呼び出せるようになりました。
指定されたスケジュールで fsbackup
関数をトリガーする Cloud Scheduler ジョブを作成する
このチュートリアルの例では、毎週午後 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 ジョブ スケジュールの構成をご覧ください。前の手順で作成した Cloud Scheduler ジョブを開始します。この例では、
scheduler jobs runs
コマンドを使用してすぐに実行します。gcloud scheduler jobs run fsbackupschedule
fsbackupschedule
ジョブは、コマンドの実行後すぐにfsbackups
関数を呼び出し、ジョブが一時停止されるまで毎週午後 10 時に関数を再度呼び出します。関数が適切に実行され、
status 200
を返しているかどうかを確認するには、fsbackups
関数のログを調べます。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
バックアップの割り当て不足のアラート
バックアップのスケジュールを実装すると、バックアップの割り当てが不足するおそれがあります。その場合、バックアップの割り当て不足のアラートを設定することをおすすめします。そうすれば、バックアップの割り当てが不足している際に通知を受け取ることができます。
クリーンアップ
チュートリアルが終了したら、作成したリソースをクリーンアップして、割り当ての使用を停止し、課金されないようにできます。次のセクションで、リソースを削除または無効にする方法を説明します。
プロジェクトの削除
課金をなくす最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。
プロジェクトを削除するには:
- 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.
次のステップ
- Filestore のスナップショットについて学ぶ。
- Filestore のバックアップについて学ぶ。
- Filestore Enterprise のスナップショットのスケジュールを設定する方法を学ぶ。