前幾年聽說甲骨文的 Oracle Cloud 上面有免費額度的機器可以用,最近想說把一些小程式移到上面多一個分流

  • 部分服務有 Always Free 的額度( CPU < 4 & RAM < 24,儲存空間 200GB),免費帳號最多能開兩台虛擬機,沒人知道何時會變更政策。
  • 亞洲在日本、首爾等地有機器,但沒有在台灣。Oracle Cloud regions,聽說台灣連到日本韓國這些速度都不錯。
  • 歐美地區很好搶,幾乎找不到有人寫什麼設定程式自動掛機搶免費VM的教學,反而簡體中文的教學非常多,難道中國人特別愛寫程式、人人都會架站嗎? 聽說都是拿來架 VPN 翻牆科學上網的。

但是因為額度有限,在網頁上選完配備跟 OS 之後按 Create,基本上都會出現容量不足的訊息。

Out of capacity for shape VM.Standard.A1.Flex in availability domain AD-1. Create the instance in a different availability domain or try again later. If you specified a fault domain, try creating the instance without specifying a fault domain. If that doesn’t work, please try again later. Learn more about host capacity.

之前在用 OpenShift 等各種免費服務時被都更怕了, Oracle Cloud 也不時聽到有人常常莫名免費機器被停用,想說都過這麼多年了,應該很少人在搶吧?
結果想搶一台東京區的 VM.Standard.A1.Flex 還是搶不到,能直接從網頁上就選成功? 看來還是不可能的任務,所以需要用程式來搶。試了一下發現網路上有些教學似乎需要補充,也給自己留個紀錄。

在瀏覽器 Console 裡面跑 JS

看到一篇兩年半前的教學,開瀏覽器的 devools,在 console 貼一段 js code,跑 for loop 定時去觸發那顆 Create instance 的按鈕,看起來最簡單。
但是把迴圈裡的 querySelector 拿出來試一下,那個按鈕現在似乎已經被換成其他功能了,執行之後是一個 support 的視窗跳出來。
而且這樣電腦要一直開著,網頁一段時間有時候會被登出,必須要找其他方法。

在 Windows 上面用工作排程器自動執行 Shell Script

參考【教學】Oracle Cloud 用 OCI 官方工具自動掛機搶免費VM – iZO手札 的步驟,安裝 Oracle Cloud Infrastructure (OCI) 的 CLI 套件、產生金鑰、把公鑰貼回去 Oracle Cloud 的 API Key、把主機建立條件的指令組合好,開啟 Windows 的「工作排程器」執行 sh 檔。

可能會遇到兩個問題:
1.原教學的馬賽克打太大,界面跟現在的長得有點不一樣,不知道 User OCID 跟 Tenancy OCID 是要去哪邊複製? 參考官方說明 Oracle Cloud Infrastructure Documentation – Required Keys and OCIDs,User OCID 是在 My Profile 裡面,不是用 Identity domain 裡面的 OCID。Tenancy OCID 就在 Tenancy 裡面。
2.執行 sh 時出現 “cannot be loaded because running scripts is disabled on this system”,參考網路上的說明,在 Powershell 裡面貼指令改權限 Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestricted

但是跑了好幾個小時還是 Out of host capacity,不知道要跑多久,決定丟到線上主機去跑,這樣 24 小時都能搶,長期抗戰。

在 Ubuntu VPS 上面用 crontab 跑 Shell Script

在付費的 VPS 上跑程式,搶免費的主機,這是什麼神奇的思路? 月費是固定的,就當作練身體嘛!
參考甲骨文 Oracle Cloud 無人值守開機器 | jkgtw’s blog,然後再做調整,該文用的是 Debian,我是用 Ubuntu,可能因為如此導致一些操作不太一樣。

1.一樣安裝 OCI 套件 bash -c "$(curl -L https://raw.githubusercontent.com/oracle/oci-cli/master/scripts/install/install.sh)",沒有特別改安裝設定,就這樣裝下去。
2.裝好之後檢查版本 oci -v
3.一樣進行 oci setup config的設定,把 User OCID 跟 Tenancy OCID 那些貼上去。
4.用 cat (concatenate)指令 cat /(XXXXXXXX)_api_key_public.pem,把剛剛建好的金鑰檔案內容顯示在 Console。
5.把 Console 顯示的金鑰貼回去 Oracle Cloud 網頁上的 API Key 設定區。
6.執行一下 oci iam availability-domain list 看看能不能正常跑出 data:{compartment-id:’xxx’, id:’xxx’, name: ‘xxx’}。
7.開編輯器建立一個檔名叫 ociauto.sh 的檔案 nano ociauto.sh,剛剛 Windows 步驟組好的 sh 檔案基本上可以搬過來用,可以直接執行指令看看能不能得到 Out of host capacity 的結果。
8.把權限開給 shell script chmod +x ociauto.sh
9.開啟排程程式編輯器 crontab -e
10.間隔 10 分鐘跑一次,把執行結果存在 log 檔 */10 * * * * /bin/bash ociauto.sh > /home/ociauto.log 2>&1,存檔退出編輯區。
11.查看 log 檔的結尾內容 tail -F /home/ociauto.log,應該會出現 Out of host capacity 或 LimitExceeded 或 “Too many requests for the user 的訊息。
12.瀏覽 Oracle Cloud 的 dashboard,看有沒有多出新的機器。

這邊會遇到幾個奇怪問題
1.步驟 5 的 Oracle Cloud 網頁應該是有改版,多了一行 Paste the contents of the text box into your ~/.oci/config file. 的提示,但是用 nano 指令把檔案叫出來看,key_file=在中間其中一行,已經自動設好了,反而只有在 Windows 要自己補上去。
2.步驟跟 OCID 應該都沒錯,但第6步驟都是 401 error,重做超多遍(順便學了 rm 指令怎麼用),最後想說照指示跑一遍 oci iam availability-domain list --debug 看詳細的錯誤訊息? 結果突然一切又都正常了。
3.排程設定失敗,步驟 11 的 tail 都找不到檔案。
4.步驟 6&7 可以正常執行,排程有執行,但是 tail 裡面只有 oci: command not found 的錯誤訊息
先用 which oci 得到一組 bin 裡面的路徑,然後把 ociauto.sh 檔案裡面開頭的 oci 指令換成剛剛那組路徑。
5.終止執行中的指令要按 Ctrl+C,查系統版本 cat /etc/os-release。

執行程式看起來是不太耗效能,已經跑了超過 24 小時,不知道多久才能搶到…


2022/8/28 UPDATE
想不到文章發佈之後過沒幾天,Heroku 發公告要停止部分服務的免費額度。
於是我又測了幾個可以跑 server side (後端)程式,而且有免費額度的服務,如果對於設備規格需求不是很高,RAM 512MB 以下也能跑的,可以前去觀看我的使用心得: 幾個替代 Heroku 免費測試執行 ASP.Net Core Docker 的文字辨識 OCR 程式


2022/9/20 UPDATE
過了整整一個多月,終於在 9/20 終於搶到第一台…