経緯
これまでGAEのcronでGCEのインスタンスの自動起動、停止させてたけど、Cloud Scheduler出たからそちらで自動起動、停止の管理できないかと思ってやってみた。
システム構成
すごい単純
構築手順
1. Pub/SubのTopic作成
GCPのコンソールからPub/Subの画面を開いて、switcherという名のtopicを作成します。
2. Cloud Functionsの作成
uu4k/compute-instances-switcher
インスタンスの起動、停止を行うFunctionの作成を行います。
今回はCloud Shellからのデプロイを行います。
- コンソールからCloud Shellを起動
- githubからリポジトリをcloneしてきてデプロイ
git clone https://github.com/uu4k/compute-instances-switcher
cd compute-instances-switcher
./deploy.sh
# APIが有効になってないと有効にするか効かれるのでyを入力
# 2分くらい経てばデプロイ完了
compute-instances-switcherの解説
compute-instances-switcherはPub/Subからインスタンスの起動or停止の情報と対象インスタンスの名前(ワイルドカード可)をjsonで受け取り、インスタンスの起動or停止を行います。
{"switch": "off", "target": "dev-*"}
今回のものはインスタンス名しか指定できませんが、インスタンス一覧の取得APIのフィルターパラメータをカスタマイズすればlabelなど他の情報での対象指定もできるので、このあたりは必要に応じて変えてみてください。
3. Cloud Schedulerの設定
- コンソールからCloud Schedulerの画面を開いてCREATE JOBのリンクをクリック
- 初回だとリージョン選択してと言われるので日本リージョン選択
- JOBの詳細を入力する(下記参照)
- Name: switch-on(自由)
- Description: (自由)
- Frequency: (起動させたいタイミングをCRONのフォーマットで指定)
- 平日9時の場合は
0 9 * * 1-5
- 平日9時の場合は
- Target: Pub/Sub
- Topic: switcher
- Payload:
{"switch": "on", "target": "dev-*"}
- switchがonなら起動、offなら停止のためのジョブになる
- targetはインスタンス名を指定(ワイルドカード可)
4. 動作確認
Cloud Schedulerの画面から手動実行ができるので、手動実行して対象インスタンスがちゃんと起動or停止するか確認できます。
うまくいかない場合は、Cloud Functionsの画面からエラーの発生有無やエラーログの確認ができるので、そちらで原因を調査してみましょう。
あとがき
pythonのAPI Clientの使い方につまった以外は割と簡単にできた。今回の件以外でも簡単な定期実行ジョブにも使えそう。
ただ、Cloud Schedulerの設定変更ができない(毎回削除・作成)のでそのあたりが面倒くさい。
あと、はじめFunctionsを実行するServiceAccoutにcompute.startとかの権限与えないといけないのかなと思ってたけど今回は必要なかった。やりたいことによっては権限エラー出るかもしれないのでそのあたりは確認が必要そう。