252
167

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

AmazonのAPI設計方針 (The Bezos Mandate)

Last updated at Posted at 2019-12-15

はじめに

The Bezos Mandateという文書があります。日本語に訳すと「ベゾスのお達し」とか「ベゾスの勅令」でしょうか。

言わずと知れたAmazon.comのCEO、ジェフ・ベゾスが開発チームに通達した内容です。

これが(元Amazon.com従業員によって)公開されたのは2011年ですが、ベゾスがこのお達しを出したのは2002年前後です。17年経過した現在でも真理をついているどころかようやく時代がベゾスに追いついたかという感想です。

この記事ではThe Bezos Mandateの紹介と、僭越ながら補足説明も行います。

お達しの内容

原文は元Amazon.com従業員のGoogleエンジニア(公開当時)、Steve Yeggeによって公開されました。
Google+にStevey's Google Platforms Rantというタイトルで、Amazon.comと比べたGoogleに対する不満として投稿されたのですが、残念ながらGoogle+の閉鎖に伴い元記事も消えてしまったようです。

幸いなことに、元記事は様々な場所から引用されており、"Stevey's Google Platforms Rant"で検索するとたくさんのページがヒットします。
検索で最初にヒットしたこのページを紹介しておきます。

お達しの内容は以下の通りです。

  1. All teams will henceforth expose their data and functionality through service interfaces.
  2. Teams must communicate with each other through these interfaces.
  3. There will be no other form of interprocess communication allowed: no direct linking, no direct reads of another team's data store, no shared-memory model, no back-doors whatsoever. The only communication allowed is via service interface calls over the network.
  4. It doesn't matter what technology they use. HTTP, Corba, Pubsub, custom protocols --doesn't matter. Bezos doesn't care.
  5. All service interfaces, without exception, must be designed from the ground up to be externalizable. That is to say, the team must plan and design to be able to expose the interface to developers in the outside world. No exceptions.
  6. Anyone who doesn't do this will be fired.
  7. Thank you; have a nice day!

日本語訳

日本語に訳してみました。

  1. 今後、全てのチームはデータと機能をインターフェースを通じて公開せよ
  2. チーム間のコミュニケーションは、その公開されたインターフェースを通じて行え
  3. 公開インターフェースを使わないプロセス間通信――直接リンク、他のチームのデータの直接読み取り、共有メモリ、その他のいかなるバックドアも――は一切認めない。ネットワークを経由したインターフェース呼び出しのみ、唯一許可される。
  4. インターフェースに使う技術は特に規定しないHTTPCORBAPublish/subscribe、カスタムプロトコルなど。
  5. 全てのインターフェースは例外なく、外部に公開できるように設計し直さなければならない。つまり、各チームはインターフェースを世界中の開発者に公開できるように計画・設計しなければならない。一切の例外は認めない
  6. これを守らない人は誰であれクビにする
  7. それでは良い一日を。

補足説明

インターフェースとは?

ここでいうインターフェースとは、各サービスが正式な機能として公開しているAPIと考えて問題ないでしょう。

使う技術は何でもいい(状況に応じて適切に使うべきだ)けど、チーム間・サービス間のデータ処理は常に公開APIを通じて行いなさいという内容です。

ウェブサービスの文脈ではHTTPによるWebAPIに限定してもいいかもしれません。
今ならRESTGraphQLのようにある程度共通化されたアーキテクチャがありますね。

公開インターフェース以外の手段とは?

例としていくつか挙げられていますが、もう少し具体的に書くと例えばこんなかんじです。

  • 直接リンク: ログファイルをNFS等で共有
  • 他のチームのデータの直接読み取り: 他のサービスのDBに直接接続してSQL発行
  • 共有メモリ: 2つのサービスが同じサーバ内で稼働しているという前提で、データをメモリ上で共有
  • その他のバックドア: 非公開APIの使用等

みなさんもこんなことをやった経験ありませんか?

本当に例外はないの?

本当です

たとえ「アカウントを凍結されたユーザー一覧を取得するAPI」のように社内の人間が管理画面からしか使わない機能で、それもローカルネットワーク内のPCからしか使えない設定にしていようとも、です。

仕様はいつどのように変わるか予測できません。たとえば「凍結ユーザーの管理業務は外注しよう!」とか「第三者がこの機能を使ってスマートフォンアプリを作成できるようにしよう!」と方針が変わるかもしれません。
そんなときも、ベゾスのお達しを守っていれば簡単に対応できます。

本当に公開しないとダメなの?

「そんなこと言ったって絶対に限られた場所からしか使われないAPIもあるし、そういったAPIは内部ネットワークからしかアクセスできないように制限してるんだけど、本当に全てのAPIを全世界に公開しなきゃダメなの?」という意見もあると思います。

それに対する答えはNOです。つまり、全てのAPIを公開する必要はありません

もう一度引用元の言葉を確認しましょう。強調範囲は変えています。

各チームはインターフェースを世界中の開発者に公開できるように計画・設計しなければならない。

つまり今すぐ全てのAPIを公開せよというわけではなく、必要になったときにすぐ公開できるような設計にしなさいと書いてあります。
「全てを公開せよ」とか「アクセス元の制限をするな」という意味ではありません。

具体的にはこんな感じでしょうか。

  • WAFやACLで守られていることを前提とせず、API自体に適切な認証機能をつけよ
  • 想定外の使い方にも耐えられるように、セキュリティーには手を抜くな
  • 将来のAPIの仕様変更に備え、使われる場所が限られていると想定せず、内部APIであろうともきちんとバージョン管理せよ
  • 第三者が読んで理解できるドキュメントを作成せよ

まとめ

ベゾスが言いたいことは実にシンプルです。

  • アクセスする必要のあるデータは必ずAPIを用意せよ
  • そのAPIは、全世界に公開することを前提として設計せよ
  • 一切の例外は認めない

今でいうマイクロサービスやマッシュアップの考えですが、驚くべきはベゾスの慧眼。

最初に書きましたが、ベゾスがこれを通達したのは2002年前後です。
とっくにサポートが切れたWindows XPが発売された頃の話で、スマートフォンなんか影も形もない時代です。

このThe Bezos Mandateがなければ、インターネットサービスの発展は10年以上遅れていたかもしれません。

みなさんも、ウェブサービスを作るときはぜひ意識してみてください。

それでは良い一日を。

252
167
7

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
252
167

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?