GCP 透過 Cloud Scheduler, PubSub 與Cloud Function 定時開關機小記
OS: container with openSUSE Leap 15.1
今天要來實驗透過 Cloud Scheduler 與 Cloud Functions 來進行定時開關機的要求
想法上是如果 GCE 上面有符合的標籤, 就會定時開關機
參考官方的文件
https://cloud.google.com/scheduler/docs/start-and-stop-compute-engine-instances-on-a-schedule#gcloud
以及 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
--trigger-topic 觸發條件類型 Cloud Pub/Sub, 主題(topic) 爲 start-instance-event
使用 nodejs10, node.js 在
--allow-unauthenticated 有設定 IAM policy binding, 設定 allUsers 可以呼叫
--region, cloud function 的 Region 有特定地區 https://cloud.google.com/functions/docs/locations , 為了管理方便, 也可以指定
# 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
沒有留言:
張貼留言