その他の事実

ボックスの 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 で、どの項目かを示します。

すべてのツールとトピックはツールリファレンスに並んでいます。