その内容について社内でいくつか質問を受けたので、補足説明をまとめてみます。
まずは引用元を。
Lena Moritaさんの覚醒するアクセシビリティで、社内で話したのはその中のベゾスのAPIマニフェストです。ちなみに実際に紹介したのは上記のスライドではなく、Amazonは世界一の失敗をする企業だ | Think IT(シンクイット)という記事です。
どんな内容?
Think Itのこの部分です。
ー全てのチームはサービスインターフェイスを通じてその機能やデータを公開しなければならない
-チームのコミュニケーションはインターフェイスを通じて行われる
-インターフェイスを通じたもの以外のあらゆるプロセス間通信は許可されない。
直接的にリンクする事、他のチームのデータを直接見ること、共有メモリモデルによる
コミュニケーション、バックドアその他の手段すべてに対してこれは適用される。
唯一許可されるコミュニケーションは、ネットワーク越しにインターフェイスを叩くことのみである。
-どの様なテクノロジーを使っていたとしてもこのルールは変わらない。
-どの様なサービスインターフェイスも例外なく公開されることを前提に根底から
デザインされなければならない。つまりチームはインターフェイスを開発者に
公開できるようプラン、設計を行わなければならない。例外は認められない。
そしてこれらを選択肢の1つだと考えているAmazonの従業員たちに対し、
ベゾスはこう締めくくっている。
「これを守れない社員はクビにする。では今日もいい日を」
補足説明
インターフェースとは?
ここでいうインターフェースとは、(社内で話した文脈では)ウェブAPIとほぼ同義です。ただし、ベゾス自身は「どの様なテクノロジーを使っていたとしてもこのルールは変わらない。」と言っていることから、ウェブAPI以外も想定しているかもしれませんが、とにかくサービスは内部データにアクセスする手段を(SQLを直接発行する等の手段を使わず)正式に提供せよという意図なのは間違いないでしょう。
では、正式な手段さえ提供されていればウェブAPIでなくてもよいのではないか、つまりAPIを経由しなくてもブラウザーからHTMLデータとして閲覧する手段があればいいのではないか?と思うかもしれません。
しかし、「チームはインターフェイスを開発者に公開できるようプラン、設計を行わなければならない。」という文言があります。
ここのポイントは「開発者」です。開発者がアクセスするものはAPIですよね。
例外は認めない、とは?
言葉通りの意味です。たとえ「アカウントを凍結されたユーザー一覧を取得するAPI」のように社内の人間、それも管理者権限を持つ人間しか使わないようなAPIであろうともです。
ちなみに原文では
That is to say, the team must plan and design to be able to expose the interface to developers in the outside world.とあります。そう、全世界の開発者がアクセスすることを前提とせよ、という意味です。
おそらく、第三者がスマートフォンアプリ等を作成できるようにすることを想定しているのでしょう。
公開しないとダメなの?
「そんなこと言ったって絶対に限られた場所からしか使われないAPIもあるし、そういったAPIは内部ネットワークからしかアクセスできないように制限してるんだけど、本当に全てのAPIを全世界に公開しなきゃダメなの?」という意見もあると思います。その質問に対する答えはNOです。つまり、全てのAPIを公開する必要はありません。
もう一度引用元の言葉を確認すると、
チームはインターフェイスを開発者に公開できるようプラン、設計を行わなければならない。と書いてあります。
つまり今すぐ全てのAPIを公開せよというわけではなく、必要になったときにすぐ公開できるような設計にしなさいという意味です。
具体的にはこんな感じでしょうか。
- 前段のWAFやACLで守られていることを前提とせず、API自体に適切な認証機能をつけなさい
- 想定外の使い方にも耐えられるように、セキュリティーに手を抜いてはいけません
- 使われる場所が限られていると想定せず、内部APIであろうともきちんとバージョン管理しなさい
IPアドレスによるアクセス制限をしてはいけない、という意味ではありません。
まとめ
ベゾスが言いたいことは実にシンプルです。- アクセスする必要のあるデータは必ずAPIを用意せよ
- そのAPIは、全世界に公開することを前提として設計せよ
- 一切の例外は認めない
これはマイクロサービスの根源的な考えで、複雑化するAmazonのサービスを互いにうまく扱えるようにしたものでしょう。
では今日もいい日を。
0 件のコメント:
コメントを投稿