星期四, 5月 28, 2020

GCP 透過 Cloud Scheduler, PubSub 與Cloud Function 定時開關機小記

GCP 透過 Cloud Scheduler, PubSub 與Cloud Function 定時開關機小記


OS: container with openSUSE Leap 15.1



今天要來實驗透過 Cloud Scheduler 與 Cloud Functions 來進行定時開關機的要求

想法上是如果 GCE 上面有符合的標籤, 就會定時開關機


參考官方的文件

以及 ikala browny 的文件





首先建立 GCE


首先建立一個 GCE 然後指定 Label “env=0900_1900”


可以參考官方的指令 建立 GCE

#gcloud compute instances create test20200526   --network  default   --zone  asia-east1-b --project  YOUR_PROJECT


然後如果原來的 GCE 沒有 Label, 可以使用指令加上去

# gcloud  compute  instances  add-labels  test20200526 --zone  asia-east1-b --labels  env=0900_1900  --project  YOUR_PROJECT


建立 Pub/Sub


接下來建立 2 個 pubsub  的 topic

  • 啟動 GCE 的 topic “start-instance-event”

  • 停止 GCE 的 topic “stop-instance-event”


# gcloud  pubsub  topics create  start-instance-event  --project  YOUR_PROJECT


# gcloud  pubsub  topics create  stop-instance-event  --project  YOUR_PROJECT


下載 Google 的範例程式


# git  clone  https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git


進入範例目錄

# cd   nodejs-docs-samples/functions/scheduleinstance/


觀察相關資訊

# ls


README.md  index.js  package.json  test


  • 可以看一下 index.js 裡面的內容有關於等等要建立的 cloud function

  • package.json 裡面就有對 node 版本與其他的要求


佈署 cloud function


# gcloud  functions deploy  startInstancePubSub  --trigger-topic  start-instance-event  --runtime  nodejs10  --allow-unauthenticated  --region  asia-east2  --project  YOUR_PROJECT


 

# gcloud  functions deploy  stopInstancePubSub  --trigger-topic  stop-instance-event  --runtime  nodejs10  --allow-unauthenticated  --region  asia-east2  --project  YOUR_PROJECT


驗證 Cloud function 有作用

我們的設定是 Label env=0900_1900 的GCE 要進行定時開關機

所以條件就是 '{"zone":"asia-east1-b", "label":"env:0900_1900"}'

在 cloud function 內要經由 base64 編碼, 使用 echo 搭配 base64 指令完成編碼轉換


# echo  '{"zone":"asia-east1-b", "label":"env:0900_1900"}' | base64


eyJ6b25lIjoiYXNpYS1lYXN0MS1iIiwgImxhYmVsIjoiZW52OjA5MDBfMTkwMCJ9Cg==


呼叫 cloud function 測試

# gcloud functions call stopInstancePubSub     --data '{"data":"eyJ6b25lIjoiYXNpYS1lYXN0MS1iIiwgImxhYmVsIjoiZW52OjA5MDBfMTkwMCJ9Cg=="}' --region asia-east2 --project YOUR_PROJECT


觀察 GCE 狀況




測試另外一個啟動的 function

# gcloud functions call startInstancePubSub     --data '{"data":"eyJ6b25lIjoiYXNpYS1lYXN0MS1iIiwgImxhYmVsIjoiZW52OjA5MDBfMTkwMCJ9Cg=="}' --region asia-east2 --project YOUR_PROJECT






可以利用之前 cloudFunction_list_iam_policy.sh -- 檢查是否有設定 iam policy binding


最後建立 Cloud scheduler 的 Job



# gcloud  beta  scheduler  jobs  create  pubsub  stop-workday-instance-0900_1900  --schedule  '0 19 * * 1-5'  --topic  projects/YOUR_PROJECT/topics/stop-instance-event  --message-body  '{ "zone":"asia-east1-b","label":"env=0900_1900" }'  --time-zone  'Asia/Taipei'  --project  YOUR_PROJECT



# gcloud  beta  scheduler  jobs  create  pubsub  start-workday-instance-0900_1900  --schedule '0 9 * * 1-5'  --topic  projects/YOUR_PROJECT/topics/start-instance-event  --message-body  '{ "zone":"asia-east1-b","label":"env=0900_1900" }'  --time-zone  'Asia/Taipei'  --project  YOUR_PROJECT


  • --topic 完整的把id打出來, 因為 --project 不會幫忙帶入


確認 Cloud Scheduler job 是否有效


# gcloud  beta  scheduler  jobs  run  stop-workday-instance-0900_1900  --project   YOUR_PROJECT


# gcloud  beta  scheduler  jobs  run  start-workday-instance-0900_1900  --project   YOUR_PROJECT


接下來只要 GCE 的 Label 符合我們的條件, 就會在 9:00 開機, 19:00 關機了 :)


~ enjoy it


Reference

沒有留言: