Google Cloud Platform 的免費 VPS


也順便記錄一些踏過的坎。

除了一開始免費送的 90 天 $300 鎂額度之外,其實 GCP 還是有免費計畫可以用的,雖然負載和流量都有一定的限制,但用來放一些需要 24/7 的服務,例如給定每小時執行一次的爬蟲程式啊、Discord Bot、或是自己寫的迷你後台等等,還是綽綽有餘的。

VM 個體

根據 Google Cloud 免費計畫 關於免費 Compute Engine 服務的說明:

  • 每個月可以在下列其中一個美國區域中使用 1 個非先佔 e2-micro VM 執行個體:

    • 奧勒岡州:us-west1
    • 愛荷華州:us-central1
    • 南卡羅來納州:us-east1
  • 每月 30 GB 的標準永久磁碟

  • 在以下地區每個月可使用 5 GB 的快照儲存空間:

    • 奧勒岡州:us-west1
    • 愛荷華州:us-central1
    • 南卡羅來納州:us-east1
    • 台灣:asia-east1
    • 比利時:europe-west1
  • 每月 1 GB 從北美輸出至所有地區的網路流量 (中國和澳洲除外)

會發現只要地區選擇 us-west1、us-central1 或 us-east1,都是不用錢的,所以在 Computer Engine 裡面,我們可以直接 Create an instance(不要從 Instance templates 裡面建立,那樣會不能選擇地區),任意選擇以上三種地區,並選擇 e2-micro(2 vCPU + 1 GB memory 的那個)。

同時在 Boot Disk 裡面,把硬碟改成標準永久磁碟(Standard persistent disk),容量 30 GB 以內、作業系統就挑自己習慣的即可,我這邊選 Ubuntu 18.04 LTS(發現 Ubuntu Pro 要加錢 🥹)。

此時旁邊的金額「應該」會顯示 $7.11(可能會隨 Google 的定價策略而變動),但這是正常的,即使我們使用了免費的套餐,旁邊依舊會有一個預估的金額。

其他的選項就按照個人喜好選擇,不知道哪個是哪個的話保持原狀也可以。如果之前沒加入過信用卡的,會跟你要一下信用卡資料。

回到 VM instances 的 Dashboard 就會看到剛剛的 VM 啦,按最旁邊的 Connect > SSH 就可以進去了。

遠端桌面?

有些人可能不習慣或不熟悉透過命令列來操作 Ubuntu,這邊提供一個安裝 Xfce Desktop Environment 的方法(包著 Xfce 的 Ubuntu 又稱 Xubuntu)。概念是安裝完 Xfce 之後,再安裝 Xrdp 遠端桌面,並透過 Windows 的遠端桌面連線。

1
2
3
4
sudo apt-get update
sudo apt-get install -y xrdp
sudo apt-get install -y xfce4
sudo service xrdp restart

設定 sudo 的密碼(登入的時候會用到):

1
2
sudo -s
passwd

在安裝完以上的套件之後,就可以透過 Windows 內建的遠端連線,或是 macOS 的 Microsoft Remote Desktop,透過 External IP 以 root 的身份登入。

詳情可參考這個教學:Enable desktop experience & RDP for Ubuntu 18.04 LTS VM in GCP

但~可能受限於 e2-micro 的效能,安裝完後連 Chromium 都跑不起來,只能裝輕量化的瀏覽器和 IDE,我建議還是別操他了(畢竟是免費的嘛),還是乖乖用終端機。

Update Python

1
2
3
4
python -V
# or
python3 -V
# should be 3.6.8

由於 Ubuntu 18.04 LTS 預設的 Python 是 3.6.8,有些 package 會要求 3.7 甚至 3.8 以上的 Python,所以可以先將 Python 做升級:

先取得 ppa 來源且驗證:

1
2
3
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt-get update
apt list | grep python3.9

安裝:

1
sudo apt-get install python3.9

保存兩種版本的 Python:

1
2
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 1
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.9 2

在 3.6 和 3.9 之間,選擇 Python 版本。

1
sudo update-alternatives --config python3

此時會跳出目前已有的 Python 版本,可以輸入前面 Selection 的編號來切換版本。

最後再檢查

1
2
3
python -V
# or
python3 -V

參考文章:How to upgrade to Python 3.9.0 on Ubuntu 18.04 LTS

Python 問題排除

升級 Python 之後總是會遇到一些奇葩的 bug,這裡記錄一下。

嘗試

1
2
3
4
5
pip3 install --upgrade setuptools

# If it does not work, try also:
pip3 install --upgrade pip
pip3 install --upgrade distlib

參考文章:pip3 on python3.9 fails on ‘HTMLParser’ object has no attribute ‘unescape’

1
2
3
4
sudo apt install python3.9-distutils

# And then you can test it with following line written in terminal:
python3 -c "from distutils import sysconfig"

參考文章:ImportError: cannot import name ‘sysconfig’ from ‘distutils’ (/usr/lib/python3.9/distutils/init.py)

在命令列一次執行多個程式:Screen

安裝完 Python、Pip 和各式各樣的 package 之後,就可以在 SSH 命令列執行程式啦,但如果我想要一次執行多個程式,難道就要開多個命令列才行嗎?我們可以透過 Screen 來達到切換視窗的效果。Screen 可以在一個命令列裡面切換多個命令列,這樣我們就可以讓程式在背景切換,然後執行另一個程式。

理論是在 Ubuntu 裡面應該都有內建 screen,沒有的話再另外安裝

1
sudo apt-get install screen

詳細的指令可以參考這一篇:使用 Screen 指令操控 UNIX/Linux 終端機的教學與範例

  • 創建一個新的 screen:screen
  • 完全束當前的 screen:exit
  • 退出當前的 screen(類似把程式丟到後台):cmd+Ad
  • 列出當前所有的 screen:screen -ls
  • 重新(attach)連接 screen:screen -r [screen 代號]
  • 退出(detach)某個 screen:screen -d [screen 代號]