はじめに
当記事は以下からの転載記事となります。
弊社ではGoogle Cloud Platform(以降GCP)のGCE上に社内向けのアウトプット場所としてknowledgeというOSSを使用しているのですが、実際にフル稼働させてみるとそれなりに金額がかかっていました。
そこで、明らかに使っていない時間にはインスタンスを止めて金額を抑えようという結論に至ったので、どのように解決したかを書いてみようと思います。
Knowledgeについてはこちら
今回実施すること
- メンバーがKnowledgeに触らない(はず)の課金は抑える
- せっかくなのでGCP内のサービスで完結させる
- 24:00になったらインスタンスを停止
- 07:00になったらインスタンスの起動
全体の流れ
- Cloud SchedulerからCloud Pub Subを介してCloud Functionsをキックする。
- キックされたCloud Functionsが対象インスタンスの起動停止を行う。
こんな所ですね。
対象のインスタンスが存在している前提で早速やっていきます。
1. Cloud Functionsを作成する
早速Googleさんに習ってCloud Functionsを作成していきます。Cloud Functionsを作る時はこんな画面になります。
ですが、早速問題が…
流れの通り、「Cloud Scheduler→Cloud Pub/Sub→Cloud Functions」なのでCloud Functions内でインスタンス起動と停止を担うプログラム が必要でした(そりゃそうだ)
これは選択肢として 「無いので作ってしまう or 既にあるモノを使う」ですね。
同じ悩みを抱えてる方はいると思っていたので、取り急ぎ既にあるモノを探しました。
探してみたところ、こちらで解決出来そうです。
早速、中身を見てみます。
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分待ってくれと言われるので作成されるまで待ちます。
無事作成されました!
2. Cloud Pub/Subのトピックを作成する
既にプロジェクトにswitcher
が作成されているのでトピックの作成を行い
対象のトピックIDを指定して作成するだけなので、簡単ですね。
3. Cloud Schedulerを作成する
まずは起動する時間をcron方式で指定して、インスタンス停止用のCloud Schedulerを作成します。
次にインスタンス起動用のCloud Schedulerを作成します。
これでインスタンス停止用と起動用のCloud Schedulerが作成されました。
あとは実際に動くかどうかを確認しておきます。
「今すぐ実行」をクリックし、停止用と起動用のCloud Schedulerを手動実行します。
停止用から確認します。対象のインスタンスは以下の通り、正常に停止してくれました。
あとは起動さえ確認出来ればOKですね。
最後にインスタンス起動用のCloud Schedulerを確認します。
こちらも以下の通り、正常に起動してくれました。
所感
全体的にAzureで言うとこれという点も多かったので思ったよりスムーズに進めることが出来ました。
いずれはGoなどを使用してCloud Functionsを作成したいですね。
途中でCloud Schedulerを実施した際、GCP上からの権限が無効になっていたので、ここに気付くまで以外と時間がかかってしまいました。既に実施してから6日ほど経っていますが、以前より金額もおさえられている事が確認出来ました。目標達成。
Pub/Subについてはまだ深掘りする余地がたくさんあるので今後も勉強していきたいと思います。
参考
miracleave株式会社's job postings