開発費用の削減: Cloud SQL インスタンスの起動と停止をスケジュールする
Google Cloud Japan Team
※この投稿は米国時間 2021 年 5 月 18 日に、Google Cloud blog に投稿されたものの抄訳です。
Cloud SQL インスタンスを開発サーバーとして使用している場合、常時稼働させる必要はありません。この場合は、開発サーバーを作業日の開始時に毎朝起動し、開発作業が終了したら毎晩停止するようにスケジュール設定することで、Cloud SQL の使用料金を大幅に削減できます。このようにインスタンスを構成すると、インスタンスを継続的に実行する場合と比べて、1 週間あたりの実行コストを最大 75% 削減することができます。
今回のブログ投稿では、Cloud Functions、Cloud Pub/Sub、Cloud Scheduler を使用して、営業日ごとに起動して停止するように Cloud SQL インスタンスを構成する手順についてご説明します。
ここでは SQL Server インスタンスを使ってこのプロセスを説明しますが、全体的なアプローチは Cloud SQL で動作する MySQL や PostgreSQL インスタンスでも機能します。
Google Cloud Platform プロジェクトを作成する
始めに、Google Cloud Platform プロジェクトを準備する必要があります。すでにプロジェクトがある場合は、この手順を省略できます。プロジェクトの作成と管理に関するドキュメントに沿って、新しいプロジェクトを作成してください。
SQL Server インスタンスを作成する
プロジェクトを作成したら、Cloud Console の左側のメニューをクリックし、[SQL] を選択して Cloud SQL セクションを開きます。これでインスタンスを作成できます。
[インスタンスを作成] ボタンをクリックし、[SQL Server を選択] オプションを選択します。
有効なインスタンス ID を入力します。
例: sql-server-dev
「sqlserver」ユーザーのパスワードを入力するか、[生成] ボタンをクリックします。
[データベースのバージョン] は [SQL Server 2017 Standard] を選択します。
「us-west1」など、インスタンスを配置する [リージョン] を選択します。
リージョンのゾーンについては、インスタンスは開発用であり、コストが最小となるよう最適化されているため、[シングルゾーン] を選択します。
[インスタンスのカスタマイズ] で [設定オプションを表示] をクリックし、低コストの開発インスタンスを構成します。
[マシンタイプ] セクションをクリックして展開し、[軽量] マシンタイプ(1 つの vCPU と 3.75 GB の RAM を搭載)を選択します。
[ストレージ] セクションをクリックして展開し、最小オプションである [20 GB] を選択します。
[バックアップ] セクションをクリックして展開し、自動バックアップの時間枠として [12:00 PM~4:00 PM] を選択します。バックアップ操作はインスタンスの実行中のみ可能なため、インスタンスが実行される午前 9 時から午後 5 時までの時間枠内で選択する必要があります。
すべての情報が指定されると、インスタンス作成フォームは以下のように表示されます。
[インスタンスを作成] をクリックして、インスタンスの作成プロセスを完了します。
Cloud SQL インスタンスを起動、停止させる Cloud Functions の関数を作成する
Cloud SQL インスタンスを作成したら、次のステップでは、インスタンスを起動し停止させる Cloud Functions の関数を作成します。Cloud Console の Cloud Functions セクションに移動し、[関数を作成] ボタンをクリックします。
次の情報を入力します。
関数名を指定します。
例: start-or-stop-cloud-sql-instance
関数を実行するリージョンを選択します。
例: us-west2
トリガータイプには [Cloud Pub/Sub] を選択します。Cloud SQL インスタンスの管理に使用する、「InstanceMgmt」という新しい Pub/Sub トピックを作成していきます。[Cloud Pub/Sub トピックを選択してください] プルダウン メニューで [トピックを作成する] ボタンをクリックします。[トピックを作成する] ダイアログ ウィンドウが表示されたら、[トピック ID] に「InstanceMgmt」と入力して [トピックを作成する] ボタンをクリックします。次に [保存] ボタンをクリックして、Cloud Pub/Sub を Cloud Functions の関数のトリガーに設定します。
すべての値が入力され、[関数を作成] フォームの [設定] セクションが完成すると次のようになります。
[関数を作成] フォームの一番下にある [次へ] ボタンをクリックして、関数を強化するコードを入力する次のステップに移りましょう。
[関数を作成] フォームの [コード] ステップで、[ランタイム] として [Go 1.13] を選択し、コードの [エントリ ポイント] として「ProcessPubSub」と入力します。
次に以下のコードをコピーして、[ソースコード] - [インライン エディタ] のコード セクションに貼り付けます。
[関数を作成] フォームの [コード] セクションが完成すると次のようになります。
[デプロイ] ボタンをクリックして関数をデプロイします。デプロイ プロセスが完了するまでに 1~2 分かかります。
Cloud Functions の関数に Cloud SQL インスタンスを起動または停止する権限を付与する
次に、Cloud Functions の関数のサービス アカウントに、インスタンスの起動や停止に使用される「パッチ」などの Cloud SQL 管理者メソッドを実行する権限を付与する必要があります。
Cloud Console の IAM セクションに移動し、Cloud Functions で使用される「App Engine デフォルト サービス アカウント」を見つけます。このサービス アカウントのサフィックスは「@appspot.gserviceaccount.com」です。鉛筆アイコンをクリックして編集します。
[権限の編集] ダイアログ ウィンドウで [別のロールを追加] ボタンをクリックします。追加する [Cloud SQL 管理者] ロールを選択し、[保存] ボタンをクリックします。
Cloud Functions の関数が想定どおりに動作することを確認する
お疲れさまでした。これで、Cloud Functions の関数をテストする準備が整いました。テストを行うには、関数のトリガーとして設定されている Pub/Sub トピックにメッセージを送信します。
まず、インスタンスの停止をテストします。Cloud Console の Pub/Sub セクションに移動し、「InstanceMgmt」トピックを選択します。[メッセージのパブリッシュ] ボタンをクリックし、次の JSON メッセージを貼り付けます(<your-project-id> は実際のプロジェクト ID に置き換えます)。パブリッシュする Pub/Sub メッセージは次のようになります。
[公開] ボタンをクリックしてメッセージをパブリッシュすると、Cloud Functions の関数がトリガーされてインスタンスが停止します。Cloud SQL のインスタンスの詳細に戻ると、インスタンスが停止していることがわかります。
次に、別の Pub/Sub メッセージをパブリッシュしてインスタンスを起動します。Cloud Console の Pub/Sub セクションに移動し、「InstanceMgmt」トピックを選択します。[メッセージのパブリッシュ] ボタンをクリックし、次の JSON メッセージを貼り付けます(今回はアクションを「start」にします)。<your-project-id> は実際のプロジェクト ID に置き換えてください。
[公開] ボタンをクリックしてメッセージをパブリッシュすると、Cloud Functions の関数がトリガーされてインスタンスが再起動します。
Cloud SQL のインスタンスの詳細ページに戻ると、2~3 分後にインスタンスが再起動します。
Cloud Functions の関数をトリガーする Cloud Scheduler ジョブを作成する
お疲れさまでした。Cloud Functions の関数が想定通りに動作することが確認できたので、最後のステップとして、インスタンスを自動的に起動して停止する 2 つの Cloud Scheduler ジョブを作成します。
Cloud Console のCloud Scheduler セクションに移動し、[ジョブのスケジュール設定] ボタンをクリックします。
スケジュールされたジョブの [名前] を入力します。
例: start-cloud-sql-dev-instance
スケジュールされたジョブの [説明] を入力します。
例: Cloud Functions の関数をトリガーして Cloud SQL 開発インスタンスを起動する
ジョブを実行するタイミングを指定する [頻度] には「0 9 * * 1-5」と入力します。これで、ジョブが月曜日から金曜日の毎日午前 9 時に実行されるようになります。
タイムゾーン セレクタからタイムゾーンを選択します。
[ジョブのターゲットを構成する] セクションで [ターゲット タイプ] に「Pub/Sub」を選択し、[トピック] に「InstanceMgmt」を指定します。
[メッセージ本文] には、この投稿の前のステップで Cloud Functions の関数をテストするのに使用したのと同じ「start」の JSON メッセージを入力します。必ず <your-project-id> を実際のプロジェクト ID に置き換えてください。
[ジョブの作成] フォームが完成すると次のようになります。
情報をすべて入力したら、[作成] ボタンをクリックして「start」Cloud Scheduler ジョブを作成します。
これで、平日の午前 9 時に Cloud SQL インスタンスを起動する、スケジュールされたジョブができました。最後に、平日の夕方にインスタンスを停止するように、スケジュールされたジョブをもう 1 つ作成します。再度、Cloud Scheduler の [ジョブのスケジュール設定] ボタンをクリックして作成します。
スケジュールされたジョブの [名前] を入力します。
例: stop-cloud-sql-dev-instance
スケジュールされたジョブの [説明] を入力します。
例: Cloud Functions の関数をトリガーして Cloud SQL 開発インスタンスを停止する
ジョブを実行するタイミングを指定する [頻度] には「0 17 * * 1-5」と入力します。これで、ジョブが月曜日から金曜日の毎日午後 5 時に実行されるようになります。頻度の設定について詳しくは、Cloud Scheduler のドキュメントをご覧ください。
タイムゾーン セレクタからタイムゾーンを選択します。
[ジョブのターゲットを構成する] セクションで [ターゲット タイプ] に「Pub/Sub」を選択し、[トピック] に「InstanceMgmt」を指定します。
[メッセージ本文] には、この投稿の前のステップで Cloud Functions の関数をテストするのに使用したのと同じ「stop」の JSON メッセージを入力します。必ず <your-project-id> を実際のプロジェクト ID に置き換えてください。
情報をすべて入力したら、[作成] ボタンをクリックして「stop」Cloud Scheduler ジョブを作成します。ジョブの作成が完了すると、たった今作成した「start」と「stop」のジョブを含むジョブリストが表示されます。
お時間をいただきありがとうございました。開発データベースを必要なときにだけ稼働させる、スマートな手順をご理解いただけたでしょうか。ここで設定したきわめてコスト効率の高い Cloud SQL インスタンスを、今後のプロジェクト開発にお役立てください。お疲れさまでした。
次のステップ
Cloud Console を使用して Cloud SQL インスタンスの現在の状態を確認し、さらにインスタンスを作成します。
-Google Cloud デベロッパー プログラム エンジニア Jonathan Simon