このチュートリアルでは、Cloud Scheduler と Cloud Run functions を使用して Filestore インスタンスのバックアップをスケジュールする方法について説明します。
マネージド サービス スケジューラを使用してバックアップを作成する方法については、Filestore 拡張バックアップをご覧ください。
目標
- Cloud Run functions の関数を呼び出すために必要な認証情報を含む Cloud Scheduler のクライアント サービス アカウントを作成する。
- Filestore エンドポイントを呼び出すための認証情報を持つ Cloud Run functions のクライアント サービス アカウントを作成します。
- Filestore インスタンスのバックアップを作成する Cloud Run functions の関数を作成します。
- Filestore インスタンスのバックアップを削除する Cloud Run 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
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
始める前に
- Google Cloud アカウントにログインします。 Google Cloudを初めて使用する場合は、 アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Artifact Registry, Cloud Build, Filestore, Cloud Run functions, Cloud Logging, Pub/Sub, Cloud Run, and Cloud Scheduler APIs.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.-
Google Cloud CLI をインストールします。
-
外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。
-
gcloud CLI を初期化するには、次のコマンドを実行します。
gcloud init -
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Artifact Registry, Cloud Build, Filestore, Cloud Run functions, Cloud Logging, Pub/Sub, Cloud Run, and Cloud Scheduler APIs.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.-
Google Cloud CLI をインストールします。
-
外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。
-
gcloud CLI を初期化するには、次のコマンドを実行します。
gcloud init - プロジェクトに Filestore インスタンスがない場合は、最初に 1 つを作成する必要があります。
Cloud Scheduler と Cloud Run functions 用のクライアント サービス アカウントを作成する
まだ行っていない場合は、 Google Cloud コンソールで [Cloud Shell をアクティブにする] をクリックします。
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"Cloud Run 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 Run 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.comFilestore インスタンス:
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-regionbackup-region は、バックアップを保存するリージョンに置き換えます。
バックアップを作成する関数を作成する
Google Cloud コンソールで、Cloud Run functions ページに移動します。
[関数を作成] をクリックして、次のように関数を構成します。
- 構成:
- サービス名: この例では、関数に
fsbackupと名前を付けます。 - リージョン: この例では
us-central1を選択します。 - ランタイム: メニューから、Cloud Run functions で完全にサポートされているサポート対象の Python 3 ランタイムを選択します。
- サービス名: この例では、関数に
- トリガー:
- この例では、トリガーを設定する必要はありません。
- Authentication:
Require authenticationを選択します。 - Ingress:
Allを選択します。 - コンテナ、ボリューム、ネットワーキング、セキュリティ
- [セキュリティ] タブに移動し、メニューから
Service Account for FS Backups-GCF(backupagent@$PROJECT_ID.iam.gserviceaccount.com)を選択します。
- [セキュリティ] タブに移動し、メニューから
- 構成:
[作成] をクリックし、次のように構成を続行します。
- 関数のエントリ ポイント: 「
create_backup」と入力します。 次の依存関係を
requirements.txtファイルに追加します。functions-framework==3.* google-auth==2.29.0 requests==2.31.0ユースケースによっては、他の依存関係、および対応するバージョン番号を指定しなければならない場合があります。詳細については、プリインストールされたパッケージをご覧ください。
インライン エディタを使用して、次の Python コードサンプルを
main.pyファイルにコピーします。バックアップの作成
このコードサンプルは、作成時間が付加された
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 functions_framework 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") @functions_framework.http 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 を、バックアップを保存するリージョンに置き換えます。
[テスト] をクリックします。
Cloud Shell で新しいタブ セッションが開きます。成功すると、次のメッセージが返されます。
Backup creation has begun![保存して再デプロイ] をクリックし、デプロイが完了するまで待ちます。
前の Cloud Shell タブに戻ります。
バックアップを削除する
このサンプルコードは、事前定義された期間よりも古いバックアップを削除します。
一度に削除できるバックアップは、ソース インスタンスごとに 1 つだけです。詳細については、バックアップをご覧ください。
この関数は、次の変更を加えて、バックアップの作成に使用した関数と同じように構成します。
- 関数名:
deletefsbackup。 - エントリ ポイント:
delete_backup。
PROJECT_ID = 'project-id' BACKUP_REGION = 'region' BACKUP_RETENTION_TIME_HRS = hours import functions_framework 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 @functions_framework.http 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 は、バックアップが存在するリージョンです。バックアップ、Scheduler ジョブ、関数はすべて同じロケーションに存在する必要があります。
- hours をバックアップを保持する時間に置き換えます。たとえば、バックアップを 10 日間保持する場合は「
240」を入力します。
- 関数のエントリ ポイント: 「
クライアント サービス アカウントに IAM のロールを割り当てる
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.serviceAgentCloud Run 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.editorCloud Scheduler のクライアント サービス アカウントに、使用する関数の
roles/run.invokerロールを付与します。次のrun services add-iam-policy-bindingコマンドを実行します。バックアップの作成
gcloud run services add-iam-policy-binding fsbackup \ --member serviceAccount:$SCHEDULER_CLIENT_SA \ --role roles/run.invoker \ --region=us-central1これで、Cloud Scheduler のクライアント サービス アカウントだけが
fsbackupを呼び出せるようになりました。バックアップを削除する
gcloud run services add-iam-policy-binding deletefsbackup \ --member serviceAccount:$SCHEDULER_CLIENT_SA \ --role roles/run.invokerこれで、Cloud Scheduler のクライアント サービス アカウントだけが
deletefsbackupを呼び出せるようになりました。
指定されたスケジュールで関数をトリガーする Cloud Scheduler ジョブを作成する
バックアップの作成
このチュートリアルの例では、毎週午後 10 時にバックアップをスケジュールを設定する場合に、
scheduler jobs create httpのようなコマンドを使用します。gcloud scheduler jobs create http fsbackupschedule \ --schedule "0 22 * * 1-5" \ --http-method=GET \ --uri=https://fsbackup-$PROJECT_NUMBER.us-central1.run.app \ --oidc-service-account-email=$SCHEDULER_CLIENT_SA \ --location=us-central1--scheduleフラグでは、unix-cron 形式を使用して、ジョブの実行頻度を指定します。詳細については、cron ジョブ スケジュールの構成をご覧ください。インスタンスごとに 1 時間あたり最大 6 つのバックアップを作成できます。
前の手順で作成した Cloud Scheduler ジョブを開始します。この例では、
scheduler jobs runsコマンドを使用して、すぐに実行します。gcloud scheduler jobs run fsbackupschedulefsbackupscheduleジョブは、コマンドの実行後すぐにfsbackup関数を呼び出し、ジョブが一時停止されるまで毎週午後 10 時に関数が呼び出されます。関数が適切に実行され、
status 200を返しているかどうかを確認するには、fsbackup関数のログを調べます。Google Cloud コンソールでログを表示するには、ログ エクスプローラを使用します。
-
Google Cloud コンソールで、 [ログ エクスプローラ] ページに移動します。
このページを検索バーで検索する場合は、小見出しが「Logging」の結果を選択します。
最新のログが [クエリ結果] ペインに表示されます。
-
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
バックアップを削除する
このチュートリアルの例では、毎週午後 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 つずつ実行する必要があります。詳細については、バックアップをご覧ください。前の手順で作成した Cloud Scheduler ジョブを開始します。この例では、
scheduler jobs runsコマンドを使用してすぐに実行します。gcloud scheduler jobs run deletefsbackupscheduledeletefsbackupscheduleジョブは、コマンドの実行後すぐにdeletefsbackup関数を呼び出し、ジョブが一時停止されるまで毎週午後 10 時に関数が呼び出されます。関数が適切に実行され、
status 200を返しているかどうかを確認するには、deletefsbackup関数のログを調べます。Google Cloud コンソールでログを表示するには、ログ エクスプローラを使用します。
-
Google Cloud コンソールで、 [ログ エクスプローラ] ページに移動します。
このページを検索バーで検索する場合は、小見出しが「Logging」の結果を選択します。
最新のログが [クエリ結果] ペインに表示されます。
-
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
バックアップの割り当て不足のアラート
バックアップのスケジュールを実装すると、バックアップの割り当てが不足するおそれがあります。その場合、バックアップの割り当て不足のアラートを設定することをおすすめします。そうすれば、バックアップの割り当てが不足している際に通知を受け取ることができます。
クリーンアップ
チュートリアルが終了したら、作成したリソースをクリーンアップして、割り当ての使用を停止し、課金されないようにできます。次のセクションで、リソースを削除または無効にする方法を説明します。
プロジェクトの削除
課金されないようにする最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。
プロジェクトを削除するには:
- Google Cloud コンソールで [リソースの管理] ページに移動します。
- プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
- ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。
次のステップ
- Filestore のスナップショットについて学ぶ。
- Filestore のバックアップについて学ぶ。
- Filestore Enterprise のスナップショットのスケジュールを設定する方法を学ぶ。