オンプレのシステム連携では、長らくSOAP WebサービスやシンプルなRESTful APIが主流でした。ところがクラウドへの移行が進むにつれ、「GraphQL」「gRPC」という名前を耳にする機会が増え、「結局どれを選べばいいのか」と判断に迷うエンジニアが増えています。
この記事では、REST API・GraphQL・gRPCの3つを現場目線で比較し、どのユースケースで何を選ぶべきかをオンプレ経験者にも伝わる言葉で整理します。AWSとAzureのサービス対応状況や、移行時のよくある落とし穴も含めて解説します。
なぜクラウド時代にAPI設計の選択肢が増えたのか
オンプレミスのシステムは、多くの場合「内部ネットワークで固定の相手と通信する」という前提で設計されていました。通信相手も、通信内容も比較的固定されていたため、SOAPやRESTのどちらかで十分に対応できていたのです。
ところがクラウドの世界では事情が異なります。
・クライアントの多様化: Webブラウザ・スマートフォン・IoTデバイス・他社APIなど、通信する相手の種類が格段に増えた
・マイクロサービス化: 1つのアプリケーションが数十のサービスに分割され、それぞれが互いにAPIで会話する構成が標準になった
・リアルタイム性の要求: 数秒のラグも許容されないユーザー体験が求められるようになった
こうした背景から、「目的に合ったAPI設計を選ぶ力」がインフラエンジニアにも求められるようになりました。
3つのAPIの基本を整理する
まずは3つのAPIについて、特徴を一言で押さえておきます。
1. REST API(Representational State Transfer)
HTTP/HTTPSをベースにしたAPIスタイルで、リソース(データ)をURLで表現し、GET・POST・PUT・DELETEのHTTPメソッドで操作します。2000年代から普及が進み、現在も最も広く使われている設計スタイルです。
オンプレのWebシステムに組み込まれたAPIはほぼ全てRESTかSOAPです。クラウドの各サービス(AWS・Azureともに)もREST APIを標準のインターフェースとして提供しています。
2. GraphQL
Facebookが2015年にオープンソース化したクエリ言語とランタイムです。クライアント側が「取得したいフィールドを指定してリクエストする」という独特の仕組みを持っています。
RESTでは「/users/{id}」にGETすると固定されたフィールドが全部返ってきますが、GraphQLでは「名前とメールアドレスだけ返してほしい」とクライアントが明示的に指定できます。
3. gRPC(gRPC Remote Procedure Calls)
Googleが開発したRPC(Remote Procedure Call)フレームワークで、Protocol Buffersというバイナリ形式のデータシリアライズを使います。HTTP/2をベースに動作し、双方向ストリーミングも可能です。
オンプレ時代のRPCやCORBAをイメージしてもらうと近いですが、gRPCはHTTP/2上で動くため、ファイアウォール越えがRESTと同様に扱えます。
3つを徹底比較する
| 項目 | REST API | GraphQL | gRPC |
|---|---|---|---|
| 通信プロトコル | HTTP/1.1・HTTP/2 | HTTP/1.1・HTTP/2 | HTTP/2(必須) |
| データ形式 | JSON(主流)・XML | JSON | Protocol Buffers(バイナリ) |
| スキーマ定義 | 任意(OpenAPI推奨) | 必須(Schema Definition Language) | 必須(.protoファイル) |
| 通信効率 | 中程度 | 中程度(オーバーフェッチ削減) | 高い(バイナリ・HTTP/2多重化) |
| ブラウザ対応 | ◎ネイティブ対応 | ◎ネイティブ対応 | △(grpc-web変換が必要) |
| 双方向通信 | △(WebSocket別途) | △(Subscription拡張) | ◎(ストリーミングネイティブ) |
| 学習コスト | 低い | 中程度 | 高い |
| 主な用途 | 公開API・CRUD操作 | モバイル・BFF層 | マイクロサービス間通信 |
それぞれのユースケースを現場視点で解説する
REST APIが向いている場面
REST APIはシンプルさが最大の武器です。HTTPさえ理解していれば誰でも使える汎用性の高さは、外部へ公開するAPIや、チームをまたいだ連携に向いています。
・外部公開API: パートナー企業や第三者開発者に公開するAPIはRESTが標準。ドキュメント整備(Swagger/OpenAPI)も充実している
・CRUD操作が中心のシステム: 「ユーザーを登録・取得・更新・削除する」など、リソース操作が主体のバックエンドはRESTが最も相性がよい
・小中規模のWebアプリケーション: サービス数が少なく、マイクロサービス化の予定もない場合はRESTで十分
AWSのAPIはほぼすべてRESTです。AWS SDKを使わずにCLIやcurlでAWSを操作するとき、内部ではREST APIが呼ばれています。
GraphQLが向いている場面
GraphQLの特徴は「クライアントがデータの形を指定できる」点です。モバイルアプリのように、通信量を最小化したい場面で真価を発揮します。
・モバイルアプリのバックエンド: 画面ごとに必要なフィールドが異なるモバイルアプリでは、RESTの固定レスポンスは無駄が多い。GraphQLで必要なフィールドだけを取得することで通信量を大幅に削減できる
・BFF(Backend For Frontend)層: Webフロントエンド・モバイル・管理画面など複数のクライアントが存在するシステムで、GraphQLをBFF層に置き、クライアントごとの差異を吸収する設計が有効
・複雑なデータ関係の一括取得: 「ユーザーと、そのユーザーの注文と、各注文の商品情報を一度に取得したい」といった複数リソースをまたぐ要求を1リクエストで処理できる
AWS AppSync はGraphQLのマネージドサービスです。DynamoDB・Lambda・RDSをデータソースとして、GraphQL APIを素早く構築できます。
gRPCが向いている場面
gRPCはマイクロサービス間の内部通信に最も適しています。バイナリ通信とHTTP/2の多重化により、大量のリクエストを低レイテンシで処理できます。
・マイクロサービス間の内部通信: 同一クラスター内や閉域網内でサービス同士が頻繁に通信する場合、gRPCの通信効率はRESTを大幅に上回る
・ストリーミングが必要なシステム: ログのリアルタイム収集・音声・動画ストリーミング・チャットなど、双方向の継続的な通信が必要な場面ではgRPCのストリーミング機能が活きる
・多言語マイクロサービス環境: .protoファイルからGo・Python・Java・C#など複数言語のコードを自動生成できるため、異なる言語で書かれたサービスが混在する環境でも型安全な通信が担保される
Amazon EKS上のKubernetesクラスターで動くマイクロサービス間通信や、AWS App Mesh(Envoy)を使ったサービスメッシュ環境でgRPCを活用するケースが増えています。
# gRPC .protoファイルの例(サービス定義) syntax = "proto3"; package user; service UserService { rpc GetUser (GetUserRequest) returns (UserResponse); rpc ListUsers (ListUsersRequest) returns (stream UserResponse); # サーバーストリーミング } message GetUserRequest { string user_id = 1; } message UserResponse { string user_id = 1; string name = 2; string email = 3; }
AWS・Azure でのサービス対応状況
| API方式 | AWS対応サービス | Azure対応サービス |
|---|---|---|
| REST API | Amazon API Gateway(REST API)、AWS AppSync(HTTP Resolver) | Azure API Management、Azure App Service |
| GraphQL | AWS AppSync(ネイティブ対応) | Azure API Management(GraphQLパス設定) |
| gRPC | Amazon EKS + Envoy/Istio、AWS App Mesh | Azure Kubernetes Service(AKS)、Azure API Management(gRPC対応 2024年~) |
注意点: Amazon API Gateway は HTTP API モードではgRPCをネイティブサポートしていません(2026年6月時点)。gRPCをAPIゲートウェイ経由で公開したい場合は、Network Load Balancer(NLB)やApplication Load Balancer(ALB)+EKSのEnvoyプロキシを組み合わせるアーキテクチャが一般的です。
選び方の判断フロー
現場でAPI方式を選ぶときは、以下の順番で判断するとほぼ迷いません。
Step 1: 外部公開APIか内部通信か
→ 外部公開(パートナー・第三者・ブラウザから直接アクセス)→ RESTかGraphQLを検討
→ 内部通信(クラスター内・VPC内のマイクロサービス間)→ gRPCを検討
Step 2: クライアントの種類は均一か多様か
→ 1種類のクライアント(Webアプリのみ等)→ RESTで十分
→ Web・モバイル・IoTなど複数 → GraphQLのBFF層を検討
Step 3: リアルタイムストリーミングが必要か
→ 必要 → gRPCのストリーミングまたはWebSocket
→ 不要 → RESTまたはGraphQL
Step 4: チームのスキルセットはどうか
→ REST経験のみ → REST APIから始める(gRPCは学習コストが高い)
→ フロントエンド開発者と密連携 → GraphQLの採用で協業しやすい場合がある
移行・採用時のよくあるトラブルと対処法
REST→GraphQL移行:N+1問題が発生する
GraphQLの便利さに惹かれて採用したものの、リレーション先のデータを都度取得するN+1クエリが発生してパフォーマンスが劣化するケースに注意が必要です。DataLoaderライブラリを使ったバッチ処理か、DynamoDBのアクセスパターンを事前設計してResolver内での二重クエリを排除することが対策になります。
gRPC採用:ブラウザから直接呼べない
gRPCはHTTP/2のトレーラー機能を使うため、ブラウザのXHR/Fetch APIでは直接呼べません。フロントエンドからgRPCサービスを呼びたい場合は、grpc-webプロキシ(Envoy)をAPIゲートウェイ前段に立てるか、フロント向けにはRESTに変換するTranscoding(Google Cloud EndpointsやAWS API GatewayのgRPCトランスコーディング)を検討します。
REST API:エンドポイントの爆発的増加
マイクロサービス化が進むと、「/users」「/orders」「/products」「/reviews」…と個別エンドポイントが数十~数百に増えて管理コストが急増します。Amazon API GatewayやAzure API Managementを活用してAPIゲートウェイ層で一元管理し、スロットリング・認証・ロギングをまとめて処理するアーキテクチャを早めに整備することを勧めます。
GraphQL:スキーマの後方互換性管理が複雑
REST APIは「v1→v2」のバージョニングが比較的容易ですが、GraphQLはスキーマが一元化されているため、フィールドの削除・型変更が既存クライアントに即影響します。フィールドを削除する際は@deprecatedディレクティブで段階的に廃止するフローを運用ルールとして定めておく必要があります。
本記事のまとめ
REST API・GraphQL・gRPCの3つは、それぞれ異なる強みを持つ補完的な選択肢です。
・REST API: 汎用性が最も高く、外部公開・CRUD中心のシステムではこれが基本選択
・GraphQL: 多様なクライアントが存在する場合や、通信データ量を最小化したいモバイル・BFF層で有効
・gRPC: マイクロサービス間の高スループット内部通信・双方向ストリーミングに最適
「どれか1つが正解」ではなく、システムのレイヤーと用途に応じて組み合わせるのが現代のクラウド設計です。EKS上のサービス間をgRPCで結び、外部向けAPIはAmazon API GatewayのREST APIとして公開し、モバイルアプリのBFF層にAWS AppSyncのGraphQLを置く——という構成が、2026年現在のスタンダードなアーキテクチャになっています。
Linuxサーバー上でAPIサーバーを動かす際の基礎知識については、姉妹サイトLinuxMaster.JPで詳しく解説しています。
「REST・GraphQL・gRPC、どれを選べばいい?」まだ迷っていませんか?
API設計の選択は、チームのスキルセットと将来のアーキテクチャ方針まで含めて判断する必要があります。
オンプレの経験を活かしながら、現場で使えるクラウドスキルを体系的に身につけたい方へ、メルマガで実践的なクラウド活用ノウハウをお届けしています。
