OpenResty Edge で gRPC リバースプロキシを構成するには、アプリケーションで HTTP/2 を有効にし、gRPC バックエンドを指すアップストリームを作成し、gRPC プロキシのスイッチをオンにしたページルールを追加します。ゲートウェイは gRPC 呼び出しをアップストリームにプロキシし、平文のみのオリジンに対してゲートウェイ側で TLS を終端し、すべての変更をリロードや再起動なしで全ゲートウェイサーバーに同期します。以下で一通り構成し、grpcurl で検証します。

OpenResty Edge が gRPC バックエンドサーバーの前段で gRPC リバースプロキシおよびロードバランサーとして動作する構成図

gRPC サンプルサーバーを準備し grpcurl でテストする

gRPC サンプルサーバーを用意しました。このサーバーの IP アドレスは .166 で終わります。リッスンポートは 8080 です。

以下は、サンプル gRPC サービスの protobuf 定義ファイルです。

cat hello_world.proto

ターミナルで cat hello_world.proto を実行しサンプル gRPC サービスの定義ファイルを表示

このサービスは、name パラメータに基づいて歓迎メッセージを返します。

name パラメータに基づいて歓迎メッセージを返す hello_world.proto の定義

grpcurl コマンドラインツールを使用して、このサービスの出力を確認できます。このツールは gRPC リクエストを送信し、受信したレスポンスを JSON 形式で表示します。gRPC サーバーが TLS 暗号化をサポートしていないため、ここでは “-plaintext” オプションを使用します。 name パラメータの値として “world” を使用します。上記で言及した gRPC サーバーのアドレスを入力します。最後に、gRPC サービスの名前を入力します。

grpcurl が平文でバックエンドサーバーに name を world とした gRPC リクエストを送信

リクエストを送信します。予想通り、“hello world” が返されました。

grpcurl のレスポンスに gRPC バックエンドサーバーが返した hello world が表示される

OpenResty Edge で gRPC サーバーをアップストリームとして追加する

次に、OpenResty Edge の背後にあるこの gRPC サーバーをアップストリームとして使用します。

gRPC バックエンドサーバーを OpenResty Edge の背後にアップストリームとして配置する構成図

いつものように、OpenResty Edge の Admin Web コンソールにアクセスしましょう。これはコンソールのサンプルデプロイメントです。各ユーザーは独自のローカルデプロイメントを持っています。

OpenResty Edge の Admin Web コンソールのトップページ

以前の例で使用した test-edge.com アプリケーションを引き続き使用できます。

OpenResty Edge のアプリケーション一覧に表示されるサンプルアプリ test-edge.com

そのアプリケーションに入ります。

OpenResty Edge で test-edge.com アプリケーションのダッシュボードに入る

gRPC 用に HTTP/2 を有効にする

gRPC は HTTP/2 を転送に使用します。HTTP/2 は OpenResty Edge ではデフォルトで有効になっています。

OpenResty Edge のアプリケーション設定で HTTP/2 がデフォルトで有効になっている様子

ここでは、Edge のアプリケーション設定で HTTP/2 を有効にする方法をお示しします。

OpenResty Edge のアプリケーション設定で HTTP/2 オプションの場所を確認

「Enabled」オプションを選択します。

OpenResty Edge で HTTP/2 の Enabled オプションを選択

変更を保存します。

OpenResty Edge で HTTP/2 設定の変更を保存

次に SSL ページに移動し、SSL 証明書が適切に設定されていることを確認します。

SSL ページを開き OpenResty Edge の証明書設定を確認

以前のチュートリアルで設定した証明書が表示されています。

test-edge.com アプリケーション用に以前設定した SSL 証明書

gRPC アップストリームを作成する

「Upstreams」ページに移動します。

OpenResty Edge の Upstreams アップストリームページに移動

バックエンドサーバー用の新しいアップストリームを作成します。

gRPC バックエンドサーバー用の新しいアップストリームを作成

このアップストリームに「grpc backend」という名前を付けます。

新しい gRPC アップストリームに grpc backend という名前を付ける

gRPC バックエンドサーバーが TLS 暗号化機能を有効にしている場合、ここで HTTPS を選択できます。

gRPC バックエンドが TLS 暗号化を有効にしている場合にアップストリームで HTTPS を選択

gRPC バックエンドサーバーのホストフィールドに、前述の IP アドレスを入力します。

ホストフィールドに gRPC バックエンドサーバーの IP アドレスを入力

ポート番号 8080 を入力します。

gRPC バックエンドのアップストリームにポート番号 8080 を入力

このアップストリームを保存します。

grpc backend アップストリームを保存

新しい「grpc backend」アップストリームが正常に作成されたことが確認できます。

grpc backend アップストリームが OpenResty Edge で正常に作成された様子

ページルールで gRPC プロキシを有効にする

では、このアップストリームを実際に使用するための新しいページルールを作成しましょう。

OpenResty Edge のページルール作成画面を開く

新しいページルールを作成します。

gRPC プロキシ用に新しいページルールを開始

URI プレフィックスに一致するルール条件を追加します。

gRPC プロキシのページルールに URI プレフィックス条件を追加

ページルールの URI プレフィックス条件を設定

「grpcurl」で使用されるこれらのリクエスト URI プレフィックスを入力します。

grpcurl が使用するリクエスト URI プレフィックスを入力

ここでプロキシを追加します。

ページルールにプロキシターゲットを追加

このスイッチをオンにして、gRPC プロキシを有効にします。

ページルールの「gRPC プロキシを有効にする」スイッチをオンにする

先ほど作成した gRPC アップストリームを選択します。

gRPC プロキシ用に grpc backend アップストリームを選択

grpc backend アップストリームが gRPC プロキシのターゲットとして選択された様子

このページルールを既存の他のルールの前に挿入します。

gRPC プロキシのページルールを既存の他のルールの前に挿入

このページルールを保存します。

gRPC プロキシのページルールを保存

追加したルールがページルールリストに表示されていることが確認できます。

gRPC プロキシのページルールが OpenResty Edge のルール一覧に表示される

いつものように、先ほどの変更をプッシュするために新しいバージョンをリリースする必要があります。

gRPC プロキシ設定をプッシュするため新しいバージョンのリリースを準備

このボタンをクリックします。

OpenResty Edge でリリースボタンをクリック

リリースします!

リリースを確定し新しい gRPC プロキシ設定をプッシュ

新しいバージョンがすべてのゲートウェイサーバーに同期されました。

新しいバージョンがすべてのゲートウェイサーバーに同期された様子

これで、新しいページルールがすべてのゲートウェイクラスターとサーバーにプッシュされました。

設定変更がリロードなしですべてのゲートウェイクラスターとサーバーに同期される様子

これらの設定変更にはサーバーのリロード、再起動、またはバイナリアップグレードは必要ありません。そのため、非常に効率的でスケーラブルです。

設定変更がサーバーのリロード・再起動・バイナリアップグレードなしで全ゲートウェイに伝播する構成図

ゲートウェイ経由で grpcurl を使って gRPC プロキシをテストする

ここで、ゲートウェイを通じて gRPC サービスをテストします。

OpenResty Edge ゲートウェイ経由で gRPC サービスをテストする構成図

引き続き grpcurl ツールを使用して gRPC サービスにアクセスします。

ドメイン名 test-edge.com とポート 443 を使用します。これにより OpenResty Edge ゲートウェイにヒットします。今回は Edge ゲートウェイが TLS 暗号化をサポートしているため、plaintext オプションは指定しません。

grpcurl がドメイン test-edge.com ポート 443 で TLS を用いて OpenResty Edge ゲートウェイに gRPC リクエストを送信

リクエストを送信します。

予想通り、“hello world” というメッセージが返されました。

grpcurl のレスポンスに OpenResty Edge ゲートウェイ経由で TLS 越しに返された hello world が表示される

ご覧のように、オリジンサーバーがサポートしていなくても、gRPC サービスは完全に TLS 暗号化を使用してアクセスできるようになりました。言い換えれば、OpenResty Edge はゲートウェイ側で TLS を終端しつつ、内部ネットワークでは平文の gRPC オリジンと通信します。バックエンドに手を加えることなく、公開側では暗号化された gRPC が得られます。OpenResty Edge は他のプロトコルも同じ方法でフロントできます。ドメイン名で生の TLS/TCP トラフィックをルーティングするには、OpenResty Edge での SNI プロキシの設定をご覧ください。

よくある質問

OpenResty Edge で gRPC リバースプロキシを構成するには?

アプリケーションで HTTP/2 を有効にし、gRPC バックエンド(ホストとポート)を指すアップストリームを作成し、gRPC のリクエスト URI プレフィックスに一致するページルールを追加して、そのアップストリームに対して「gRPC プロキシを有効にする」スイッチをオンにします。バージョンをリリースすると、ゲートウェイが gRPC 呼び出しをバックエンドにプロキシし始めます。

gRPC プロキシには HTTP/2 の有効化が必要ですか?

必要です。gRPC は HTTP/2 を転送に使用するため、プロキシを動作させるには HTTP/2 をオンにする必要があります。OpenResty Edge では通常デフォルトで有効になっており、gRPC のページルールを作成する前にアプリケーション設定で確認・切り替えできます。

OpenResty Edge は平文の gRPC バックエンドに対して TLS を終端できますか?

できます。本チュートリアルではオリジンの gRPC サーバーに SSL/TLS がありませんが、クライアントはドメイン test-edge.com ポート 443 で完全な TLS を通じてサービスにアクセスできます。ゲートウェイが公開側で TLS を終端し、内部では平文でオリジンに転送するため、バックエンドは証明書を扱う必要がありません。

gRPC プロキシをテストするには?

grpcurl を使用します。まず平文でオリジンに直接リクエストしてバックエンドの動作を確認し、次に同じリクエストを(plaintext オプションなしで)ゲートウェイのポート 443 に送り、TLS 経由のプロキシ経路を確認します。どちらも同じ結果——ここでは “hello world”——を返すはずです。

gRPC プロキシの設定変更にはサーバーのリロードや再起動が必要ですか?

不要です。バージョンをリリースすると、新しいページルールがすべてのゲートウェイクラスターとサーバーにリロード・再起動・バイナリアップグレードなしで同期されるため、変更の展開が速く、大規模なフリートでもスケールします。

OpenResty Edge について

OpenResty Edge は、マイクロサービスと分散トラフィックアーキテクチャ向けに設計された多機能ゲートウェイソフトウェアで、当社が独自に開発しました。トラフィック管理、プライベート CDN 構築、API ゲートウェイ、セキュリティ保護などの機能を統合し、現代のアプリケーションの構築、管理、保護を容易にします。OpenResty Edge は業界をリードする性能と拡張性を持ち、高同時接続・高負荷シナリオの厳しい要求を満たすことができます。K8s などのコンテナアプリケーショントラフィックのスケジューリングをサポートし、大量のドメイン名を管理できるため、大規模ウェブサイトや複雑なアプリケーションのニーズを容易に満たすことができます。

著者について

章亦春(Zhang Yichun)は、オープンソースの OpenResty® プロジェクトの創始者であり、OpenResty Inc. の CEO および創業者です。

章亦春(GitHub ID: agentzh)は中国江蘇省生まれで、現在は米国ベイエリアに在住しております。彼は中国における初期のオープンソース技術と文化の提唱者およびリーダーの一人であり、Cloudflare、Yahoo!、Alibaba など、国際的に有名なハイテク企業に勤務した経験があります。「エッジコンピューティング」、「動的トレーシング」、「機械プログラミング」 の先駆者であり、22 年以上のプログラミング経験と 16 年以上のオープンソース経験を持っております。世界中で 4000 万以上のドメイン名を持つユーザーを抱えるオープンソースプロジェクトのリーダーとして、彼は OpenResty® オープンソースプロジェクトをベースに、米国シリコンバレーの中心部にハイテク企業 OpenResty Inc. を設立いたしました。同社の主力製品である OpenResty XRay動的トレーシング技術を利用した非侵入型の障害分析・トラブルシューティングツール)と OpenResty Edge(マイクロサービスおよび分散トラフィックに最適化された多機能ゲートウェイソフトウェア)は、世界中の多くの上場企業および大企業から高い評価を得ております。OpenResty 以外にも、章亦春は Linux カーネル、Nginx、LuaJITGDBSystemTapLLVM、Perl など、複数のオープンソースプロジェクトに累計 100 万行以上のコードを寄与し、60 以上のオープンソースソフトウェアライブラリを執筆しております。

翻訳

英文版の原文と日本語訳版(本文)をご用意しております。読者の皆様による他の言語への翻訳版も歓迎いたします。全文翻訳で省略がなければ、採用を検討させていただきます。心より感謝申し上げます!