在 AWS Lightsail 上部署 Potato
用 potato deploy 以每月 $12 的價格把 Potato 標註研究放到 AWS Lightsail 上,從設定憑據一直講到最後拉取標註。
potato deploy up --provider aws 把一項標註研究放到一臺 AWS Lightsail 虛擬機器上,固定價格每月 $12,並給你一個可以發給標註者的 HTTPS 地址。除非你的賬號關閉了 Lightsail,否則在 AWS 上就應該用這個目標。價格包含 IPv4 地址和一塊重啟後保留的 60 GB 磁碟,而且 Potato 只需要 lightsail:* 和 sts:GetCallerIdentity 兩項許可權,所以在受限的 IAM 角色下也能使用。本頁需要 Potato 2.10 或更高版本,以及一份你已經用 potato start 執行過的配置。
設定 AWS 憑據
Potato 讀取 AWS 憑據的方式與 aws 命令列工具相同:先讀 AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY,然後是 AWS_PROFILE,再然後是 ~/.aws/credentials 和 ~/.aws/config。安裝 AWS extra,用 AWS CLI 登入,並確認 Potato 看到的是你預期的賬號:
pip install 'potato-annotation[deploy-aws]'
aws configure # or: aws sso login --profile lab
potato deploy providers --verifyproviders --verify 會詢問每個提供商你的憑據屬於誰,並列印答案。如果你所在機構使用單點登入,請在每次部署時用 --aws-profile lab 傳入配置檔名,Potato 會把它記錄下來,讓後續命令使用同一個賬號。Potato 從不把 AWS 憑據寫入磁碟。
如果你的 IAM 使用者或角色受到限制,請向管理員申請 lightsail:* 和 sts:GetCallerIdentity。另外兩個 AWS 目標需要的許可權比這更多。EC2 目標(--provider aws-ec2,約每月 $18)用於關閉了 Lightsail 的賬號,ECS Express 目標(--provider aws-ecs)執行的容器在重啟後磁碟不會保留。
決定誰可以登入
potato deploy 不會改動你的登入設定,而 Lightsail 地址是公開的。如果配置允許任何人註冊,下面的試執行會報告警告 D003,“Anyone who finds the URL can register and annotate.”(任何找到這個 URL 的人都能註冊並標註。)對眾包研究來說,開放註冊通常是有意為之,因為平臺會把工作者引導到這個連結。對於實名標註者,請在部署之前把他們列在 user_config.users 下並設定 allow_all_users: false(密碼管理),或者讓他們通過 Google、GitHub 或你所在機構登入(SSO 與 OAuth 認證)。
檢查計劃
試執行不需要 AWS 賬號,也不建立任何東西。它會列印預檢報告、部署要執行的每一步,以及估算費用:
potato deploy up myproject/config.yaml --provider aws --dry-run預設部署時,計劃會在 us-east-1 建立一個以任務命名的實例,使用 2 GB 的 small_3_0 套餐和 Ubuntu 24.04。它會繫結一個靜態 IP,使地址和證書在停止再啟動後依然保留,並且只開放 22、80 和 443 埠。Potato 在 Caddy Web 伺服器後面監聽 8000 埠,部署從不開放 8000 埠。Potato 會為這次部署生成一把 SSH 部署金鑰,不會使用你自己的 SSH 金鑰。
有三個選項可以改變預設值。--region 接受任何 Lightsail 區域。由於 Potato 把項目集放在記憶體中,2 GB 放不下的語料需要 --size medium_3_0,它提供 4 GB,每月 $24。--volume-gb 會另加一塊 Lightsail 磁碟,每 GB 每月 $0.10,任務資料就存放在這塊磁碟上。
部署
去掉 --dry-run 運行同一條命令。Potato 會再次顯示計劃,等待你確認:
potato deploy up myproject/config.yaml --provider aws實例啟動並安裝 Docker 期間,部署需要幾分鐘。最後它會列印 URL(靜態 IP 上的一個 https:// 地址)以及管理員金鑰檔案的路徑,也就是配置旁邊的 .potato/secrets.json。用管理員金鑰可以開啟 /admin 上的管理儀表板。修改配置後再次執行 up,會上傳新版本並在同一個實例上重啟任務。
沒有域名時,Let's Encrypt 會為 IP 地址簽發證書。證書有效期約六天,會自動續期。續期失敗時 potato deploy status myproject/config.yaml 會報告出來,所以如果研究在無人看管的情況下執行,請每隔幾天檢查一次。要使用自己的域名,請把一條 DNS A 記錄指向靜態 IP,然後加上 --domain annotate.example.edu 重新部署。
結束研究
標註存放在實例的磁碟上,這塊磁碟能熬過重啟,卻熬不過 destroy。請先把標註拉取到你的機器上並檢查,然後再刪除實例:
potato deploy pull myproject/config.yaml
potato deploy destroy myproject/config.yamlpull 把部署收集到的全部內容寫入一個新的 potato-pull-<name>-<timestamp> 目錄,並用 SQLite 的備份命令複製資料庫。destroy 不會在從未拉取過的部署上執行。它會釋放靜態 IP,因為 Lightsail 對沒有繫結到實例的靜態 IP 照樣收費。使用了 --volume-gb 時,destroy --keep-data 會保留那塊單獨的磁碟。
故障排查
“AWS rejected the credentials” 表示 SSO 會話已過期,或者 AWS_PROFILE 指定的配置檔案不存在。執行 aws sso login 後重新部署。
“Lightsail does not sell bundle …” 出現在 AWS 調價後給套餐改名的時候。錯誤資訊會列出當前在售的套餐,--size 可以接受其中任何一個。
最初幾分鐘 HTTPS 無法訪問,是因為證書要等實例可以訪問之後才會申請。potato deploy status 會把證書錯誤和伺服器宕機分開報告。
延伸閱讀
- 在本地或雲端執行 Potato:其他雲端目標和備份選項
- 部署標註伺服器:如何選擇主機
- AWS 部署參考:每個 AWS 目標所需的確切 IAM 操作