こんにちは。GMO NIKKO エンジニアのN.I.です。
今回は検証環境のCloudSQLをインスタンスを平日の9:30~21:00に自動起動して自動停止する仕組みを作成したのでこちらを紹介したいと思います。
前回ComputeEngineの停止を記載しましたので、続きでCloudSQLのインスタンスIDで起動、停止を実行する方法を紹介します。
アプリケーション フロー
CloudSQLを自動起動/停止するためのフローは下記の様になります。
- Cloud Scheduler ジョブ : スケジュールに従ってインスタンスの起動と停止情報をPub/Subに送付します。
- Pub/Subメッセージ : インスタンスの起動/停止のメッセージをCloud Schedulerから受信してCloud Functionsに情報を渡します。
- Cloud FunctionからCloud SQLの開始/停止指示を実施します。
- Cloud SQLが開始/停止されます。
前回と同じで簡単に作成出来ると思います。
下記設定で作成したSQLサーバーを停止/起動出来るか確認します。
データベースエンジンはどれでも対応できるはずです。
インスタンスID : testsql
では、実際に設備を作っていきます。
Pub/SubとCloud Functionsを設定する
まずpub/sub、Cloud Functionsを作成します。今回もGCP管理画面から作成する方法で説明します。
-
- Cloud Console の [Cloud Functions] ページに移動します。
- 画面上部の [関数の作成] をクリックします。
- [関数名] に gcsqlInstancepubsub を入力します。
- [リージョン] に asia-northsast1 (Tokyo) を選択します。
- [トリガーのタイプ] に Cloud Pub/Sub を選択します。
- [Cloud Pub/Sub トピックを選択してください] をクリックし、トピックを作成する をクリックします。
- [トピックの作成] ダイアログ ボックスが表示されます。
- [トピック ID ] に gcsqlinstance-event を入力します。 (スキーマを使用する,メッセージの保持期間を設定する,顧客管理の暗号鍵を使用するの項目はチェック不要です。)
- [トピックを作成] をクリックしてダイアログ ボックスを閉じます。
- [トリガー] ボックスの下部にある [保存] をクリックします。
- ページの下部にある [次へ] をクリックします。
- [ランタイム] で [Node.js 16] を選択します。
- [エントリ ポイント] に gcsqlinstancepubsub と入力します。
- コードエディタの左側にある [index.js] を選択します。
- コードを次のコードに置き換えます。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475const {google} = require('googleapis');const sqladmin = google.sqladmin("v1beta4");const compute = require('@google-cloud/compute');const instancesClient = new compute.InstancesClient({fallback: 'rest'});/*** Start/Stop Cloud SQL instances.*/exports.gcsqlinstancepubsub = async (event, context, callback) => {try {const project = await instancesClient.getProjectId();const payload = _validatePayload(event);const authClient = await google.auth.getClient({scopes: ['https://www.googleapis.com/auth/cloud-platform','https://www.googleapis.com/auth/sqlservice.admin',],});var message = '';if (payload.svstatus == 'start') {const options = {auth: authClient,project,instance: payload.instance,requestBody: {settings: {activationPolicy: "ALWAYS",}},};await sqladmin.instances.patch(options);message = 'Successfully started instance ' + payload.instance;} else if (payload.svstatus == 'stop') {const options = {auth: authClient,project,instance: payload.instance,requestBody: {settings: {activationPolicy: "NEVER",}},};await sqladmin.instances.patch(options);message = 'Successfully stopped instance ' + payload.instance;}console.log(message);callback(null, message);} catch (err) {console.log(err);callback(err);}};/*** Validates that a request payload contains the expected fields.** @param {!object} payload the request payload to validate.* @return {!object} the payload object.*/const _validatePayload = event => {let payload;try {payload = JSON.parse(Buffer.from(event.data, 'base64').toString());} catch (err) {throw new Error('Invalid Pub/Sub message: ' + err);}if (!payload.instance) {throw new Error("Attribute 'instance' missing from payload");}else if (!payload.svstatus) {throw new Error("Attribute 'instancestatus' missing from payload");}return payload;}; - コードエディタの左側にある [package.json] を選択します。
- コードを次のコードに書き換えます。
1234567891011121314151617{"name": "schedule-gcsqlinstance","version": "1.0.0","private": true,"engines": {"node": ">=12.0.0"},"devDependencies": {"mocha": "^9.0.0","proxyquire": "^2.0.0","sinon": "^11.0.0"},"dependencies": {"@google-cloud/compute": "^3.0.0","googleapis": "^89.0.0"}} - ページの下部にある [デプロイ] をクリックします。
※エラーになった場合は [package.json]が上記以外にsampleが登録されることがあるみたいなので削除して再度デプロイを行ってください。
Cloud Schedulerを設定する
Cloud Schedulerからインスタンスの起動/停止のメッセージを送付します。
下記手順で作成します。
SQLサーバー開始の作成
- Cloud Console の [Cloud Scheduler] ページに移動します。
- [ジョブを作成] をクリックします。
- [スケジュールを定義する] を入力します。
- [名前] を startup-sqltestserver (任意) を入力します。
- [頻度] に 30 9 * * 1-5 を入力します。 (この例では平日9時30分に設定しています。任意で時間変更下さい。)
- [タイムゾーン] で、日本標準時 (JST) を選択します。
- [続行] をクリックします。
- [実行内容を構成する] を入力します。
- [ターゲットタイプ] で、 [Pub/Sub] を選択します。
- [トピック] に gcsqlinstance-event と入力します。
- [メッセージ本文] に下記を入力します。
1{"instance":"testsql","svstatus":"start"}
- [続行] をクリックします。
- Configure the job’s retry (optional)になります。特に変更ありません。
- [作成] をクリックします。
SQLサーバー停止の作成
- Cloud Console の [Cloud Scheduler] ページに移動します。
- [ジョブを作成] をクリックします。
- [スケジュールを定義する] を入力します。
- [名前] を shutdown-sqltestserver (任意) を入力します。
- [頻度] に 0 21 * * 1-5 を入力します。 (この例では平日21時00分に設定しています。任意で時間変更下さい。)
- [タイムゾーン] で、日本標準時 (JST) を選択します。
- [続行] をクリックします。
- [実行内容を構成する] を入力します。
- [ターゲットタイプ] で、 [Pub/Sub] を選択します。
- [トピック] に gcsqlinstance-event と入力します。
- [メッセージ本文] に下記を入力します。
1{"instance":"testsql","svstatus":"stop"}
- [続行] をクリックします。
- [Configure the job’s retry (optional)]は特に変更ありませんそのままで大丈夫です。
- [作成] をクリックします。
以上で設定完了です。スケジューラから [今すぐ実行] をクリックしてサーバーが開始/終了出来るか確認します。
CloudFunctionsで開始/停止テスト時に下記の様なログが出ます。実際にサーバーが停止されていたらOKです。
CloudSQLのSQLサーバー自動起動/自動停止の設定は以上で完了です。検証環境の費用削減などに役に立てば幸いです。