このチュートリアルでは、Cloud Scheduler と Cloud Run functions を使用して 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
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
始める前に
- 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 Run 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 Run 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 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.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 は、バックアップを保存するリージョンに置き換えます。
バックアップを作成する関数を作成する
Google Cloud コンソールで、[Cloud Run 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 Run 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_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 を、バックアップを保存するリージョンに置き換えます。
[関数をテスト] をクリックします。
Cloud Shell で新しいタブ セッションが開きます。成功すると、次のメッセージが返されます。
Function is ready to test.
[デプロイ] をクリックして、デプロイが完了するまで待ちます。
前の 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 は、バックアップが存在するリージョンに置き換えます。バックアップ、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.serviceAgent
Cloud 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.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 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 ジョブを作成する
バックアップの作成
このチュートリアルの例では、毎週午後 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 つのバックアップを作成できます。
前の手順で作成した Cloud Scheduler ジョブを開始します。この例では、
scheduler jobs runs
コマンドを使用してすぐに実行します。gcloud scheduler jobs run fsbackupschedule
fsbackupschedule
ジョブは、コマンドの実行後すぐに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 deletefsbackupschedule
deletefsbackupschedule
ジョブは、コマンドの実行後すぐに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
バックアップの割り当て不足のアラート
バックアップのスケジュールを実装すると、バックアップの割り当てが不足するおそれがあります。その場合、バックアップの割り当て不足のアラートを設定することをおすすめします。そうすれば、バックアップの割り当てが不足している際に通知を受け取ることができます。
クリーンアップ
チュートリアルが終了したら、作成したリソースをクリーンアップして、割り当ての使用を停止し、課金されないようにできます。次のセクションで、リソースを削除または無効にする方法を説明します。
プロジェクトの削除
課金をなくす最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。
プロジェクトを削除するには:
- 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 のスナップショットのスケジュールを設定する方法を学ぶ。