[GCP]プリエンプティブ仮想マシンを24/365 99.9%の稼働率にする

もっと簡単な方法があるので続編をお待ちください

1.プリエンプティブ仮想マシンとは?

プリエンプティブ仮想マシンはAWSでいうところのスポットインスタンスにあたります公式には最大80%offとのこと。実運用だと通常の1/3あたり値引かれます。
プリエンプティブの欠点は最大利用が24時間のみ。ただし、以下の通り抜け道があります


プリエンプティブ インスタンスの 24 時間カウンタは、特定のアクションによってリセットされます。具体的には、インスタンスを停止して開始すると、インスタンスが TERMINATED 状態に移行するため、Compute Engine がカウンタをリセットします。


今回はその抜け道を通り、schedulerでSTOP、STARTを繰り返して24時間を超えて利用します。
本番で利用する場合、インスタンスグループを組んで普通のVMも混ぜないと死ねます。schedulerの時間を微妙にずらし、必ず監視を組まないとやばめ。また、注意が必要なのが24時間未満でプリエンプティブ仮想マシンが強制的に落ちる場合があります。

参考: https://cloud.google.com/compute/docs/instances/preemptible?hl=ja

2.事前準備

instanceを立てる
instanceにlabelをつける
ここではプロジェクト名をrui998、東京リージョンにinstance-1というインスタンスを立て、ラベルにservername=instance-1を設定
cloudfunctions APIを有効にする(コンソールの APIとサービス で有効化


以下のコマンドは全てcloud shellで実行

3.pubsubを作成

gcloud pubsub topics create start-instance-event
gcloud pubsub topics create stop-instance-event

4.cloud functionsを作成

sudo -s
cd /usr/local/src/
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
cd nodejs-docs-samples/functions/scheduleinstance/
gcloud functions deploy stopInstancePubSub --trigger-topic stop-instance-event --runtime nodejs8 --project rui998
gcloud functions deploy startInstancePubSub --trigger-topic start-instance-event --runtime nodejs8 --project rui998
echo '{"zone":"asia-northeast1-b", "instance":"instance-1", "label":"servername=instance-1"}' | base64
#↑の返値を↓のdataにぶち込み動作確認
gcloud functions call stopInstancePubSub --project rui998 --data '{"data":"eyJ6b25lIjoiYXNpYS1ub3J0aGVhc3QxLWIiLCAiaW5zdGFuY2UiOiJpbnN0YW5jZS0xIiwgImxhYmVsIjoic2VydmVybmFtZT1pbnN0YW5jZS0xIn0K"}'

5.schedulerに登録

#ここにきてproject idの登録を求められる
gcloud config set project rui998
#とりあえず6時間起きの06分にスタートを実行するようにする
gcloud beta scheduler jobs create pubsub startup-dev-instances \
  --schedule '4 */6 * * *' \
  --topic start-instance-event \
  --message-body '{"zone":"asia-northeast1-b", "instance":"instance-1", "label":"servername=instance-1"}' \
  --time-zone 'Asia/Tokyo'
#cloudschedulerのAPIの有効化を聞かれるのでYes
#App Engineのロケーションを聞かれるので 2 を入力

#6時間起きの02分にシャットダウンを実行するようにする
gcloud beta scheduler jobs create pubsub shutdown-dev-instances \
  --schedule '2 */6 * * *' \
  --topic stop-instance-event \
  --message-body '{"zone":"asia-northeast1-b", "instance":"instance-1", "label":"servername=instance-1"}' \
  --time-zone 'Asia/Tokyo'

6.参考にしたもの

https://cloud.google.com/scheduler/docs/start-and-stop-compute-engine-instances-on-a-schedule
↑このドキュメント、日本語バージョンは翻訳が追い付いてないため、英語のドキュメントをみてください。
※日本語のドキュメントみて完走したけど最後に英語を見て萎えましたw




この記事が気に入ったら、サポートをしてみませんか?気軽にクリエイターを支援できます。

インフラエンジニア。AWS,GCP,Azureを利用。もちろんオンプレも好き。本業の傍ら個人事業主で副業しています。取り上げてほしい内容、ご連絡などありましたらtwitterまで https://twitter.com/rui9981
コメントを投稿するには、 ログイン または 会員登録 をする必要があります。