
2026/04/16 4:56
すべてのプロトコルに対して、単一のインターフェース。
RSS: https://news.ycombinator.com/rss
要約▶
日本語翻訳:
サマリー:ベンダーロックインに対する開発者の不満は、ツールの複雑さからではなく、真の相互運用性を妨げる断片化されたインフラストラクチャに起因する。Dax Raad は、サービスの意味とアクセスプロトコルを分離する開かれた仕様の OpenBindings を不可欠な解決策として提案している。Web サイトが
/.well-known/openbindings でファイルを配信する方法を模倣することで、この標準はツールが共有インターフェースを通じて任意の提供者に接続できるようにし、ハードコーディングされた統合や移行時の完全なコードリライターティングの必要性を排除する。Terraform といった以前の失敗事例とは異なり(単に依存関係をシフトさせるだけであり、普遍的な記述の欠如を解決していなかった)、OpenBindings は実装層の上に最小限の構造を定義する点で特徴がある。AWS Smithy のようなモデルファーストフレームワークとは異なり、既存の API 発見プロトコル(RFC 9727 など)にリッチな意味論的データを付加する補完的なレイヤーとして機能する。このアーキテクチャは REST、gRPC、MCP、GraphQL のようなマルチプロトコルサービスを同時にサポートし、陳腐化した標準を近代化するとともに技術負債を削減し、企業がインターフェース互換性を単純な設定変更として扱うことを可能にする。直近の影響としては、クロスプロバイダーチェックのための機械可読構造により AI 相互作用を強化する点が含まれる。採用を促進するために、ob CLI は Homebrew(brew install openbindings/tap/ob)を通じてインストールでき、Go および TypeScript の SDK も含まれており、OBI の作成を手動のマッピングではなく自動化されたビルドステップとして扱う。本文
今月上旬、Dax Raad(@thdxr)は多くの開発者の心を捉えた投稿を行いました。
「どうやってインフラストラクチャを管理しているのか理解できません。すべてのサービスが独自の専用 CLI や構成ファイルを持ち、Terraform との連携ももううまくいっていません。システムが単一のプロバイダーだけであることはありえないので、みんなこれらをバラバラに組み合わせて大混亂な状態にしているのでしょうか?」
その投稿から一夜経たない間に、5 万人以上の人が閲覧し、レスポンスは殺到しました。SST、Pulumi、Ansible。「AWS に固執する」「REST API を呼び出すだけの Python スクリプトを使う」「それが雇用保険になる」「現代のインフラストラクチャとはつまり、ダクトテープとダッシュボードを重ねただけのもの」。誰もがその問題を認識しましたが、解決策はすべて単なるツールであって土台ではありません。私はこの課題に取り組むものを構築し続け、5 万人の開発者が同様の焦燥感を抱えていることに気づいたことで、私の思い込みではないことが確信できました。ロックインは症状であり、真正の疾病は「分散化(フラグメンテーション)」です。そしてプログラミング言語はすでに何十年前にその根本的な問題を解決しました。
最初に考え到的のはベンダーロックインの問題でした。もとの不満感は懐かしかったものです。一つのプロバイダー上で構築すると、彼らが価格を変えたり API を非推奨にしたり、あるいは単にもう適切なツールではなくなったりした瞬間、移行は酷なものになります。なぜなら概念が難しいからではなく、各プロバイダーが異なる言語を話しているからです。直感的な答えは「抽象化レイヤーの上層構築」ですが、それが Terraform や SST、そして十数ものツールが試みていることでもあります。しかし抽象化レイヤーは実際には問題を解決せず、ただそれを移動させるだけ罢了。あなたはまだ他者に依存しており、すべてのプロバイダーの変更対応を待つ必要がありますし、プラグインの記述を待たなければなりません。また、ライセンスの変更一つで当初の状態に戻るリスクも常につきまといます。
@Zenul_Abidin はその行方を的確に指摘しました。「抽象化は崩壊しつつあります。プロバイダーが予測可能だった時代は Terraform が機能していましたが、今では各サービスから独自の意見を持つレイヤーを shipping しています。」そして @aalachimo はこれをインセンティブと結び付けました。「Terraform のサポートからの撤退について語るのは、インフラストラクチャが進化していることよりも、ベンダーがロックインを最適化しようとしているという方が多くあります。」
@jetpen は構造上の問題を最もよく捉えました。
インフラストラクチャおよびプラットフォームベンダー間での任意のものをプロビジョニングするための互換性は存在せず、GCP、AWS、Azure、OCI... といった複数環境で動作する単一の実装を望むことに希望はありません。
彼は互換性が不存在であることを正しく指摘しています。しかし、私はその根本原因を別の視点から説明したいと考えています。サービスが自身を記述するための標準的な方法がないからです。そしてそこには、私にとって全体像を見直すようなひらめきがありました。実はこれはソフトウェア業界で解決済みの問題なのです。Swift にはプロトコル、Go ではインターフェース、Haskell では型クラスがあります。「このものが何であっても構わない。できることさえあればよい」とコードを書くのです。実装の形状にコードを書きます。裏面の型を交換してもコードはコンパイルされます。アヒルのように歩き、アヒルのような音を立てるものは、アヒルとみなしてください。ここで重要なのは、このアプローチが依存関係を逆転させる点です。コードが特定の実装に依存するのではなく、実装が生来の共通の形状を満たすことを求めます。新しいプロバイダーが現れても、アップストリームは変更を要しません。プログラミング言語は何十年も前からこれを備えていましたが、Web 分野においてネットワーク境界で広く採用された同等の仕組みはありませんでした。各サービスには事前知識が必要です。「ファイルを保存できますか?」と尋ねただけで、どのコンプライアンスしたサービスが答えを出すという仕組みがないのです。
もしそれが可能になったらどうでしょうか。
index.html の問題
それに関連して、ずっと気になり続けている一点があります。すべてのウェブサイトには index.html があります。それは玄関であり、サイトの構成に関する事前知識を必要としない共有の発見規約です。ルートにアクセスするとそこから始まります。API にはそんなものはありません。ドキュメントはどこにあるのか、どの仕様形式を使っているのか(OpenAPI? AsyncAPI? gRPC? それらの独自形式?)、認証の方法は何か、オペレーションの名前は何か。そしてそのすべてを見つけても、「S3 にファイルをアップロードする」と「R2 にファイルをアップロードする」が異なるプロトコルを通じて表された同一のセマンティクスのオペレーションであるとは言えません。
昨年、IETF は API の存在を発見するためのよく知られた URI (
/.well-known/api-catalog) を持つ RFC 9727 を公開しました。これはドメインに存在する API を教えてくれますが、その API が何をするのか、あるいはどれが同等かは教えてくれません。これらは補完的な関係です。api-catalog のエントリは OBI にリンクできるかもしれませんが、発見それ自体がギャップを埋めるわけではありません。見つけたものを使うためには依然として事前知識が必要です。そのため、すべてのプロバイダーを統一しようとするツールは、強制力に頼らざるを得ません:すべての統合をハードコーディングし、すべてのマッピングを管理し、各 API 変更を追跡しなければならないのです。それは永遠です。
AI はこの問題を覆い隠すのに驚異的に優れており、私はそれが実際には根本的な問題をより見えにくくしていると考えています。LLM はドキュメントを読み、認証を理解し、API 呼び出しを生成できます。MCP は AI エージェントがサービスと対話しやすい方法を与えてくれます。しかしこれでも強制力に頼っただけで、ただ速い強制力罢了。LLM は宣言できる構造をあやまって推測し、機械読み込み可能なドキュメントを解析し、検証できる同等性を推論しています。
真の問題は「分散化」です。ベンダーロックインは症状であり、疾病は分散化です。プロバイダーは入れ替われない那是因为、それらが何をどのように記述するかについての共有言語がないからです。この問題を解決しようとするすべてのツールは、その上にまたレイヤーを重ねるだけであり、不整合が待つのはまだ下層にあります。次の破壊的変化を待っています。
@qrcey はこう書きました。「おそらく必要となるあらゆるもの(Terraform)のための標準ではなく、実際に必要なものをどこでも実行するための統一インターフェースの必要性があるように感じます。」まさにその区別です。上層へのより良い抽象化ではない、下層への標準であるべきです。
私が構築したものはこれです。 それが OpenBindings です。サービスが何ができるかを記述するためのオープンな仕様で、プロトコルや環境を超えて移植可能です。その核心は「OBI (OpenBindings Interface)」という文書にあります。以下が最小限の例です:
{ "openbindings": "0.1.0", "name": "My Storage Service", "operations": { "createBucket": { "input": { "type": "object", "properties": { "name": { "type": "string" } } }, "output": { "type": "object", "properties": { "id": { "type": "string" } } } } }, "sources": { "rest": { "format": "openapi@3.1", "location": "./openapi.yaml" } }, "bindings": { "createBucket.rest": { "operation": "createBucket", "source": "rest", "ref": "#/paths/~1buckets/post" } } }
オペレーションはサービスが行えることを定義し、入出力スキーマを含みます。ソースは既存の仕様アーティファクト(OpenAPI ドキュメント、proto ファイル、MCP サーバーなど)を指し示します。バインドは、これらのソース内の特定のエントリポイントをオペレーションにマップします。すべて重要な点は、意味とアクセス権を分離することです。オペレーションは一度定義され、その後、プロバイダーが実際に使用するどのプロトコルにもバインドされます。2 つのプロバイダーが同一インターフェースを実装してもよく、ツールは単一のリクエストも実行せずに互換性を検証できます。Go のインターフェースのようなものですが、それがネットワーク境界にあります。
サービスは
/.well-known/openbindings で OBI を公開し、ウェブサイトがルート / で index.html を提供するのと同じ方法をとります。ツールはそれを発見・理解・対話し、特定のプロバイダーに関するハードコーディングされた知識を必要としません。これにより AI に関する話も変わります。OBI を発見する LLM は、エンドポイントをあやったりドキュメントから同等性を推論したりする必要がなく、機械読み込み可能なオペレーション、スキーマ、バインドを取得します。
これは AWS Smithy や Microsoft の TypeSpec などのツールとは異なるレイヤーです。これらは API プロバイダー向けのモデル第一主義のフレームワークです。サービスを一度定義し、OpenAPI ドキュメント、gRPC スタブ、複数のプロトコル用のクライアントを生成します。これらが何をすることをすれば素晴らしいものでありますが、出力は依然としてあなたの API 自体です。クロスプロバイダー同等性の概念はありません。「私のストレージ API は貴社のインターフェースを満たしています」と言う手段もありません。ただし、Smithy や TypeSpec は OpenBindings のための素晴らしい入力となることができます:どちらかでサービスを定義し、アーティファクトを生成した上で、それを OBI でラップします。
なぜ今なのか? OpenAPI、AsyncAPI、gRPC、MCP などの仕様はすでにプロトコルレベルの記述において困難な作業を遂行しました。これらすべてを置き換える必要はありません。欠けていたのは、それらの記述をつなぎ合わせ、「これらは同一の能力である」と断言する上層です。各仕様が得意なことを行わせるのです。
私がそれをどう聞こえるか知っています。xkcd の「15 の競合する標準」についての話はおそらくあなたの頭の中にあるでしょう。しかし OpenBindings は構造上、OpenAPI、gRPC、MCP を置き換えることはできません。ソースとバインドがなく、それらの仕様に指し示さない OBI は単に未解決の契約であり、実行可能なインターフェースではありません。依存関係は片方向のみです:それらの仕様が入力であり、競合相手ではありません。
そしてそうです、以前も試されました。WSDL、UDDI、CORBA です。すべて失敗しましたが、ここでは少し当てはまらない理由ででした。WSDL は SOAP の時代のために構築され、その外に出ることはできませんでした。UDDI は中央のレジストリへの手動登録を必要としました。CORBA は両端でランタイムインフラストラクチャが必要であり、ベンダーですらそれが合意に至ることができませんでした。これらはすべて共有インフラストラクチャを必要としました。OBI は JSON ファイルだけです。もう一つの差はタイミングにあります。WSDL の時代には、ほとんどのサービスが単一のプロトコルを使用していましたが、今日では単一のサービスが日常的に REST、gRPC、MCP、GraphQL を同時に公開します。このマルチプロトコルの現実は新しいものであり、OpenBindings が設計された具体的な問題です。
1 つの OBI がもたらすもの 生態系の採用を待たずに、その価値を得ることができます。既存の仕様アーティファクトがある場合、
ob CLI はそれらから OBI を生成します:
$ ob create openapi.json Created my-service.obi.json (12 operations, 1 source, 12 bindings)
gRPC サーバー、MCP エンドポイント、または proto ファイルでも同様です。一つのコマンドで、サービスに移植可能なインターフェース文書が生成されます。ソース仕様が変更されると再生成します。これは手動のマッピングではなくビルドステップです。その単一の OBI には、以下の具体的なメリットがあります:
- プロトコルを超えた統一実行:オペレーション名一つ、入出力スキーマ一つ。各フォーマットのバインド実行器がプロトコルの詳細を処理します。ツールはプロトコルのコードを含めません。
- 発見可能性:
で公開することで、ドキュメントを読むことなく、エンドポイントをあやさずに、ツールはオペレーション、スキーマ、アクセス方法を発見できます。/.well-known/openbindings - AI 用の機械読み込み可能な構造:OBI を発見する LLM は、エンドポイントを推測したりドキュメントから同等性を推論したりする必要なく、型付きのオペレーションとバインドを取得します。サービスへの呼び出しを一回目で正しく行えます。
これが完全な入り口です。プロバイダーの参加が必要です。生態系の存在も必要としません。一つのサービス、一つのファイル、即時の価値。
大きな絵 即時の価値は一つのサービス向けですが、アーキテクチャは今後のことを設計されています。今日、決済処理機を切り替える様子を考えてみてください。2 つセットのドキュメントを読み、一つの API の「create charge」を別の API の「create payment」にマッピングし、統合を書き換えてエラーハンドリングを更新し、すべてを試してエッジケースが一致するか希望するのです。すべてのステップは手動であり、知識は次の移行には転移しません。
次に、両方の処理機が OBI を公開する場合を考えます。オペレーションの名前と互換性のあるスキーマが一致していれば、ツールは構造上それを検出でき、調整が必要です。それが前述のダックタイピングの報いです。2 つのサービスが相互に知る必要はなくとも、独立して
createPayment オペレーションを定義し、互換性のある入出力スキーマを持つ場合は、入れ替わり可能です。
明示的なパスのためには、OBI には「役割 (role)」という概念があり、「私のオペレーションは他のインターフェースを満たしている」と宣言します。プロバイダーは自身の OBI に役割参照を追加し、自身のオペレーションをインターフェースが定義するものにマッピングし、ツールはスキーマを比較して主張を検証できます。役割は合意について慎重に扱いたい場合に有用ですが、必須ではありません。構造的一致はどちらの方式でも機能します。
両方のパスは同じ結果を与えます。ツールはコードを書く前にスキーマの互換性を検証できます。クライアントはプロバイダーではなくインターフェースを対象とします。ハッピーパスはリライティングではなく構成変更となります。OpenBindings は決済処理機インターフェースやストレージインターフェース、認証インターフェースを配送しません。基礎を配送するだけです。各プロバイダーへの一つの統合の代わりに、各プロトコルあたりのバインド実行器を維持します。単一の OpenAPI 実行器は、OpenAPI を話すすべてのサービスで機能します。インターフェース自体は各ドメインを知っている人々によって提供されます。Stripe は OBI を公開し、他の決済プロバイダーは
stripe.payments ロールを宣言するか、コミュニティが中立な決済処理機インターフェースを定義します。中央のレジストリもガバナンスのボトルネックもありません。
試してみてください CLI をインストールし、内蔵のデモを実行して一分以内でこれが動作する様子を見てみてください:
brew install openbindings/tap/ob ob demo # 6 つのプロトコルでのコーヒーショップサービスを開始 ob op exec http://localhost:8080 getMenu # REST を介して呼び出す ob op exec http://localhost:8080 getMenu --binding getMenu.grpcServer # 同じオペレーション、gRPC
CLI は
localhost:8080/.well-known/openbindings から OBI を取得し、オペレーションを見つけ、バインドを選択し、呼び出しを行いました。構成も、サービスの事前知識も、プロトコルのコードも必要ありません。仕様のオープン性です。ob CLI は OBI 文書の作成、検証、実行を処理します。Go と TypeScript のための SDK が利用可能で、OpenAPI、gRPC、MCP、GraphQL、Connect、AsyncAPI へのバインド実行器を備えています。プラグインアーキテクチャの動作については Creators and Executors を参照してください。
ここから始めましょう:入門ガイド
Matthew Clevenger
OpenBindings の作成者 · @clevengermatt