Cloud Functions と Cloud Scheduler を使った Cloud SQL エクスポートのスケジュール設定
Google Cloud Japan Team
※この投稿は米国時間 2021 年 5 月 11 日に、Google Cloud blog に投稿されたものの抄訳です。
Cloud SQL では、Cloud Console から直接任意のデータベースを簡単にエクスポートできます。データベース エクスポート ファイルは Google Cloud Storage に保存され、Cloud SQL のインポート プロセスでそのファイルを使って新しいデータベースとして再作成することができます。


1 回限りのエクスポート ファイルを作成するだけでも十分役立ちますが、この処理を週に一度自動的に実行するように設定する方がさらに便利です。本ブログ投稿では、Cloud SQL データベースを Cloud Storage に週に一度エクスポートするスケジュールを設定するのに必要な手順についてご説明します。今回の例では SQL Server インスタンスを使用しますが、全体的な手順は Cloud SQL の MySQL データベースと PostgreSQL データベースでも同じです。
まず、Cloud SQL に SQL Server インスタンスを作成する必要があります。これは、Google Cloud Console から行えます。
SQL Server インスタンスの作成方法や Azure Data Studio を使ってそのインスタンスに接続する方法について詳しくは、以前の投稿 Try out SQL Server on Google Cloud at your own pace(自分のペースで Google Cloud 上の SQL Server を使ってみる)をご覧ください。
データベースとテーブルを作成する
まず、SQL Server インスタンスに新しいデータベースを作成します。Azure Data Studio と SQL Server インスタンスを接続したまま、Azure Data Studio でサーバーを右クリックし、[New Query] を選択します。


以下の SQL ステートメントを入力し、新しいデータベース、作業対象データを含む新しいテーブルを作成します。
[実行] ボタンをクリックします。


Google Cloud Storage にバケットを作成する
次に、このデータベースを週に一度 Cloud Storage にエクスポートするスケジュールを設定します。まず、データベース エクスポート ファイルを格納する Cloud Storage バケットを作成します。Cloud Console の [Cloud Storage] セクションに移動して [バケットを作成] ボタンをクリックします。[名前] にバケットの名前を入力して [作成] ボタンをクリックします。

エクスポート ファイルを保存するバケットができたので、このバケットにファイルを書き込む権限を Cloud SQL インスタンスに付与する必要があります。これを行うには、新しいバケットにオブジェクトを作成できる権限を Cloud SQL インスタンスのサービス アカウントに付与します。最初に、Cloud SQL インスタンスの詳細ページからサービス アカウントのアドレスをコピーする必要があります。[Cloud SQL インスタンス] ページに移動して対象のインスタンスを選択します。次に、詳細ページで画面を下にスクロールして [サービス アカウント] のアドレスをコピーします。


[サービス アカウント] のアドレスをクリップボードにコピーしたら、Cloud Storage のバケットに戻ってバケットの [権限] タブをクリックします。


[追加] ボタンをクリックして Cloud Storage バケットに権限を追加します。


コピーしたサービス アカウントを追加し、[ロール] で [Cloud Storage] - [Storage オブジェクト管理者] を選択して [保存] ボタンをクリックします。


Cloud SQL エクスポート ファイルをエクスポートするのは週に一度なので、なるべくコストがかからない方法を取ろうと思います。Cloud Storage のオブジェクトのライフサイクル管理を使うことで、時間の経過に合わせてこれらのエクスポート ファイルのストレージ クラスを変更してストレージ料金を安く抑えます。これを行うには、Cloud Storage バケットの [ライフサイクル] タブを選択します。


バケット用に 3 つのライフサイクル ルールを設定していきます。1 つ目は 1 か月以上経過したエクスポート ファイルを Nearline Storage に変換するためのもの、2 つ目は 3 か月以上経過したエクスポート ファイルを Coldline Storage に変換するためのもの、3 つ目は 1 年以上経過したエクスポート ファイルを最もコストが安い Archive Storage クラスに変換するためのものです。このちょっとした手間を加えることで、作成されてから時間が経過したエクスポート ファイルのストレージ コストが大幅に削減されます。
[ルールを追加] ボタンをクリックし、30 日以上経過したオブジェクトのストレージ クラスを Nearline Storage に変更するルールを追加します。


[ルールを追加] ボタンを再度クリックし、90 日以上経過したオブジェクトのストレージ クラスを Coldline Storage に変更するルールを追加します。


さらにもう一度 [ルールを追加] ボタンをクリックし、365 日以上経過したオブジェクトのストレージ クラスを Archive Storage に変更するルールを追加します。


3 つのルールを追加すると、バケットの [ライフサイクル] 設定は以下のようになるはずです。


Cloud SQL データベースをエクスポートする Cloud Functions の関数を作成する
エクスポート ファイルを格納する Cloud Storage バケットが完成したので、Cloud SQL データベースのエクスポート メソッドを呼び出せる Cloud Functions の関数を作成しましょう。
Cloud Console の [Cloud Functions] セクションからこの作業を始めていきます。[関数を作成] ボタンをクリックして作成プロセスを開始します。次の情報を入力します。
関数の名前を指定します。
例: export-cloud-sql-db
関数を実行するリージョンを選択します。
例: us-west2
トリガータイプには [Cloud Pub/Sub] を選択します。Cloud SQL インスタンスの管理に使用する、「DatabaseMgmt」という新しい Pub/Sub トピックを作成していきます。[Cloud Pub/Sub トピックを選択してください] プルダウン メニューで [トピックを作成する] ボタンをクリックします。表示された [トピックを作成する] ダイアログ ウィンドウで、[トピック ID] に「DatabaseMgmt」と入力して [トピックを作成する] ボタンをクリックします。次に、[保存] ボタンをクリックして Cloud Pub/Sub を Cloud Functions の関数のトリガーに設定します。
[ランタイム、ビルド、接続の設定] セクションを展開して [接続] をクリックします。
[上り設定] で [内部トラフィックのみを許可する] を選択します。
[下り設定] で [コネクタを作成] ボタンをクリックします。新しいブラウザタブが開き、Cloud Console の [ネットワーキング] セクションで [サーバーレス VPC アクセス] のフローが開始されます。GCP プロジェクトで初めてこのフローを行うと、サーバーレス VPC アクセス API を有効にするよう求める画面にリダイレクトされます。この画面が表示されたら、API を有効にして VPC コネクタの作成プロセスを続行します。VPC コネクタの作成に使用するフォームが完成すると次のようになります。


[名前] に「cloud-sql-db-mgmt」と入力します。
[リージョン] で [us-west2] を選択します。
[ネットワーク] プルダウン メニューで [デフォルト] を選択します。
[サブネット] で [カスタム IP 範囲] を選択し、[IP 範囲] に「10.8.0.0」と入力します。
[作成] ボタンをクリックして、サーバーレス VPC アクセス コネクタが作成されるまで 1 分ほど待ちます。コネクタが作成されたら、Cloud Functions の関数作成フォームがまだ開いている他のブラウザタブに戻ります。[下り設定] セクションの [VPC コネクタ] に「cloud-sql-db-mgmt」と入力します。
また、[下り設定] で [すべてのトラフィックを VPC コネクタ経由でルーティングする] オプションを選択します。
すべての値が入力され、[関数を作成] フォームの [構成] セクションが完成すると次のようになります。
[関数を作成] フォームの一番下にある [次へ] ボタンをクリックして、関数を強化するコードを入力する次のステップに移りましょう。
[関数を作成] フォームの [コード] ステップで、[ランタイム] に [Go 1.13] を選択してコードの [エントリ ポイント] に「ProcessPubSub」と入力します。
次に、[ソースコード] - [インライン エディタ] のコード セクションに以下のコードをコピーして貼り付けます。
[関数を作成] フォームの [コード] セクションが完成すると次のようになるはずです。


[デプロイ] ボタンをクリックして関数をデプロイします。デプロイ プロセスが完了するまで数分かかります。
権限を付与して Cloud Functions の関数が Cloud SQL のエクスポートを実行できるようにする
いよいよ、Cloud Functions の関数を完全に機能させるための最後の設定ステップまで来ました。ここでは、必要な権限を付与して Cloud Functions の関数サービス アカウントが Cloud SQL 管理者メソッド(データベース エクスポートやインポート操作など)を実行できるようにします。
Cloud Console の [IAM] セクションに移動します。サービス アカウントの権限はここで管理します。Cloud Functions で使用する、App Engine デフォルト サービス アカウントを見つけます。このサービス アカウントのサフィックスは「@appspot.gserviceaccount.com」です。アカウントの鉛筆型の編集アイコンをクリックします。


[権限の編集] ダイアログ ウィンドウで [別のロールを追加] ボタンをクリックします。追加する [Cloud SQL 管理者] ロールを選択し、[保存] ボタンをクリックします。


Cloud Functions の関数をテストする
これで関数が完成したのでテストしてみましょう。メッセージを Pub/Sub トピックに送信し、Cloud SQL エクスポート操作の呼び出しをトリガーすることで Cloud Functions の関数をテストできます。
Cloud Console の [Cloud Pub/Sub] セクションに移動します。[DatabaseMgmt] トピックを選択します。[メッセージをパブリッシュ] ボタンをクリックします。
[メッセージをパブリッシュ] フォームの [メッセージ本文] セクションにある [メッセージ] 入力領域に、以下の JSON 形式のテキストを入力します。「<your-instance-name>」、「<your-project-id>」、「<your-gcs-bucket>」の値を、これらのリソースを作成した際に選択した値に変更するのを忘れないようにしてください。
パブリッシュする Pub/Sub メッセージは次のようになるはずです。


[公開] ボタンをクリックしてメッセージをパブリッシュすると、Cloud Functions の関数がトリガーされます。メッセージ本文で指定した Cloud Storage バケットを見ることで、すべてが想定通りに動作していることを確認できます。バケットには「export-demo-2021–04–16–1459–40.gz」と似たような名前のファイルがあるはずです。


Cloud Functions の関数を週に一度トリガーする Cloud Scheduler ジョブを作成する
Cloud Functions の関数が想定通りに動作することが確認できたので、Cloud Scheduler を使って、Cloud Functions の関数を週に一度トリガーするジョブを作成しましょう。Cloud Console の [Cloud Scheduler] セクションに移動し、[ジョブのスケジュール設定] ボタンをクリックします。
スケジュールされたジョブの [名前] を入力します。
例: export-cloud-sql-database
スケジュールされたジョブの [説明] を入力します。
例: Cloud SQL データベースをエクスポートする Cloud Functions の関数をトリガー
ジョブを実行するタイミングを指定する [頻度] には「0 9 * * 5」と入力します。これで、ジョブが毎週金曜日の午前 9 時ちょうどに実行されるようになります。頻度はニーズに合わせて設定してください。頻度の設定の詳細については、Cloud Scheduler のドキュメントを参照してください。
[ジョブのターゲットを構成する] セクションで [ターゲット タイプ] に [Pub/Sub] を選択します。
[トピック] で、前のステップで作成した Pub/Sub トピック「DatabaseMgmt」を指定します。
[メッセージ本文] には、この投稿の前のステップで Cloud Functions の関数をテストするのに使用したのと同じ JSON メッセージを入力します。「<your-instance-name>」、「<your-project-id>」、「<your-gcs-bucket>」の値を、これらのリソースを作成した際に選択した値に変更するのを忘れないようにしてください。
[ジョブの作成] フォームが完成すると次のようになるはずです。


情報をすべて入力したら、[作成] ボタンをクリックして Cloud Scheduler ジョブを作成します。ジョブの作成が完了するとジョブのリストが表示されます。ここにはスケジュールされたジョブをすぐにテストするための便利な [今すぐ実行] ボタンがあります。


そのまま [今すぐ実行] ボタンをクリックし、Cloud Storage バケットに新しいエクスポート ファイルが作成される様子を確認しながら、Cloud SQL データベースの自動エクスポートをすべて問題なく設定できた満足感に浸りましょう。以上で完了です。お疲れさまでした。


次のステップ
Cloud SQL でのデータのエクスポート、および Google Cloud Console から実行できる、Cloud SQL での SQL Server インスタンスの作成に関するページもぜひご覧ください。
-Google Cloud デベロッパー プログラム エンジニア Jonathan Simon