別のボックスへのリンク
リンクを使うと、あるボックスから、自分の別のボックスで動くサービスを、呼び出し側がもともと使う名前で呼べます。宣言の仕方、ルール、相手のボックスの状態ごとに接続がどうなるか。
リンクは、あるボックス(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で何も待ち受けていない:502link …: nothing listens on port … in box …。
B のプログラムには接続のリセットとして見えます。理由は B の
/work/.sbx/logs/private-endpoints.logとsandbox_status.links[].lastErrorにあります。- 凍結中:接続で A が復帰します(アカウントにクレジットが必要)。約 20 秒以内に起きなければ、接続は
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 でバージョンを宣言するほうがもっと簡単です:チーム構成を参照してください。
すべてのツールとトピックはツールリファレンスに並んでいます。