その他の事実
ボックスの URL、引き継ぎトークン、使用量イベント、すべてを持つ 1 つのアカウント、ボックスのパブリック IP、ボックス同士の隔離。
- ボックスの URL:
sceneUrlはhttps://<id>-<key>.box.parallelsandbox.comで、ボックスの最初に宣言したサービスに届き、そのサービスがwebならそのurlでもあります。2 つ目以降のwebを付けたサービスにはhttps://<id>-<key>-<targetPort>.box.parallelsandbox.comがあります。どちらもエッジ経由の HTTPS で、凍結中のボックスのページを読み込むとボックスが復帰します(ボックスの状態)。ボックス内でサービスのtargetPortを誰も待ち受けていないとき、URL はRetry-Afterとnothing answered on port N in this box付きの 503 を返します。GET(または HEAD)はその前に最大 3 秒サービスを待つので、再起動中のサービス(依存関係を再最適化している dev server、リロード中の watcher)はたいてい間に合います。key が違う URL は存在しないボックスと同じ 404、web サービスのない-<port>はサービスのないポートと同じ 404 になります。 - 引き継ぎトークン:ボックス id と有効期限を含む HMAC。ボックスはコントロールプレーンが発行した使い捨てトークンしか受け付けません。有効期限は引き継ぎそのものの期限で決まります。依頼から 30 分で、人が初めてリンクを開くと開いてから 30 分に延びるので、リンクはトークン内の時刻を過ぎてもその時まで使えます。
GET /v1/takeoversは開いている引き継ぎごとにtakeoverUrl(アカウントの言語が選ばれていれば&lang=付き)に加えてtokenとappLink(parallelsandbox://box/<id>?t=<token>)を返します。 - 使用量イベント:稼働中のボックスごとに毎分 1 件、計量対象の操作ごとに 1 件。
GET /v1/usage/eventsはid、tenant、box、kind、quantity、unit、credits、atを返します。種類:ボックスの分数(box_runtime_*、サイズの単位ごとに課金)、貸し出しデバイスの分数(device_runtime_*)、外向きのバイト数(box_egress、ボックスが送るすべてで、環境の接続やリンク経由のものも含む)、ログの書き込み(log_write)と保存(log_storage)のバイト数、保存ファイル(artifact_storage)。 - 1 つのアカウントがすべてを持ちます:ボックス、環境、リンク、公開したバージョン、レジストリ、クレジット。アカウントのどの接続(OAuth でも API キーでも)もそのすべてに作用します。チームメイトやエージェントはそれぞれ一度サインインし、OAuth に対応しないツールだけが API キーを使います。作成と失効は REST で行います(チーム構成)。アカウントにメンバーや役割はありません。GitHub、Google、Apple のサインインをそれぞれ 1 つまでつなげられ、どれも同じアカウントを開きます。
- ボックスからインターネットへの通信は、ボックスが動いているホストのパブリック IP アドレスから出ます(ボックスで
curl -s https://checkip.amazonaws.comを実行すると見えます)。このアドレスはホストの起動時に AWS が割り当てるので、別のホストのボックスは別のアドレスから出て、ホストの入れ替わりでアドレスも変わります。許可リストには載せられません。決まった IP アドレスしか受け付けない外部サービスには、そのホストをボックスの環境の接続に登録します(例:api.partner.example:443)。ボックスはコネクタを通してそこに届き、通信はあなた自身のネットワークから出ます(環境)。データセンターのアドレスを遮断するサイトはボックスをボットとして扱います。ボックスでの YouTube の再生はSign in to confirm you're not a botで失敗します。その部分はsandbox_reviewのopen: "web"で人に渡し、人自身のブラウザで、人のネットワークから再生してもらってください。 - ボックス同士は隔離されていて、例外はあなたが宣言したリンクだけです。リンクは同じアカウントのボックスどうしにしか張れません。外からボックスに届くのは、その URL(最初のサービスの
sceneUrlと、webを付けたサービスの URL。HTTPS で、URL の key で保護されます。アカウントに IP 許可リストがあるときは、送信元 IP もリストに入っている必要があります。次の項目を参照)と引き継ぎページだけです。ボックスは自分のクラウド認証情報を持ちません。唯一の例外は環境の AWS ロールで、その環境で起動したボックスだけが一時的な認証情報を受け取ります。 - ボックス URL の IP 許可リスト:
PUT /v1/box-accessに{ "allowedIps": ["203.0.113.4", "198.51.100.0/24"] }(単一アドレスまたは CIDR、最大 50 件。正規化した CIDR で保存)、GET /v1/box-accessでallowedIpsとupdatedAtを読めます。[]でオフです。設定すると、アカウントのすべてのボックス URL(sceneUrlと各 web サービスの URL)がリスト内の送信元 IP だけを受け付け、変更は約 3 秒で反映されます。それ以外は 403 で、ボックスには転送されず、凍結したボックスも起こしません。ブラウザでページを開くと「This IP address is not allowed」、ほかのリクエストは JSON{"status":"ip_not_allowed","ip":"<相手の IP>","error":"…"}です。key が違えば従来どおり 404。今は IPv4 だけを照合します(IPv6 は保存できますが一致しません)。ボックスの中から自分の URL を呼んでも、送信元がホストのパブリック IP なので拒否されます。ボックス内ではlocalhostかサービス名を使ってください。人がアプリで「使ってみる」を押したり、レビューの Web ページを開いたりするときもこの確認を通るので、その人の IP がリストに必要です。引き継ぎページ、アプリのライブ画面と API は影響を受けません。リストがあるとき、sandbox_startとsandbox_statusにboxUrlAccess(allowedIpsとnote)が付きます。形式が正しくないリストは 400 で、どの項目かを示します。
すべてのツールとトピックはツールリファレンスに並んでいます。