コンテンツに移動
デベロッパー

開発費用の削減: Cloud SQL インスタンスの起動と停止をスケジュールする

2021年6月4日
https://storage.googleapis.com/gweb-cloudblog-publish/images/BlogHeader_Database_2.max-2600x2600.jpg
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 時までの時間枠内で選択する必要があります。

すべての情報が指定されると、インスタンス作成フォームは以下のように表示されます。

https://storage.googleapis.com/gweb-cloudblog-publish/images/image1-create-cloud-sql-instance.max-1100x1100.jpg

[インスタンスを作成] をクリックして、インスタンスの作成プロセスを完了します。

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 の関数のトリガーに設定します。

すべての値が入力され、[関数を作成] フォームの [設定] セクションが完成すると次のようになります。

https://storage.googleapis.com/gweb-cloudblog-publish/images/image2-create-cloud-function-configuration.max-1100x1100.jpg

[関数を作成] フォームの一番下にある [次へ] ボタンをクリックして、関数を強化するコードを入力する次のステップに移りましょう。

[関数を作成] フォームの [コード] ステップで、[ランタイム] として [Go 1.13] を選択し、コードの [エントリ ポイント] として「ProcessPubSub」と入力します。

次に以下のコードをコピーして、[ソースコード] - [インライン エディタ] のコード セクションに貼り付けます。

読み込んでいます...

[関数を作成] フォームの [コード] セクションが完成すると次のようになります。

https://storage.googleapis.com/gweb-cloudblog-publish/images/image3-create-cloud-function-code.max-1800x1800.jpg

[デプロイ] ボタンをクリックして関数をデプロイします。デプロイ プロセスが完了するまでに 1~2 分かかります。

Cloud Functions の関数に Cloud SQL インスタンスを起動または停止する権限を付与する

次に、Cloud Functions の関数のサービス アカウントに、インスタンスの起動や停止に使用される「パッチ」などの Cloud SQL 管理者メソッドを実行する権限を付与する必要があります。

Cloud Console の IAM セクションに移動し、Cloud Functions で使用される「App Engine デフォルト サービス アカウント」を見つけます。このサービス アカウントのサフィックスは「@appspot.gserviceaccount.com」です。鉛筆アイコンをクリックして編集します。

https://storage.googleapis.com/gweb-cloudblog-publish/images/image4-edit-iam-permissions.max-500x500.jpg

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

https://storage.googleapis.com/gweb-cloudblog-publish/images/image5-edit-iam-permissions-add-role.max-700x700.jpg

Cloud Functions の関数が想定どおりに動作することを確認する

お疲れさまでした。これで、Cloud Functions の関数をテストする準備が整いました。テストを行うには、関数のトリガーとして設定されている Pub/Sub トピックにメッセージを送信します。

まず、インスタンスの停止をテストします。Cloud Console の Pub/Sub セクションに移動し、「InstanceMgmt」トピックを選択します。[メッセージのパブリッシュ] ボタンをクリックし、次の JSON メッセージを貼り付けます(<your-project-id> は実際のプロジェクト ID に置き換えます)。
読み込んでいます...

パブリッシュする Pub/Sub メッセージは次のようになります。

https://storage.googleapis.com/gweb-cloudblog-publish/images/image19-publish-pubsub-message.max-1200x1200.jpg

[公開] ボタンをクリックしてメッセージをパブリッシュすると、Cloud Functions の関数がトリガーされてインスタンスが停止します。Cloud SQL のインスタンスの詳細に戻ると、インスタンスが停止していることがわかります。

https://storage.googleapis.com/gweb-cloudblog-publish/images/image7-instance-details-stopped.max-1200x1200.jpg

次に、別の Pub/Sub メッセージをパブリッシュしてインスタンスを起動します。Cloud Console の Pub/Sub セクションに移動し、「InstanceMgmt」トピックを選択します。[メッセージのパブリッシュ] ボタンをクリックし、次の JSON メッセージを貼り付けます(今回はアクションを「start」にします)。<your-project-id> は実際のプロジェクト ID に置き換えてください。

読み込んでいます...

[公開] ボタンをクリックしてメッセージをパブリッシュすると、Cloud Functions の関数がトリガーされてインスタンスが再起動します。

Cloud SQL のインスタンスの詳細ページに戻ると、2~3 分後にインスタンスが再起動します。

https://storage.googleapis.com/gweb-cloudblog-publish/images/image8-instance-details-started.max-700x700.jpg

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 に置き換えてください。

読み込んでいます...

[ジョブの作成] フォームが完成すると次のようになります。

https://storage.googleapis.com/gweb-cloudblog-publish/images/image9-create-cloud-scheduler-job.max-1000x1000.jpg

情報をすべて入力したら、[作成] ボタンをクリックして「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

投稿先