1
/
5

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

はじめに

当記事は以下からの転載記事となります。

Cloud Functions/Cloud Scheduler/Cloud Pub Subを使って、Google Compute Engineインスタンスの起動停止の自動化を行う - Tanabebe Blog Environment
弊社では Google Cloud Platform(以降 GCP)のGCE上に社内向けのアウトプット場所としてknowledgeという OSSを使用しているのですが、実際にフル稼働させてみるとそれなりに金額がかかっていました。 そこで、 明らかに使っていない時間にはインスタンスを止めて金額を抑えよう という結論に至ったので、どのように解決したかを書いてみようと思います。 information-knowledge.support-project.org メンバーがKnowledgeに触らない(はず)の課
https://tanabebe.hatenablog.com/entry/2019/07/06/004154

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

Knowledgeについてはこちら

Knowledge - オープンソースのナレッジベース
Knowledgeはオープンソースのナレッジベースです。無料で利用できます。社内イントラネットでの情報の共有にご利用ください。
https://information-knowledge.support-project.org/ja/

今回実施すること

  • メンバーが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を作る時はこんな画面になります。

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

uu4k/compute-instances-switcher
You can't perform that action at this time. You signed in with another tab or window. You signed out in another tab or window. Reload to refresh your session. Reload to refresh your session.
https://github.com/uu4k/compute-instances-switcher

早速、中身を見てみます。
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
4 Likes
4 Likes

GCP

Weekly ranking

Show other rankings