Google Cloud Platform

gRPC API を Cloud Endpoints で管理する

私たち Google はこの 2 年間、gRPC に多大な投資を行ってきました。投資の対象は、このオープンソース フレームワーク自体と、gRPC ベースの API です。私たちは gRPC をマイクロサービスの基本要素としてだけでなく、多くのパブリック API(特に、レイテンシ許容度が低い API、双方向ストリーミングが必要な API、モバイル利用が多い API)の基本要素としても位置づけています。

そしてこのたび、gRPC API を定義して実行し、gRPC および JSON-HTTP/1.1 インターフェースを Google Cloud Endpoints によってクライアントに提供できるようになりました。

私たちが最近リリースした API の大半は、gRPC と JSON-HTTP/1.1 の両方のインターフェースを提供します。私たちは 2016 年 3 月に Cloud Pub/Sub で gRPC をサポートしたのを皮切りに、gRPC を使用する API を着々と発表してきました。たとえば、Cloud Bigtable APICloud Pub/Sub APICloud Vision APICloud Datastore APICloud Speech API などがそうです。最近発表した Cloud Spanner API もその中に含まれます。

gRPC インターフェースの提供により、レイテンシと帯域幅に関する厳しい要件に対応しやすくなるほか、すべてのクライアントが互換性のあるクライアント ライブラリを使用するように指定できます。

grpc.png
しかし、私たちはこれらの API の JSON-HTTP/1.1 インターフェースも引き続き提供しています。多くの開発者が JSON を快適に利用しているからです。

JSON は使い始めるのも簡単です(curl で呼び出したり、リクエストをブラウザに貼り付けて実行したりできます)。ほとんどすべてのプラットフォームで幅広い言語に対応した素晴らしい JSON ライブラリが利用できるのです。ストリーミングや高パフォーマンスが必要な API では gRPC への移行が進んでいますが、それでも JSON-HTTP/1.1 のサポートは依然として高い優先順位を占めています。

そうしたなか、お客様の API にも gRPC および JSON-HTTP/1.1 の両方のインターフェースを提供できるようになりました。

Cloud Endpoints は gRPC ベース API をフルサポートしています(HTTP/1.1 API 用の優れた Endpoints 機能を gRPC API 用にもすべて提供します。その中には認証、モニタリング、ロギング、トレーシング、API キーなどが含まれます)。また、Extensible Service Proxy が JSON-HTTP/1.1 呼び出しを変換するので、API を 1 回作成すれば、両方のインターフェースを提供できます。

Cloud Endpoints を使った gRPC API の管理は簡単です。.proto ファイルで gRPC サービスを定義し、その gRPC インターフェースを REST JSON にマッピングする YAML 構成ファイルを追加します。

たとえば、以下は Bookshelf を定義するシンプルなサービスです。

  import "google/protobuf/empty.proto";
// A simple Bookstore API.
//
// The API manages shelves and books resources. Shelves contain books.
service Bookstore {
  // Returns a list of all shelves in the bookstore.
  rpc CreateShelf(CreateShelfRequest) returns (Shelf) {}
  // Returns a specific bookstore shelf.
  rpc GetShelf(GetShelfRequest) returns (Shelf) {}
}
// A shelf resource.
message Shelf {
  // A unique shelf id.
  int64 id = 1;
  // A theme of the shelf (fiction, poetry, etc).
  string theme = 2;
}
// Request message for CreateShelf method.
message CreateShelfRequest {
  // The shelf resource to create.
  Shelf shelf = 1;
}
// Request message for GetShelf method.
message GetShelfRequest {
  // The ID of the shelf resource to retrieve.
  int64 shelf = 1;
}

サービスを構成する YAML は、サービスの RPC インターフェースを RESTful パスにマッピングする方法を Endpoints に指示します。

  type: google.api.Service
config_version: 3
name: bookstore.endpoints..cloud.goog
title: Bookstore gRPC API
apis:
- name: endpoints.examples.bookstore.Bookstore
Http:
  rules:
  # 'CreateShelf' can be called using the POST HTTP verb and the '/shelves' URL
  # path. The posted HTTP body is the JSON respresentation of the 'shelf' field
  # of 'CreateShelfRequest' protobuf message.
  #
  # Client example:
  #   curl -d '{"theme":"Music"}' http://DOMAIN_NAME/v1/shelves
  #
  - selector: endpoints.examples.bookstore.Bookstore.CreateShelf
    post: /v1/shelves
    body: shelf
  #
  # 'GetShelf' is available via the GET HTTP verb and '/shelves/{shelf}' URL
  # path, where {shelf} is the value of the 'shelf' field of 'GetShelfRequest'
  # protobuf message.
  #
  # Client example - returns the first shelf:
  #   curl http://DOMAIN_NAME/v1/shelves/1
  #
  - selector: endpoints.examples.bookstore.Bookstore.GetShelf
    get: /v1/shelves/{shelf}

サービスを構成する YAML には認証方法も指定します(たとえば、指定したサービス アカウントにのみ API の呼び出しを許可します)。

  #
# Request authentication.
#
authentication:
  providers:
  - id: google_service_account
    # Replace SERVICE-ACCOUNT-ID with your service account's email address.
    issuer: SERVICE-ACCOUNT-ID
    jwks_uri: https://www.googleapis.com/robot/v1/metadata/x509/SERVICE-ACCOUNT-ID
  rules:
  # This auth rule will apply to all methods.
  - selector: "*"
    requirements:
      - provider_id: google_service_account

コード変換マッピングの作成方法については、こちらの詳細なドキュメントをご覧ください。

gRPC / Endpoints のサンプルは、PythonGoJavaNode.js の 4 言語で用意されています。幸いなことに、すでに多くのお客様が gRPC と Endpoints を組み合わせて使用しています。サンプルに関して質問がありましたら、Google Group でお問い合わせください。そしてぜひ API を作成してみてください。

* この投稿は米国時間 4 月 26 日、Product Manager である Dan Ciruli によって投稿されたもの(投稿はこちら)の抄訳です。

- By Dan Ciruli, Product Manager