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

# はじめに

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

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

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

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

# お達しの内容

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

幸いなことに、元記事は様々な場所から引用されており、["Stevey's Google Platforms Rant"で検索](https://en.lmgtfy.com/?q=Stevey%27s+Google+Platforms+Rant)するとたくさんのページがヒットします。
検索で最初にヒットした[このページ](https://gist.github.com/chitchcock/1281611)を紹介しておきます。

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

> 1. All teams will henceforth expose their data and functionality through service interfaces.
> 1. Teams must communicate with each other through these interfaces.
> 1. 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.
> 1. It doesn't matter what technology they use. HTTP, Corba, Pubsub, custom protocols --doesn't matter. Bezos doesn't care.
> 1. 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.
> 1. Anyone who doesn't do this will be fired.
> 1. Thank you; have a nice day!

## 日本語訳

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

1. 今後、全てのチームはデータと機能を**インターフェースを通じて公開せよ**。
1. チーム間のコミュニケーションは、その**公開されたインターフェースを通じて行え**。
1. 公開インターフェースを使わないプロセス間通信――直接リンク、他のチームのデータの直接読み取り、共有メモリ、その他のいかなるバックドアも――は一切認めない。**ネットワークを経由したインターフェース呼び出しのみ**、唯一許可される。
1. インターフェースに使う**技術は特に規定しない**。[HTTP](https://ja.wikipedia.org/wiki/Hypertext_Transfer_Protocol)、[CORBA](https://ja.wikipedia.org/wiki/Common_Object_Request_Broker_Architecture)、[Publish/subscribe](https://ja.wikipedia.org/wiki/%E5%87%BA%E7%89%88-%E8%B3%BC%E8%AA%AD%E5%9E%8B%E3%83%A2%E3%83%87%E3%83%AB)、カスタムプロトコルなど。
1. 全てのインターフェースは例外なく、外部に公開できるように設計し直さなければならない。つまり、各チームはインターフェースを**世界中の開発者に公開できるように**計画・設計しなければならない。**一切の例外は認めない**。
1. これを守らない人は**誰であれクビにする**。
1. それでは良い一日を。

# 補足説明

## インターフェースとは？

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

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

ウェブサービスの文脈ではHTTPによるWebAPIに限定してもいいかもしれません。
今なら[REST](https://ja.wikipedia.org/wiki/Representational_State_Transfer)や[GraphQL](https://ja.wikipedia.org/wiki/GraphQL)のようにある程度共通化されたアーキテクチャがありますね。

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

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

- 直接リンク: ログファイルを[NFS](https://ja.wikipedia.org/wiki/Network_File_System)等で共有
- 他のチームのデータの直接読み取り: 他のサービスの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年以上遅れていたかもしれません。

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

それでは良い一日を。