こんにちは!ネットワークやAPIの世界へようこそ。インフラアーキテクトの私が、日々の現場で感じる技術の面白さを、あなたにお届けします。
Webアプリケーションを作ったり、スマホアプリとデータをやり取りしたりするときに欠かせないのが「Web API」ですね。今回は、そのAPIの設計において避けて通れない、かつ永遠のテーマとも言える「URIバージョニング(例: /v1/users)」について、じっくり紐解いていきたいと思います。
「なんだか難しそうな英語が出てきたな…」と思われた方も大丈夫です。一歩ずつ、身近な例えから優しく解説していきますので、コーヒーでも飲みながらリラックスして読んでいってくださいね。
—
そもそもAPIの「バージョン」って何だろう?
私たちが普段使っているスマホアプリやWebサービスは、日々アップデートを繰り返していますよね。「昨日までになかった新しい機能が追加された!」「画面の見た目がすっきりした!」なんて経験は誰にでもあるはずです。
APIもこれと全く同じです。APIは、いわば「システム同士が会話するための共通の言葉(お作法)」ですが、サービスの成長とともに、その言葉のルールを変えたくなる日がやってきます。
例えば、最初は「ユーザーの名前」だけをやり取りしていたAPIがあったとします。
{
"name": "山田 太郎"
}
しばらくして、「やっぱり姓と名に分けたいよね」「年齢や住所も追加したいよね」となりました。ここで既存のルールをガラリと変えてしまうと、古いアプリを使っているユーザーの画面が真っ白になったり、エラーを起こしたりしてしまいます。
ここで登場するのが「バージョニング」です。「古いお部屋(バージョン1)はそのまま残しておくので、新しいお部屋(バージョン2)の準備ができた人から引っ越してくださいね」という、優しさの仕組みなんですね。
—
現実世界で例えてみよう:郵便配達の宛先システム
このバージョニングの仕組み、実は私たちの身の回りにある「郵便配達」にそっくりです。
想像してみてください。ある街の郵便配達システムで、宛先の書き方が新しくなるとします。
- 昔の書き方: 「〇〇市 1-2-3 山田様宛」
- 新しい書き方: 「〇〇市 1-2-3 (新地区A) 山田様宛」
もし、ある日突然、郵便局が「今日から古い書き方の手紙は一切配達しません!」と言い出したら、街中が大パニックになりますよね。
だからこそ、現実世界では移行期間を設けます。APIにおけるURIバージョニング(/v1/users や /v2/users のようにURLにバージョンを入れる手法)は、いわば「封筒の宛先に『第1版宛』『第2版宛』と大きなハンコを押して、配達ルートを完全に分ける方法」なのです。
—
URIバージョニングの強力なメリット
URLのパスに /v1/ や /v2/ を含めるこの手法は、世界中の多くのWebサービスで採用されています。その理由は、主に以下の2つの強力なメリットがあるからです。
1. ブラウザやログで一目でバージョンが分かる(視認性の高さ)
URLを見れば、それがどの仕様に基づいているのかが誰の目にも一目瞭然です。
https://api.example.com/v1/users(あ、これは古い安定版だな)https://api.example.com/v2/users(お、こっちは最新の機能が使えるんだな)
開発中のブラウザ確認や、サーバーのエラーログを眺めているとき、「あ、今どっちのバージョンで通信しているんだっけ?」と迷うことがありません。インフラエンジニアやフロントエンドエンジニアにとって、この「直感的に分かる」というのは、トラブルシューティングのスピードを何倍にも上げてくれる素晴らしい美点なのです。
2. キャッシュサーバーの恩恵を受けやすい
インターネットの世界には、一度取得したデータを一時保存して、次に同じリクエストが来たときに素早く返す「キャッシュ」という仕組み(CDNやリバースプロキシなど)が存在します。
URIにバージョンが含まれていると、URLそのものが変わる(/v1/... から /v2/... へ)ため、キャッシュサーバーにとっても非常に分かりやすいのです。「/v1/ のデータはこのルールでキャッシュし、/v2/ のデータは別のルールで扱う」という切り分けが、ネットワーク機器やクラウドの設定(AWSのCloudFrontなど)で非常にシンプルに実現できます。
—
ちょっと待って!URIバージョニングが抱える「モヤモヤするデメリット」
ここまで聞くと「URIバージョニングって最高じゃん!」と思われるかもしれませんが、実はWeb APIの設計思想(RESTの原則)を愛する人たちの間では、長い間アツい議論が交わされているポイントでもあります。
それが「リソースの識別子としての純粋性が損なわれる」という問題です。
1. リソース(本質)と、バージョン(表現方法)の混同
REST APIの美学において、URL(URI)とは「そのデータ(リソース)がどこにあるかを示す住所」であるべきだとされています。
例えば、「ユーザー」というリソースの住所は、本来であればシンプルに https://api.example.com/users であるべきです。
そこに /v1/ や /v2/ という「システムの都合上のバージョン情報」がURLの一部に入り込んでしまうと、「あれ?ユーザーという人間は1人なのに、住所がバージョンごとにいくつも存在することになっちゃうぞ?」という、RESTの哲学的なモヤモヤが生じるのです。
2. URLが変わると、リンクやブックマークの寿命が切れる
バージョンが /v1/ から /v2/ に上がったとき、URLの文字列そのものが変わるため、外部のシステムが古いURLをそのままブックマークしていたり、リンクとして持っていたりした場合、リンク切れ(404 Not Found)を起こしてしまいます。
もちろん、古いバージョンをしばらく並行稼働させることで緩和はできますが、インフラを管理する立場からすると、古いバージョン用のサーバーやコンテナをいつまでも維持し続けるのは、セキュリティやコストの面で頭が痛い問題になり得ます。
—
実務での実装例:Python (Flask) で見てみよう
百聞は一見にしかず。実際にPythonの軽量フレームワークであるFlaskを使って、URIバージョニングを取り入れたAPIのルーティングを書いてみましょう。
from flask import Flask, jsonify
app = Flask(__name__)
# --- バージョン1のユーザー取得API ---
# URLパスに /v1/ が含まれています
@app.route('/v1/users', methods=['GET'])
def get_users_v1():
# v1の仕様では、名前(name)だけのシンプルなデータを返します
users_v1 = [
{"id": 1, "name": "山田 太郎"},
{"id": 2, "name": "佐藤 花子"}
]
return jsonify(version="v1", data=users_v1)
# --- バージョン2のユーザー取得API ---
# URLパスに /v2/ が含まれています
@app.route('/v2/users', methods=['GET'])
def get_users_v2():
# v2の仕様では、姓と名、さらにメールアドレスも返すように進化しました
users_v2 = [
{"id": 1, "first_name": "太郎", "last_name": "山田", "email": "yamada@example.com"},
{"id": 2, "first_name": "花子", "last_name": "佐藤", "email": "sato@example.com"}
]
return jsonify(version="v2", data=users_v2)
if __name__ == '__main__':
# ローカルサーバーを起動(開発用)
# 実際の本番環境では、GunicornやuWSGIなどのWSGIサーバーを経由して公開します
app.run(host='0.0.0.0', port=5000, debug=True)
このようにコードを書くと、http://localhost:5000/v1/users と http://localhost:5000/v2/users で綺麗に処理を分岐させることができます。コードの見通しも良く、初学者の方にとっても直感的に理解しやすい形ではないでしょうか。
—
まとめ:どうやってバージョン管理を選ぶべき?
今回は、URIバージョニング(/v1/users)のメリットとデメリットについて、ネットワークや現実世界の例えを交えて解説してきました。
- メリット: ブラウザやログで一目で分かり、キャッシュの制御やルーターの設定がしやすい(開発・運用が直感的でラク)。
- デメリット: RESTの思想的観点から見ると「純粋なリソースの住所」ではなくなり、URLが変わることでリンク切れの配慮が必要になる。
「じゃあ結局、どれを使えばいいの?」という疑問が湧くと思います。
結論として、多くのプロジェクトやチーム開発においては、分かりやすさと開発スピードの観点から、このURIバージョニング(URLパス方式)を採用するのが最も現実的で安全です。
もちろん、HTTPヘッダー(Accept: application/vnd.example.v2+json など)を使ってURLを汚さないスマートな手法(ヘッダーバージョニング)もありますが、デバッグのしやすさやインフラ層でのルーティングの容易さを考慮すると、まずはURIバージョニングからスタートするのが王道であり、多くの現場で歓迎される選択肢です。
ご自身の作るサービスやチームの規模に合わせて、最適なバランスを選んでみてくださいね。それでは、また次回の技術解説でお会いしましょう!
コメント