星期四, 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

星期日, 5月 24, 2020

gcloud topic filters 小記

gcloud topic filters 小記

在使用 gcloud 指令的時候, 如果列出的輸出太多, 有時候就需要過濾出自己想要的資訊
但是在過濾的時候, 過濾的語法方式之前覺得不是很直觀
所以就紀錄一下, 以免自己忘記

大部分自已過濾的方式都是用關鍵字或是正規化表示式來過濾
所以要研究如何套用

要套用相關過濾方式, 要先參考 gcloud topic resource-keys

首先要觀察相關資訊, 這邊以 gcloud compute images list 為例

# gcloud  compute  images  list

NAME                                                  PROJECT            FAMILY                            DEPRECATED  STATUS
centos-6-v20200521                                    centos-cloud       centos-6                                      READY
centos-7-v20200521                                    centos-cloud       centos-7                                      READY
centos-8-v20200521                                    centos-cloud       centos-8                                      READY
coreos-alpha-2514-0-0-v20200520                       coreos-cloud       coreos-alpha                                  READY

預設會列出 standard images , 但是輸出的量比較多, 有將近 80 個 images
按照官方文件的方式, 先調整輸出的格式

# gcloud  compute  images  list  --format=flattened 

---
archiveSizeBytes:      20676277248
creationTimestamp:     2020-05-21T14:53:32.931-07:00
description:           CentOS, CentOS, 6, x86_64 built on 20200521
diskSizeGb:            20
family:                centos-6
id:                    856342087848380083
kind:                  compute#image
labelFingerprint:      42WmSpB8rSM=
licenseCodes[0]:       1000206
licenses[0]:           https://www.googleapis.com/compute/v1/projects/centos-cloud/global/licenses/centos-6
name:                  centos-6-v20200521
rawDisk.containerType: TAR
rawDisk.source:        
selfLink:              https://www.googleapis.com/compute/v1/projects/centos-cloud/global/images/centos-6-v20200521
sourceType:            RAW
status:                READY
storageLocations[0]:   asia
storageLocations[1]:   eu

  • 這樣就可以很清楚的觀察相關資訊
    • 左邊是 key, 右邊是 value

所以我如果要列出 SLES 相關 images 該如何呢?

# gcloud  compute  images list  --filter  "name ~ sles"

NAME                       PROJECT         FAMILY           DEPRECATED  STATUS
sles-12-sp5-v20200227      suse-cloud      sles-12                      READY
sles-15-sp1-v20200415      suse-cloud      sles-15                      READY
sles-12-sp2-sap-v20191127  suse-sap-cloud  sles-12-sp2-sap              READY
sles-12-sp3-sap-v20191113  suse-sap-cloud  sles-12-sp3-sap              READY
sles-12-sp4-sap-v20191113  suse-sap-cloud  sles-12-sp4-sap              READY
sles-12-sp5-sap-v20200227  suse-sap-cloud  sles-12-sp5-sap              READY
sles-15-sap-v20191116      suse-sap-cloud  sles-15-sap                  READY
sles-15-sp1-sap-v20200415  suse-sap-cloud  sles-15-sp1-sap              READY

  • name 是key
  • ~ 代表後面要用正規表示式
  • sles 是要過濾的 value

另外也可以使用 --format 來決定要輸出的欄位, 如果只想列出 NAME, FAMILY, STATUS

# gcloud  compute  images  list  --filter  "name ~ sles"  --format  "table(NAME,FAMILY,STATUS)"

NAME                       FAMILY           STATUS
sles-12-sp5-v20200227      sles-12          READY
sles-15-sp1-v20200415      sles-15          READY
sles-12-sp2-sap-v20191127  sles-12-sp2-sap  READY
sles-12-sp3-sap-v20191113  sles-12-sp3-sap  READY
sles-12-sp4-sap-v20191113  sles-12-sp4-sap  READY
sles-12-sp5-sap-v20200227  sles-12-sp5-sap  READY
sles-15-sap-v20191116      sles-15-sap      READY
sles-15-sp1-sap-v20200415  sles-15-sp1-sap  READY

  • 這樣格式輸入的方式在 GCE 也很好用, 例如只要列出 GCE 名稱, 還有內部與外部 IP


寫了這一篇, 以後過濾 GCP 的訊息輸出就更方便了

~ enjoy it

Reference

星期六, 5月 23, 2020

Verizon CDN in Azure 小記

Verizon CDN in Azure 小記

Azure 的 CDN 有下列幾個選擇

今天來測試 Verizon CDN in Azure, 那就來進行相關設定吧

先登入 Azure Portal

先檢查訂用帳戶內的 Service Provider 有沒有啟用 Microsoft.Cdn

點選 訂用帳戶
點選 自己的訂用帳戶
點選 資源提供者 
可以篩選 Cdn, 找出 Microsoft.Cdn
確認狀態是 Registered, 如果沒有, 就點選上方的重新註冊



接下來建立 CDN Profile

點選 Portal 上面的建立資源
點選 Web
點選 CDN


進行相關設定
輸入名稱
選擇資源群組與位置
選擇定價層
點選 確定


接下來建立端點
在所有服務搜尋 CDN 設定檔
點選剛剛建立的 CDN 設定檔
點選端點



輸入端點名稱
選擇來源類型: 自訂來源
輸入來源主機名稱(源站 Original)
點選 新增

  • 端點名稱可以想成 AWS 分佈的 domain name

確認端點已經建立


接下來建立自訂網域 (CNAME)

Azure 要加入自訂網域的時候, 要進行 DNS 驗證
如果我們要使用的 CNAME 是  image.sakana.tw
那就要建立一個 CNAME 如下


  • cdnverify.YOURCNAME 指向 cdnverify.CDN_端點
  • 就是 cdnverify.image.sakana.tw 指向 cdnverify.test20200513.azureedge.net
  • Azure 在建立的時候就會進行驗證, 這個部分與 AWS or Cloudflare 不同, 所以要先把 DNS record 準備好

當然, 除了驗證的 DNS 紀錄以外, 也要把正宮的 DNS 準備好



點選剛剛建立的端點
點選 自訂網域


輸入自訂主機名稱
  • 如果 CNAME 沒有設定好, 就會檢查不過
點選新增



因為之後要使用 https 方式來進行 CDN
所以要進行一些前置處理

在所有服務, 搜尋 Key (正確是 KeyVault)
找到金鑰保存庫 (KeyVault)
點選 金鑰保存庫


點選 新增



選取資源群組
輸入金鑰保存庫名稱
選取區域
選取定價層
點選 檢閱+建立



驗證成功後
點選 建立


可以確認金鑰保存庫已經建立


接下來要把自己網域的憑證放進來
點選剛剛建立的金鑰保存庫
點選 憑證


點選 產生/匯入


選擇憑證建立方法: 匯入
輸入憑證名稱
上傳憑證檔案
  • 這邊我參考網路上找到的轉檔方式將 sslforfree 下載的檔案轉成 xxxxx.pfx
  • 微軟只吃兩種格式 .pfx / .pem


點選建立

確認憑證已經上傳完成並啟用



等等還要設定存取原則

先回到剛剛設定的 CDN 端點
點選剛剛建立的端點


點選剛剛建立的自訂網域



將自訂網域HTTPS 切換為 開啟


選取 使用我自己的憑證


  • 上面有提到要透過 Cloudshell 將 Azure CDN 註冊爲應用程式
  • 存取原則要給 Microsoft.Azure.Cdn 服務 get-secret 權限

所以就來開個 Cloud Shell 了, 並切換成 PowerShell 模式
將上面的指令貼到 Cloud Shell 內去執行


處理完註冊應用程式, 再來處理存取原則

回到 金鑰保存庫
點選剛剛建立的金鑰保存庫



點選 存取原則


點選 新增存取原則


選取主體: 使用輸入或是搜尋的方式, 設定為 Microsoft.Azure.Cdn
點選 新增


點選 儲存


再次嘗試啟用 HTTPS

回到剛剛設定的 CDN 端點
點選剛剛建立的端點


點選剛剛建立的自訂網域



將自訂網域HTTPS 切換為 開啟


選取 使用我自己的憑證
選取 金鑰保存庫



點選 儲存


進行相關佈署


  • 匯入憑證大概要 15 mins
  • 佈建憑證上面寫說要 6 小時, 所以就可以先去做別的事情了 :p

設定完成畫面如下


接下來就來進行測試

參考之前的文章

現在 伺服器上面放圖片

然後使用 curl 指令或是瀏覽器測試

一開始的存取行為是看到直接跟 nginx 存取

> curl  -I   https://image.sakana.tw/openSUSE2.png

HTTP/2 200 
accept-ranges: bytes
content-type: image/png
date: Sat, 23 May 2020 07:16:03 GMT
etag: "5b08704b-a755"
last-modified: Fri, 25 May 2018 20:21:31 GMT
server: nginx/1.14.2
content-length: 42837


之後就是 CDN 上場了

> curl -I  https://image.sakana.tw/openSUSE2.png

HTTP/2 200 
accept-ranges: bytes
age: 50
content-type: image/png
date: Sat, 23 May 2020 07:19:32 GMT
etag: "5b08704b-a755"
last-modified: Fri, 25 May 2018 20:21:31 GMT
server: ECAcc (tpe/688B)
x-cache: HIT
content-length: 42837



接下來就是找時間測試 Verizon 的 Rule Engine v4 了

~ enjoy it


Reference