Cloud Functions/Cloud Scheduler/Cloud Pub Subを使って、Google Compute Engineインスタンスの起動停止の自動化を行う

弊社ではGoogle Cloud Platform(以降GCP)のGCE上に社内向けのアウトプット場所としてknowledgeというOSSを使用しているのですが、実際にフル稼働させてみるとそれなりに金額がかかっていました。
そこで、明らかに使っていない時間にはインスタンスを止めて金額を抑えようという結論に至ったので、どのように解決したかを書いてみようと思います。

Knowledgeについてはこちら

information-knowledge.support-project.org

今回実施すること

  • メンバーがKnowledgeに触らない(はず)の課金は抑える
  • せっかくなのでGCP内のサービスで完結させる
  • 24:00になったらインスタンスを停止
  • 07:00になったらインスタンスの起動

全体の流れ

  1. Cloud SchedulerからCloud Pub Subを介してCloud Functionsをキックする。
  2. キックされたCloud Functionsが対象インスタンスの起動停止を行う。

こんな所ですね。
対象のインスタンスが存在している前提で早速やっていきます。

1. Cloud Functionsを作成する

早速Googleさんに習ってCloud Functionsを作成していきます。
Cloud Functionsを作る時はこんな画面になります。

functions

ですが、早速問題が…
流れの通り、「Cloud Scheduler→Cloud Pub/Sub→Cloud Functions」なので
Cloud Functions内でインスタンス起動と停止を担うプログラム が必要でした(そりゃそうだ)
これは選択肢として 「無いので作ってしまう or 既にあるモノを使う」ですね。
同じ悩みを抱えてる方はいると思っていたので、取り急ぎ既にあるモノを探しました。
探してみたところ、こちらで解決出来そうです。 github.com

早速、中身を見てみます。
main.pyに以下の記述がありました。

switch = payload['switch']
target = payload['target']

また、deploy.shにはtrigger-topic "switcher"と書かれています。
一通りソースを眺めたところ Cloud Scheduler(最後に出てきます) 作成時のトピックをswitcherとし、ペイロードに以下を渡す事で解決出来ると判断しました。

{"switch": "[onかoff]", "target": "[インスタンス名を指定]"}

少し寄り道しましたが、Cloud Functionsを作成する流れは変わらないのでGCP上のCloud Shellを使ってデプロイしていきます。

# 作成するCloud Functionsをcloneしていきます
$ git clone https://github.com/uu4k/compute-instances-switcher
# clone出来たら対象プロジェクトに移動
$ cd compute-instances-switcher/
# デプロイしていきます。私はregion指定して実施しました
$ gcloud functions deploy switch_compute_instances --region "asia-northeast1" --runtime python37 --trigger-top
ic "switcher"

2分待ってくれと言われるので作成されるまで待ちます。
無事作成されました!

f:id:tanabebe:20190705231032p:plain

2. Cloud Pub/Subのトピックを作成する

既にプロジェクトにswitcherが作成されているのでトピックの作成を行います。

f:id:tanabebe:20190705231745p:plain

対象のトピックIDを指定して作成するだけなので、簡単ですね。

3. Cloud Schedulerを作成する

まずは起動する時間をcron方式で指定して、インスタンス停止用のCloud Schedulerを作成します。

f:id:tanabebe:20190705235337p:plain

次にインスタンス起動用のCloud Schedulerを作成します。 f:id:tanabebe:20190706000036p:plain

これでインスタンス停止用と起動用のCloud Schedulerが作成されました。
あとは実際に動くかどうかを確認しておきます。
「今すぐ実行」をクリックし、停止用と起動用のCloud Schedulerを手動実行します。
停止用から確認します。対象のインスタンスは以下の通り、正常に停止してくれました。
あとは起動さえ確認出来ればOKですね。

f:id:tanabebe:20190706000547p:plain

最後にインスタンス起動用のCloud Schedulerを確認します。 こちらも以下の通り、正常に起動してくれました。

f:id:tanabebe:20190706000651p:plain

所感

全体的にAzureで言うとこれという点も多かったので思ったよりスムーズに進めることが出来ました。 いずれはGoなどを使用してCloud Functionsを作成したいですね。
途中でCloud Schedulerを実施した際、GCP上からの権限が無効になっていたので、ここに気付くまで以外と時間がかかってしまいました。
既に実施してから6日ほど経っていますが、以前より金額もおさえられている事が確認出来ました。
Pub/Subについてはまだ深掘りする余地がたくさんあるので今後も勉強していきたいと思います。

参考