gRPC-WebでブラウザからGoBGPを制御

FUJITA Tomonori
nttlabs
Published in
5 min readNov 1, 2018

こんにちは、NTTの藤田です。

Webブラウザから直接、gRPCサービスを利用できる、gRPC-Webが正式リリースになったので、試してみました。

BGPとGoBGP?

BGPを知らない?ご安心を。この記事を読むためにBGPの知識は必要ありません。少しだけ説明すると、BGPはインターネットで使われるルーティングプロトコルです。きっと、ネットワークに詳しい人が設定してくれているので、知らなくても大丈夫ですが、最近は、データセンタネットワークやコンテナオーケストレーション、サービスチェイニング、DDoS対策など、その用途が広がってきているので、勉強してみるのもいいかもしれません。周りのネットワークの人に軽い気持ちで質問すれば、一晩中、BGPについて教えてもらえるはずです。

GoBGPは、私が、2014年に実装を始めたGo言語のBGP実装です。特徴の一つに、その制御がgRPCを使ったAPIで実行される点があります。従来のBGP実装のように、CLIでの制御や、ファイルを使った設定もサポートしていますが、いずれの機能も内部でgRPCのAPIを利用して実現されています。

gRPC-Webとは?

gRPCは、Go言語をはじめとして、様々な言語をサポートしたRPCのフレームワークです。ブラウザからgRPCのサービスを利用したい場合は、REST JSON APIとgRPCの変換が必要となり、例えば、grpc-gatewayをリバースプロキシサーバとして利用します。このアプローチは、gRPCのAPIに加えて、REST APIの設計、運用などが必要になる問題がありました。

gRPC-Webは、gRPCプロジェクトの一部で、ブラウザのJavaScriptから直接gRPCを利用できるようにするのもので、REST APIが不要になります。

gRPC-Web試してみた

最初から、残念なニュースですが、現在のgRPC-Webの実装は、まだ、プロキシを必要とします。 ブラウザの機能の制限により、gRPCプロトコルと微妙な違いがあるからです。将来的には、プロキシが不要になる方向の取り組みもされているようですので、期待しましょう。

今回試した全体の構成は下記のとおりです。gRPC-Webをサポートしたプロキシには、公式のチュートリアル同様、envoyを利用しました。

全体構成

ProtoファイルからJSの生成

まずは、gRPCのIDLであるGoBGPのProtoファイルから、ブラウザのためのJavaScriptコードを生成します。

$ protoc -I=/mnt/protobuf/src -I=. --js_out=import_style=commonjs:. --grpc-web_out=import_style=commonjs,mode=grpcwebtext:. gobgp.proto
$ ls *.js
gobgp_grpc_web_pb.js gobgp_pb.js

もろもろのソフトウェアのインストールなどが面倒な方は、生成済みのファイルを使ってください。公式サイトのDockerfileを利用すると、簡単に環境が構築できます。

私はJavaScriptについて何も知らないので、ポート番号8080に接続し、GoBGPの設定を取得するGetBgp APIを実行する、下記の簡単なクライアントコードを使いました。あとは、webpackでmain.jsを生成しましょう。面倒な方は、生成済みのファイルを使ってください。

動作させましょう

最低限の設定をしたGoBGPとEnvoyを立ち上げ、接続します。

$ docker run -d -p 9090:9090 --name gobgp-server gobgp/grpcweb-gobgp
$ docker run -d -p 8080:8080 --link gobgp-server:gobgp-server gobgp/grpcweb-envoy

先ほど生成したクライアントファイルが置いてあるディレクトリで、HTTPサーバを立ち上げましょう。

$ python -m SimpleHTTPServer 8081

ブラウザでローカルホストの8081番にアクセスすると、ポート番号8080のenvoyに接続し、envoyがポート番号9090にリクエストを転送します。その結果、下記のようにレスポンスの内容が表示されたら成功です。

GoBGPの設定が表示されました

--

--

FUJITA Tomonori
nttlabs

Janitor at the 34th floor of NTT Tamachi office, had worked on Linux kernel, founded GoBGP, TGT, Ryu, RustyBGP, etc. https://twitter.com/brewaddict