このページはデプロイモデル(digest、front、ロールバック)について説明します。ホスト型サービス自体のインフラ、つまりECS、RDS、
@jinbatrail/serviceそのものを出荷するデプロイパイプラインを実際に立ち上げるには、下の2つのランブックを参照してください。このページではそれらを重複して説明しません。AWSでのセルフホスティング
インフラ全体のランブックです。ECSサービス、RDS Postgres、ALB、KMS、そしてそれらをつなぐ環境変数を扱います。
CI/CDパイプライン
mainへのマージやバージョンタグが、stagingとproductionのECSサービスをどのようにビルドし、ゲートし、rollするかを説明します。公開してから公開面に出す
コントロールプレーンでは、「SDKをデプロイする」は2つの別々の動きになります。- PackをplaneのRegistryへ公開する。versionedでdigest固定されます。
- そのFlowを、使いたいLauncher(“fronts”)で公開面に出す。
daily-price-watchを含むPackをアップロードします(このページで継続して使う例では、ブラウザーTool search-price@1.2.0がtransformに入力を渡し、条件に応じてsecret webhookへhttp.postを発火します)。公開はcontent-addressedなので、RegistryはPackをそのname@versionの下に保存し、密かに変わることが決してないdigestに固定します。
2つ目のコマンドは、daily-price-watch FlowをREST LauncherとMCP Launcherという2つのfrontで同時に公開します。同じFlow、同じdigestに、POST /flows/daily-price-watch/runsとして、そしてMCPツールとして、同時に到達できます。frontの全体(CLI、REST、MCP、cron、CI、container、embedded)についてはLauncherを参照してください。
Packを公開することとFlowをデプロイすることは、意図的に別の手順です。公開はあるversionをRegistryで利用可能にします。デプロイは特定のdigestをfrontでliveにします。公開しても公開面に出さないことができ、再公開せずにfrontの向き先を変えることもできます。
デプロイは宣言的な記録
デプロイはコードを移動しません。bindingを記録します。| フィールド | 意味 | 例 |
|---|---|---|
| Flow | どのFlowが公開されるか | daily-price-watch |
| Digest | どの不変なFlowSpecがliveか | sha256:7f3a… |
| Front | どこで公開されるか | rest, mcp |
automation.published)を含むすべてのprivileged actionは、actor、timestamp、関係するdigestとともに監査ログへ書き込まれます。そのため、デプロイ履歴自体がcontent-addressedなtrailになります。
ロールバック
ロールバックはデプロイの逆操作であり、同じくらい軽量です。frontを以前のdigestへ向け直します。以前のdigestを特定する
各デプロイは、どのdigestがliveだったかを記録しています。
daily-price-watchの以前のknown-goodなdigestはすでにRegistry内にあり、すでに不変です。再ビルドするものはありません。frontをそのdigestへ向け直す
以前のdigestをデプロイすると、front(
rest、mcp、…)がその正確なFlowSpecへ再bindingされます。digestはすでにartifactをbyte-for-byteで識別しているため、compile stepは実行されません。Promotion: dev → staging → prod
環境間のpromotionでは、stageごとに再ビルドするのではなくdigestを移動します。そのため、テストしたものがそのまま出荷されます。 digestが一定なので、devで証明されたFlowSpecは、prodでserveされるものとbyte-for-byteで同じです。これは、再現性という原則のdeploy-timeでの姿です。ある場所で証明されたFlowは、そのFlowSpecとPackのdigestが同一であるため、別の場所でも再現されます。環境間でdigestを移動すること自体がcontent-addressedなので、安全で、冪等で、検証可能です。Registry間でPackをmirrorする方法(pull / push / sync / scheduled)についてはレプリケーションを参照してください。
promotionの前に、run inspector UIから直接
browserflow replay --verifyを使って、記録済みFlowをそのJournalから再実行できます。これにより、digestを進める前にFlowがまだ同じように振る舞うことを確認できます。検証したものが、promotionするものです。UIでの編集 ↔ Git上のYAML
UI canvasとYAMLは、1つのFlowSpecの2つの面です。同期から外れてドリフトする第2のsource of truthはありません。- canvasでFlowを編集すると、canonical YAMLがemitされます。
- YAMLをimportすると、canvasがrenderされます。
- digestは、どのversionがliveかを全員に正確に伝えます。
daily-price-watchをmaintainし、non-engineerはUIで調整し、digestはどのversionがデプロイされているかを全員が読む共有座標になります。「console」と「repo」の間にドリフトはありません。どちらも同じcanonical FlowSpecを投影しているからです。
canonical YAMLとは正確には何ですか?
canonical YAMLとは正確には何ですか?
canonical YAMLはFlowSpecの決定論的なserializationです。canvasがemitする形式であり、canvasへimportし直される形式でもあります。canonicalであるため、同じFlowは常に同じ方法でserializeされます。これによりdigestが安定し、round-tripがlosslessになります。SDK & YAML authoringを参照してください。
non-engineerがcanvasを調整した場合、Gitはどうやって最新に保たれますか?
non-engineerがcanvasを調整した場合、Gitはどうやって最新に保たれますか?
canvasでの編集はcanonical YAMLをemitし、それがrepoに保存される形式です。そのYAMLをGitへ戻してreconcileすることは通常のversion-control flowです。変更されたFlowSpecは変更されたdigestなので、digestによりどんなdivergenceもすぐに見えるようになります。
live frontはYAMLに自動で追従しますか?
live frontはYAMLに自動で追従しますか?
いいえ。公開面に出すことは、明示的で宣言的な操作です。frontは、別のdigestをデプロイするまで、デプロイ済みのdigestにboundされたままです。YAMLまたはcanvasを編集すると新しいdigestが生成されます。そのdigestはデプロイしたときにだけliveになります。これこそが、ロールバックとpromotionを決定論的に保つ仕組みです。
関連
レプリケーション
pull、push、sync、またはscheduled modeで、digest固定されたPackをRegistry間でmirrorします。到着時に検証されます。
Launcher
デプロイ済みFlowを公開できるfrontです。CLI、REST、MCP、cron、CI、container、embeddedがあります。
可観測性
Runをinspectし、Journalをtime-travelし、digestをpromotionする前に
--verifyでreplayします。コントロールプレーン
planeが第2のengineになることなく、Runをどのようにscheduleしobserveするかを説明します。
AWSでのセルフホスティング
ホスト型サービスを自分で立ち上げるためのインフラ全体のランブックです。
CI/CDパイプライン
サービスをstagingとproductionへ出荷するbuild → gate → rollパイプラインです。