別のボックスへのリンク

リンクを使うと、あるボックスから、自分の別のボックスで動くサービスを、呼び出し側がもともと使う名前で呼べます。宣言の仕方、ルール、相手のボックスの状態ごとに接続がどうなるか。

リンクは、あるボックス(B)の名前を自分の別のボックス(A)のポートに向けます。これで B は、呼び出し側がいつも使う名前のまま、A で動くサービスを呼べます。B の起動時に services で宣言するか、動いている B に追加します:

sandbox_start { "name": "返金改修の billing を使う web", "goal": "ボックス A の返金改修を使って web フロントエンドを動かす。ブラウザで行った返金がその billing に記録されれば完了", "services": [{ "name": "billing.acme.internal", "port": 8080, "fromBox": "<ボックス A>", "fromPort": 8081 }] }
sandbox_wire  { "id": "<ボックス B>", "service": "billing.acme.internal", "port": 8080, "fromBox": "<ボックス A>", "fromPort": 8081 }
  • これで B の name:port は、A で fromPort を待ち受けるプロセスに届きます。B のプログラムからもコンテナからも同じです。fromPort を省略すると、A の同じ名前のサービスの targetPort、なければ port になります。A 側では boxd が 127.0.0.1:<fromPort> に接続するので、そこのプロセスは 0.0.0.0 か 127.0.0.1 で待ち受けるか、そのポートを公開したコンテナである必要があります。

  • 規則:A は同じアカウントの別のボックスで、まだ止まっていないこと(止まっていれば 410 … link to a running box)。名前はホスト名で、アドレスや範囲は使えません。リンクに web と targetPort はありません。自分自身にはリンクできません。fromPort に 80 と 9095 は使えません。名前が B のサービスと重なってもいけません(… is already a service in this box; a link needs a name of its own)。

  • リンクは、同じ host:port の環境のアドレスより優先されます。B はあなたのネットワークではなく A に届き、そのアドレスは B の environment.reachable から外れます。

  • fromBox 付きの sandbox_wire は { "links": [...] } を返します。同じ service と port に別の fromBox か fromPort を渡すと、リンクの向き先が変わり、次の接続から新しい先に届きます。リンクはボックスに記録され、sandbox_status.services に fromBox と fromPort 付きで出て、boxd が再起動しても残ります。

  • 動いているボックスに加えたリンクは、同じ host:port の環境のアドレスをすぐに引き取ります。新しい接続は A に届き、すでに開いている接続は閉じるまで元の経路のままです。ボックスで確認済み:リンクの前は名前がコネクタに向かい、sandbox_wire … fromBox の直後の次のリクエストは A に届きました。あとから加えたサービスやバージョンも、take-over 機能のあるボックスでは同じように環境のアドレスを引き取り、古いボックスではコネクタ経由のままです(リンクや環境のアドレスを引き取る)。

  • B からの接続の結果は A の状態で決まります:

    • 凍結中:接続で A が復帰します(アカウントにクレジットが必要)。約 20 秒以内に起きなければ、接続は box … is still waking up from frozen; retry in a moment で失敗します。
    • 人が引き継ぎ中:そのまま使えます。
    • 起動中:409 link …: box … is still starting; retry once it is ready。
    • 停止済みまたは interrupted:410 link …: box … is terminated (…); start a new box and re-point the link with sandbox_wire。
    • リンクが出る前のイメージで動いている:409 … runs an older image … that cannot serve links; start a new box for it and re-point the link with sandbox_wire。
    • fromPort で何も待ち受けていない:502 link …: nothing listens on port … in box …。

    B のプログラムには接続のリセットとして見えます。理由は B の /work/.sbx/logs/private-endpoints.log と sandbox_status.links[].lastError にあります。

  • B が接続を開いている間、A は使用中とみなされ、アイドルで凍結も停止もされません(A の health では servedLinks として見えます)。B が凍結または停止すると、ParallelSandbox は B から A への接続を 1 分ほどで閉じ、A はそのあと自分のアイドル時間で凍結します。

  • B の sandbox_status.links[] は、各リンクと fromStatus(A の状態)、active、opened、failed、lastError を並べます。A の sandbox_status.linkedFrom[] は、A にリンクしているボックス(boxId、boxName、status、name、port、fromPort)を並べます。A に sandbox_stop すると同じ linkedFrom と注意書きが返ります。それらのリンクは、sandbox_wire で向け直すまで失敗します。

  • 通信は ParallelSandbox のコントロールプレーンを通り、マシン同士が直接つながるわけではありません。各方向とも、送る側のボックスの外向き通信(box_egress)として数えます。B が送るリクエストは B の、A が返す応答は A の分です。

  • リンクが出る前に起動したボックスにはリンクできず(409 runs an older image)、動いているボックスにリンクを追加するには、そのボックスもリンクが出た後に起動したものである必要があります(409 … cannot add a link while it runs; declare the link at sandbox_start on a new box)。

  • リンクの向き先を変えるには、fromBox か fromPort を付けてもう一度 wire します。A がなくなる前に、自分のプロセスや公開したバージョンに置き換えるには、同じ名前とポートで port(と targetPort)か version を付けて wire します。take-over 機能のあるボックスではリンクがその場で引き取られ、B の URL は変わりません(リンクや環境のアドレスを引き取る)。古いボックスでは 409 になり、新しい B(新しい URL)を起動するしかありません。リンクで mode を切り替えると常に 409 です。最初から B でバージョンを宣言するほうがもっと簡単です:チーム構成を参照してください。


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