其他事實
箱子網址、接手 token、用量事件、裝著一切的單一帳號、箱子的對外 IP,以及箱子之間怎麼隔開。
- 箱子的網址:
sceneUrl是https://<id>-<key>.box.parallelsandbox.com,連到箱子第一個宣告的服務,那個服務是web時也就是它的url;之後每個標了web的服務有https://<id>-<key>-<targetPort>.box.parallelsandbox.com。兩種都經 edge、走 HTTPS;在瀏覽器載入凍結箱子的頁面會喚醒它(箱子狀態)。箱子裡沒有程式在服務的targetPort上聽時,網址回 503,帶Retry-After與nothing answered on port N in this box;GET(或 HEAD)會先等服務最多 3 秒,正在重啟的服務(dev server 重新最佳化相依、watcher 重載)多半等得到。key 不對的網址跟不存在的箱子一樣回 404,後面沒有 web 服務的-<port>跟沒有服務的 port 一樣回 404。 - 接手 token:含箱子 id 與到期時間的 HMAC。箱子只認控制面發的一次性 token。以接手本身的到期為準:請求後 30 分鐘,人第一次打開網址時延到打開後 30 分鐘,所以網址在 token 裡的時間過了之後也能用到那時。
GET /v1/takeovers每一筆開著的接手除了takeoverUrl(帳號選過語言時帶&lang=),還直接給token與appLink(parallelsandbox://box/<id>?t=<token>)。 - 用量事件:每個運行中的箱子每分鐘一筆,每個計量動作一筆。
GET /v1/usage/events回id、tenant、box、kind、quantity、unit、credits、at。種類:箱子的分鐘數(box_runtime_*,照大小單位計價)、租用裝置的分鐘數(device_runtime_*)、往外的位元組(box_egress,箱子送出的一切,含經環境連線與 link 的)、log 寫入(log_write)與保存(log_storage)的位元組、保存的檔案(artifact_storage)。 - 一個帳號裝著一切:箱子、環境、link、已發布的版本、registry 與點數。帳號的每個連線(OAuth 或 API key)都作用在全部上面;每位隊友或 agent 各自登入一次,不支援 OAuth 的工具才用 API key,走 REST 建立與撤銷(團隊設定)。帳號沒有成員或角色之分:最多可以連結一個 GitHub、一個 Google、一個 Apple 登入,每一個都登入同一個帳號。
- 箱子連網際網路的流量,是從它所在主機的公開 IP 出去的(在箱子裡
curl -s https://checkip.amazonaws.com看得到)。這個 IP 是主機開機時 AWS 給的,所以不同主機上的箱子從不同的位址出去,主機來來去去位址也會跟著變:沒辦法放進白名單。對只接受已知 IP 的外部服務,把它的主機列在箱子環境的一條連線上,例如api.partner.example:443:箱子就經連接器連過去,流量從你自己的網路出去(環境)。會擋機房位址的網站會把箱子當成機器人:箱子裡播 YouTube 會失敗,顯示Sign in to confirm you're not a bot。這種部分用sandbox_review的open: "web"交給人,讓它在人自己的瀏覽器、從人自己的網路播放。 - 箱子之間彼此隔離,只有你宣告的 link 例外,而 link 只連同一個帳號的箱子。從外面只有兩條路進得了一個箱子:它的網址(第一個服務的
sceneUrl與標了web的服務的網址,HTTPS,靠網址裡的 key 保護;帳號設了 IP 白名單時,來源 IP 也要在名單內,見下一項)與接手頁。箱子自己沒有任何雲端憑證;唯一的例外是環境的 AWS 角色,只有帶那個環境開的箱子拿得到它的暫時憑證。 - 箱子網址的 IP 白名單:
PUT /v1/box-access帶{ "allowedIps": ["203.0.113.4", "198.51.100.0/24"] }(單一位址或 CIDR,最多 50 筆;存成正規化的 CIDR),GET /v1/box-access讀回allowedIps與updatedAt,[]就是關掉。設了之後,帳號所有箱子的網址(sceneUrl、每個 web 服務的網址)只接受名單內的來源 IP,改完約 3 秒生效。名單外的請求一律 403,不轉進箱子、也不喚醒凍結的箱子:瀏覽器開頁面看到「This IP address is not allowed」,其他請求拿到 JSON{"status":"ip_not_allowed","ip":"<對方的 IP>","error":"…"};key 不對照舊是 404。目前只比對 IPv4(IPv6 存得進去,但比對不到)。箱子從裡面打自己的網址也會被擋,因為來源是主機的公網 IP:箱子裡請用localhost或服務名。人在 app 按「進去用」或打開交件的網頁也經過這一關,他的 IP 要在名單內;接手頁、app 的即時畫面與 API 不受影響。有名單時,sandbox_start與sandbox_status多一個boxUrlAccess(allowedIps與note)。名單格式不對回 400,訊息指出是哪一筆。
所有工具與主題都列在工具參考。