このチュートリアルでは、Cloud Scheduler と Cloud Functions で、リソースラベルを使用して定期的に Compute Engine インスタンスを起動および停止する方法を説明します。
目標
- Cloud Functions で、Compute Engine インスタンスの起動関数と停止関数を作成してデプロイする。
- Cloud Scheduler を使用して一連のジョブを作成し、
dev
リソースラベルを持つインスタンスをスケジュールして、通常の営業時間に一致させるために、月曜日から金曜日の 09:00-17:00 に実行します。
費用
このドキュメントでは、課金対象である次の Google Cloud コンポーネントを使用します。
- Cloud Scheduler
- Cloud Functions
- Pub/Sub
- Compute Engine
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
始める前に
- Cloud Scheduler 用に環境を設定します。
-
Cloud Functions, Pub/Sub, and Compute Engine API を有効にします。
アプリケーション アーキテクチャ
このソリューションでは、次の Google Cloud コンポーネントを使用します。
- スケジュールどおりに実行する Compute Engine インスタンス。
- スケジュールに従ってインスタンスを起動および停止する Cloud Functions。
- 起動イベントおよび停止イベントごとに送受信される Pub/Sub メッセージ。
- スケジュールに従ってインスタンスの起動と停止の呼び出しを行う Cloud Scheduler ジョブ。
ロケーションの要件
一部のコンポーネントは特定のリージョンでのみサポートされています。
- Compute Engine インスタンス: リージョンとゾーンにリストされているすべてのリージョンでサポートされます。
- Cloud Functions: ロケーションにリストされているリージョンでサポートされます。
- Pub/Sub メッセージ: Pub/Sub はグローバル サービスであるため、グローバルでサポートされます。
- Pub/Sub ターゲットを含む Cloud Scheduler ジョブ: すべての Google Cloud のロケーションでサポートされます。
HTTP ではなく Pub/Sub を使用する理由
Pub/Sub トリガーの代わりに Cloud Functions の HTTP トリガーを使用して、このアーキテクチャをシンプルにしたいと考えるかもしれません。
この方法が以前は HTTP を使用するよりも安全であったため、このチュートリアルでは、Cloud Functions のトリガーとして Pub/Sub を使用します。ただし、HTTP も有効な選択肢であり、認証を要求することで保護できるようになりました。
Cloud Functions の保護については、Cloud Functions のセキュリティの概要をご覧ください。HTTP トリガーと Pub/Sub トリガーの比較については、Cloud Functions トリガーのドキュメントをご覧ください。
Compute Engine インスタンスを設定する
Console
- Google Cloud コンソールの [VM インスタンス] ページに移動します。
[VM インスタンス] ページに移動 - [インスタンスを作成] をクリックします。
- [名前] を
dev-instance
に設定します。 - [ラベル] で [ラベルを追加] をクリックします。
- [ラベルを追加] をクリックします。
- [キー] には「
env
」、[値] には「dev
」と入力します。 - [リージョン] で、
us-west1
を選択します。 - [ゾーン] で、[
us-west1-b
] を選択します。 - [保存] をクリックします。
- ページの下部にある [作成] をクリックします。
gcloud
gcloud compute instances create dev-instance \ --network default \ --zone us-west1-b \ --labels=env=dev
Cloud Functions を介して Pub/Sub によってトリガーされる関数をデプロイする
関数を作成してデプロイする
Console
起動の関数を作成する
- Google Cloud コンソールの [Cloud Functions] ページに移動します。
[Cloud Functions] ページに移動 - [関数を作成] をクリックします。
- [関数名] を
startInstancePubSub
に設定します。 - [リージョン] はデフォルト値のままにします。
- [トリガーのタイプ] で、[
Cloud Pub/Sub
] を選択します。 - [Cloud Pub/Sub トピックを選択してください] で、[
Create a topic...
] を選択します。 - [新しい pub/sub トピック] ダイアログ ボックスが表示されます。
- [トピック ID] には「
start-instance-event
」と入力します。 - [トピックを作成] をクリックしてダイアログ ボックスを閉じます。
- [トピック ID] には「
- [トリガー] ボックスの下部にある [保存] をクリックします。
- ページの下部にある [次へ] をクリックします。
- [ランタイム]で [
Node.js 10
]を選択します。 - [エントリ ポイント] に「
startInstancePubSub
」と入力します。 - コードエディタの左側にある [
index.js
] を選択します。 スターター コードを次のコードに置き換えます。
コードエディタの左側にある [
package.json
] を選択します。スターター コードを次のコードに置き換えます。
ページの下部にある [Deploy] をクリックします。
停止の関数を作成する
- Google Cloud コンソールに [Cloud Functions] ページが表示されているはずです。
- [関数の作成] をクリックします。
- [関数名] を
stopInstancePubSub
に設定します。 - [リージョン] はデフォルト値のままにします。
- [割り当てられるメモリ] はデフォルト値のままにします。
- [トリガーのタイプ] で、[
Cloud Pub/Sub
] を選択します。 - [Cloud Pub/Sub トピックを選択してください] で、[
Create a topic...
] を選択します。 - [新しい pub/sub トピック] ダイアログ ボックスが表示されます。
- [トピック ID] には「
stop-instance-event
」と入力します。 - [トピックを作成] をクリックしてダイアログ ボックスを閉じます。
- [トピック ID] には「
- [トリガー] ボックスの下部にある [保存] をクリックします。
- ページの下部にある [次へ] をクリックします。
- [ランタイム]で [
Node.js 10
]を選択します。 - [エントリ ポイント] に「
stopInstancePubSub
」と入力します。 - コードエディタの左側にある [
index.js
] を選択します。 スターター コードを次のコードに置き換えます。
コードエディタの左側にある [
package.json
] を選択します。スターター コードを次のコードに置き換えます。
ページの下部にある [Deploy] をクリックします。
gcloud
Pub/Sub トピックを作成する
gcloud pubsub topics create start-instance-event
gcloud pubsub topics create stop-instance-event
コードを取得
コードをダウンロードします。
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
または、zip 形式のサンプルをダウンロードし、ファイルを抽出してもかまいません。
適切なディレクトリに移動します。
cd nodejs-docs-samples/functions/scheduleinstance/
起動の関数と停止の関数を作成する
nodejs-docs-samples/functions/scheduleinstance/
ディレクトリにいるはずです。
gcloud functions deploy startInstancePubSub \ --trigger-topic start-instance-event \ --runtime nodejs18 \ --allow-unauthenticated
gcloud functions deploy stopInstancePubSub \ --trigger-topic stop-instance-event \ --runtime nodejs18 \ --allow-unauthenticated
(省略可)ファンクションが動作することを確認する
Console
インスタンスを停止する
- Google Cloud コンソールの [Cloud Functions] ページに移動します。
[Cloud Functions] ページに移動 stopInstancePubSub
という名前の関数をクリックします。- 複数のタブ([全般]、[トリガー]、[ソース]、[権限]、[テスト])が表示されます。[テスト] タブをクリックします。
[トリガーとなるイベント] に、次のテキストを入力します。
{"data":"eyJ6b25lIjoidXMtd2VzdDEtYiIsICJsYWJlbCI6ImVudj1kZXYifQo="}
これは、
{"zone":"us-west1-b", "label":"env=dev"}
を base64 でエンコードした文字列です。独自の文字列をエンコードするには、任意のオンライン base64 エンコード ツールを使用してください。
[関数をテスト] ボタンをクリックします。
実行が完了すると、[出力] の下に「
Successfully stopped instance dev-instance
」と表示されます。実行の終了までに最長で 60 秒かかります。代わりに「
error: 'Error: function failed to load.'
」が表示される場合は、関数のデプロイが完了するまで 10 秒ほど待ってから、もう一度お試しください。代わりに「
error: 'Error: function execution attempt timed out.'
」が表示される場合は、次の手順に進んで、インスタンスのシャットダウンに時間がかかっているだけかどうかを確認してください。実行が終了しても何も表示されない場合は、タイムアウトになっただけの可能性もあります。次のステップに進んで、インスタンスのシャットダウンに時間がかかっているだけかどうかを確認してください。
Google Cloud コンソールの [VM インスタンス] ページに移動します。
[VM インスタンス] ページに移動dev-instance
という名前のインスタンスの横に灰色の四角が表示されていることを確認します。これは、停止中であることを示しています。シャットダウンが完了するまでに最長で 30 秒かかります。- 停止が完了していない場合は、ページの上部にある [更新] をクリックしてみてください。
インスタンスを起動する
- Google Cloud コンソールの [Cloud Functions] ページに移動します。
[Cloud Functions] ページに移動 startInstancePubSub
という名前の関数をクリックします。- 複数のタブ([全般]、[トリガー]、[ソース]、[権限]、[テスト])が表示されます。[テスト] タブをクリックします。
[トリガーとなるイベント] に、次のテキストを入力します。
{"data":"eyJ6b25lIjoidXMtd2VzdDEtYiIsICJsYWJlbCI6ImVudj1kZXYifQo="}
- これも
{"zone":"us-west1-b", "label":"env=dev"}
を base64 でエンコードした文字列です。
- これも
[関数をテスト] ボタンをクリックします。
実行が完了すると、[出力] の下に「
Successfully started instance dev-instance
」と表示されます。Google Cloud コンソールの [VM インスタンス] ページに移動します。
[VM インスタンス] ページに移動dev-instance
という名前のインスタンスの名前の横に緑色のチェックマークが表示されていることを確認します。これは実行中であることを湿しています。起動処理が完了するまでに最長で 30 秒かかります。
gcloud
インスタンスを停止する
関数を呼び出してインスタンスを停止します。
gcloud functions call stopInstancePubSub \ --data '{"data":"eyJ6b25lIjoidXMtd2VzdDEtYiIsICJsYWJlbCI6ImVudj1kZXYifQo="}'
これは、
{"zone":"us-west1-b", "label":"env=dev"}
を base64 でエンコードした文字列です。独自の文字列をエンコードするには、任意のツールを使用してください。
base64
コマンドライン ツールを使用する場合の例を次に示します。echo '{"zone":"us-west1-b", "label":"env=dev"}' | base64
eyJ6b25lIjoidXMtd2VzdDEtYiIsICJsYWJlbCI6ImVudj1kZXYifQo=
関数が終了すると、次のように表示されます。
result: Successfully stopped instance dev-instance
実行の終了までに最長で 60 秒かかります。
次のエラーが出力されることがあります。
error: 'Error: function failed to load.`
この場合は、関数のデプロイが完了するまで 10 秒ほど待ってからやり直してください。
次のエラーが出力されることがあります。
error: `Error: function execution attempt timed out.`
この場合は、次のステップに進んで、インスタンスのシャットダウンに時間がかかっているだけかどうかを確認してください。
何も表示されない場合は、関数がタイムアウトになっただけの可能性もあります。 この場合は、次のステップに進んで、インスタンスのシャットダウンに時間がかかっているだけかどうかを確認してください。
インスタンスのステータスが
TERMINATED
であることを確認します。シャットダウンが完了するまでに最長で 30 秒かかります。gcloud compute instances describe dev-instance \ --zone us-west1-b \ | grep status
status: TERMINATED
インスタンスを起動する
関数を呼び出してインスタンスを起動します。
gcloud functions call startInstancePubSub \ --data '{"data":"eyJ6b25lIjoidXMtd2VzdDEtYiIsICJsYWJlbCI6ImVudj1kZXYifQo="}'
- これも
{"zone":"us-west1-b", "label":"env=dev"}
を base64 でエンコードした文字列です。
関数が終了すると、次のように表示されます。
result: Successfully started instance dev-instance
- これも
インスタンスのステータスが
RUNNING
であることを確認します。起動処理が完了するまでに最長で 30 秒かかります。gcloud compute instances describe dev-instance \ --zone us-west1-b \ | grep status
status: RUNNING
Pub/Sub を呼び出すように Cloud Scheduler ジョブを設定する
ジョブを作成する
Console
起動ジョブを作成する
- Google Cloud コンソールの [Cloud Scheduler] ページに移動します。
[Cloud Scheduler] ページに移動 - [ジョブを作成] をクリックします。
- デフォルト リージョンのままにします。
- [名前] を
startup-dev-instances
に設定します。 - [頻度] に「
0 9 * * 1-5
」と入力します。- 毎週平日午前 9 時に実行されます。
- [タイムゾーン] で、目的の国とタイムゾーンを選択します。この例では、
United States
とLos Angeles
を使用します。 - [続行] をクリックします。
- [ターゲット タイプ] で、
Pub/Sub
を選択します。 - トピックのプルダウンから
start-instance-event
を選択します。 - [メッセージ] に次の情報を入力します。
{"zone":"us-west1-b","label":"env=dev"}
- [作成] をクリックします。
停止ジョブを作成する
- Google Cloud コンソールの [Cloud Scheduler] ページに移動します。
- [ジョブを作成] をクリックします。
- [リージョン] はデフォルト値のままにして、ページの下部にある [次へ] をクリックします。
- [名前] を
shutdown-dev-instances
に設定します。 - [頻度] に「
0 17 * * 1-5
」と入力します。- 毎週平日午後 5 時に実行されます。
- [タイムゾーン] で、目的の国とタイムゾーンを選択します。この例では、
United States
とLos Angeles
を使用します。 - [続行] をクリックします。
- [ターゲット タイプ] で、
Pub/Sub
を選択します。 - トピックのプルダウンから
stop-instance-event
を選択します。 - [メッセージ] に次の情報を入力します。
{"zone":"us-west1-b","label":"env=dev"}
- [作成] をクリックします。
gcloud
起動ジョブを作成する
gcloud scheduler jobs create pubsub startup-dev-instances \ --schedule '0 9 * * 1-5' \ --topic start-instance-event \ --message-body '{"zone":"us-west1-b", "label":"env=dev"}' \ --time-zone 'America/Los_Angeles' \ --location us-central1
停止ジョブを作成する
gcloud scheduler jobs create pubsub shutdown-dev-instances \ --schedule '0 17 * * 1-5' \ --topic stop-instance-event \ --message-body '{"zone":"us-west1-b", "label":"env=dev"}' \ --time-zone 'America/Los_Angeles' \ --location us-central1
(省略可)ジョブが動作することを確認する
Console
インスタンスを停止する
- Google Cloud コンソールの [Cloud Scheduler] ページに移動します。
[Cloud Scheduler] ページに移動 shutdown-dev-instances
という名前のジョブで、ページの右端にある [今すぐ実行]ボタンをクリックします。- Google Cloud コンソールの [VM インスタンス] ページに移動します。
[VM インスタンス] ページに移動 dev-instance
という名前のインスタンスの横に灰色の四角が表示されていることを確認します。これは、停止中であることを示しています。シャットダウンが完了するまでに最長で 30 秒かかります。
インスタンスを起動する
- Google Cloud コンソールの [Cloud Scheduler] ページに移動します。
[Cloud Scheduler] ページに移動 startup-dev-instances
という名前のジョブで、ページの右端にある [今すぐ実行]ボタンをクリックします。- Google Cloud コンソールの [VM インスタンス] ページに移動します。
[VM インスタンス] ページに移動 dev-instance
という名前のインスタンスの名前の横に緑色のチェックマークが表示されていることを確認します。これは実行中であることを湿しています。起動処理が完了するまでに最長で 30 秒かかります。
gcloud
インスタンスを停止する
スケジューラ ジョブを実行してインスタンスを停止します。
gcloud beta scheduler jobs run shutdown-dev-instances
インスタンスのステータスが
TERMINATED
であることを確認します。シャットダウンが完了するまでに最長で 30 秒かかります。gcloud compute instances describe dev-instance \ --zone us-west1-b \ | grep status
status: TERMINATED
インスタンスを起動する
スケジューラ ジョブを実行してインスタンスを起動します。
gcloud beta scheduler jobs run startup-dev-instances
インスタンスのステータスが
RUNNING
であることを確認します。起動処理が完了するまでに最長で 30 秒かかります。gcloud compute instances describe dev-instance \ --zone us-west1-b \ | grep status
status: RUNNING
クリーンアップ
チュートリアルが終了したら、作成したリソースをクリーンアップして、割り当ての使用を停止し、課金されないようにできます。次のセクションで、リソースを削除または無効にする方法を説明します。
Cloud Scheduler ジョブの削除
Google Cloud コンソールの [Cloud Scheduler] ページに移動します。
ジョブの横にあるチェックボックスをクリックします。
ページの上部にある [削除] ボタンをクリックして、削除操作を確定します。
Pub/Sub トピックの削除
Google Cloud コンソールの [Pub/Sub] ページに移動します。
トピックの横にあるチェックボックスをクリックします。
ページの上部にある [削除] をクリックして、削除操作を確定します。
Cloud Functions を介してデプロイされた関数を削除する
Google Cloud コンソールの [Cloud Functions] ページに移動します。
関数の横にあるチェックボックスをクリックします。
ページの上部にある [削除] ボタンをクリックして、削除操作を確定します。
Compute Engine インスタンスの削除
Compute Engine インスタンスを削除するには:
- Google Cloud コンソールで、[VM インスタンス] ページに移動します。
- 削除するインスタンスのチェックボックスを選択します。
- インスタンスを削除するには、 [その他の操作] をクリックし、[削除] をクリックしてから、指示に沿って操作します。
プロジェクトの削除
課金をなくす最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。
プロジェクトを削除するには:
- Google Cloud コンソールで、[リソースの管理] ページに移動します。
- プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
- ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。
次のステップ
- Google Cloud に関するリファレンス アーキテクチャ、図、ベスト プラクティスを確認する。Cloud Architecture Center をご覧ください。