Edited at

Cloud Scheduler + Cloud Pub/Sub + Cloud Functions でGCEのインスタンスの自動起動or停止させてみた


経緯

これまでGAEのcronでGCEのインスタンスの自動起動、停止させてたけど、Cloud Scheduler出たからそちらで自動起動、停止の管理できないかと思ってやってみた。


システム構成

すごい単純

system.png


構築手順


1. Pub/SubのTopic作成

GCPのコンソールからPub/Subの画面を開いて、switcherという名のtopicを作成します。

pubsub.png


2. Cloud Functionsの作成

uu4k/compute-instances-switcher

インスタンスの起動、停止を行うFunctionの作成を行います。

今回はCloud Shellからのデプロイを行います。


  1. コンソールからCloud Shellを起動

  2. githubからリポジトリをcloneしてきてデプロイ


deploy.sh

git clone https://github.com/uu4k/compute-instances-switcher

cd compute-instances-switcher
./deploy.sh
# APIが有効になってないと有効にするか効かれるのでyを入力
# 2分くらい経てばデプロイ完了

cloudshell.png


compute-instances-switcherの解説

compute-instances-switcherはPub/Subからインスタンスの起動or停止の情報と対象インスタンスの名前(ワイルドカード可)をjsonで受け取り、インスタンスの起動or停止を行います。


pubsub.json

{"switch": "off", "target": "dev-*"}


今回のものはインスタンス名しか指定できませんが、インスタンス一覧の取得APIのフィルターパラメータをカスタマイズすればlabelなど他の情報での対象指定もできるので、このあたりは必要に応じて変えてみてください。


3. Cloud Schedulerの設定


  1. コンソールからCloud Schedulerの画面を開いてCREATE JOBのリンクをクリック

  2. 初回だとリージョン選択してと言われるので日本リージョン選択

  3. JOBの詳細を入力する(下記参照)


  • Name: switch-on(自由)

  • Description: (自由)

  • Frequency: (起動させたいタイミングをCRONのフォーマットで指定)


    • 平日9時の場合は 0 9 * * 1-5



  • Target: Pub/Sub

  • Topic: switcher

  • Payload: {"switch": "on", "target": "dev-*"}


    • switchがonなら起動、offなら停止のためのジョブになる

    • targetはインスタンス名を指定(ワイルドカード可)



scheduler-region.png

scheduler.png


4. 動作確認

Cloud Schedulerの画面から手動実行ができるので、手動実行して対象インスタンスがちゃんと起動or停止するか確認できます。

scheduler3.png

うまくいかない場合は、Cloud Functionsの画面からエラーの発生有無やエラーログの確認ができるので、そちらで原因を調査してみましょう。


あとがき

pythonのAPI Clientの使い方につまった以外は割と簡単にできた。今回の件以外でも簡単な定期実行ジョブにも使えそう。

ただ、Cloud Schedulerの設定変更ができない(毎回削除・作成)のでそのあたりが面倒くさい。

あと、はじめFunctionsを実行するServiceAccoutにcompute.startとかの権限与えないといけないのかなと思ってたけど今回は必要なかった。やりたいことによっては権限エラー出るかもしれないのでそのあたりは確認が必要そう。