どうもKuboです。
本日は、GCP(GoogleCloudPlatform)でGCE(Google Compute Engine)のインスタンスを時刻起動/停止することで無駄な課金を減らす方法を紹介します。
概要
今回は、以下の Google Cloud Platform コンポーネントを使用します。
- Cloud Scheduler
- Cloud Functions
- Cloud Pub/Sub
- Compute Engine
Google Scheduleで定刻にCloud Pub/Subを使ってCloud Functionsを動かしCompute Engine インスタンスを起動し、定刻にインスタンスを停止します。
なぜこの仕組みがいる?
GCPのGCE(Google Compute Engine)は稼働時間で課金されますので使用しない時間帯はインスタンスを停止しておいた方がお得です。
まずは以下の見積もりツールで稼働時間を考慮して見積もってみましょう!

Google Cloud 料金計算ツール
Google Cloud が提供するプロダクトに関して、サーバーの台数、利用状況、処理能力に基づくカスタマイズされた見積もりを作成できます。
事前準備
処理の流れ
次の GCP コンポーネントで構成されています。
- Compute Engine インスタンス: スケジュールに従って実行される Compute Engine インスタンス。
- Cloud Functions 関数: スケジュールに従ってインスタンスを起動および停止する関数。
- Cloud Pub/Sub メッセージ: 起動イベントおよび停止イベントごとに送受信されるメッセージ。
- Cloud Scheduler ジョブ: 設定したスケジュールでインスタンスの起動と停止の呼び出しを行うジョブ。
Cloud Functions
起動の関数を作成する
- GCP Console の 「Cloud Functions」ページに移動します。
「CLOUD FUNCTIONS」 ページに移動 - [関数を作成] をクリックします。
- [名前] を「
startInstancePubSub
」に設定します。 - [割り当てられるメモリ] はデフォルト値のままにします。
- [トリガー] で [
Cloud Pub/Sub
] を選択します。 - [トピック] で [
Create new topic...
] を選択します。 - [新しい pub/sub トピック] ダイアログ ボックスが表示されます。
- [名前] に「
start-instance-event
」と入力します。 - [作成] をクリックしてダイアログ ボックスを閉じます。
- [名前] に「
- [ランタイム] で [
Node.js 6
] を選択します。 - コードテキスト ブロックの上にある [
index.js
] タブを選択します。 - スターター コードを次のコードに置き換えます。
- コードテキスト ブロックの上にある [
package.json
] タブを選択します。 - スターター コードを次のコードに置き換えます。
- [実行する関数] に「
startInstancePubSub
」と入力します。 - [作成] をクリックします。
- GCP Console の 「Cloud Functions」ページに移動します。
停止の関数を作成する
- GCP Console で [Cloud Functions] ページに移動します。
- [関数を作成] をクリックします。
- [名前] を「
stopInstancePubSub
」に設定します。 - [割り当てられるメモリ] はデフォルト値のままにします。
- [トリガー] で [
Cloud Pub/Sub
] を選択します。 - [トピック] で [
Create new topic...
] を選択します。 - [新しい pub/sub トピック] ダイアログ ボックスが表示されます。
- [名前] に「
stop-instance-event
」と入力します。 - [作成] をクリックしてダイアログ ボックスを閉じます。
- [名前] に「
- [ランタイム] で [
Node.js 6
] を選択します。 - コードテキスト ブロックの上にある [
index.js
] タブを選択します。 - スターター コードを次のコードに置き換えます。
- コードテキスト ブロックの上にある [
package.json
] タブを選択します。 - スターター コードを次のコードに置き換えます。
- [実行する関数] に「
stopInstancePubSub
」と入力します。 - [作成] をクリックします。
Cloud Scheduler ジョブを設定する
起動ジョブを作成する
- GCP Console の [Cloud Scheduler] ページに移動します。
[CLOUD SCHEDULER] ページに移動 - [ジョブを作成] をクリックします。
- [名前] を「
startup-workday-instance
」に設定します。 - [頻度] に「
0 9 * * 1-5
」と入力します。 - [タイムゾーン] で、目的の国とタイムゾーンを選択します。この例では
United States
とLos Angeles
を使用します。 - [ターゲット] で [
Pub/Sub
] を選択します。 - [トピック] に「
start-instance-event
」と入力します。 - [ペイロード] に、次のテキストを入力します。
{"zone":"us-west1-b","instance":"workday-instance"}
- [作成] をクリックします。
停止ジョブを作成する
- GCP Console で [Cloud Functions] ページに移動します。
- [ジョブを作成] をクリックします。
- [名前] を「
shutdown-workday-instance
」に設定します。 - [頻度] に「
0 17 * * 1-5
」と入力します。 - [タイムゾーン] で、目的の国とタイムゾーンを選択します。この例では
United States
とLos Angeles
を使用します。 - [ターゲット] で [
Pub/Sub
] を選択します。 - [トピック] に「
stop-instance-event
」と入力します。 - [ペイロード] に、次のテキストを入力します。
{"zone":"us-west1-b","instance":"workday-instance"}
- [作成] をクリックします。
以上で、設定は終わりです。
最後に
如何だったでしょうか?
稼働時間を短縮することでかなりの節約になるので対応してみてください。
Google FunctionsはPythonも対応しているので次回はPythonでの書き方をご紹介したいと思います。