Envoy入門(その4)Lua
はじめに
マイクロサービスやWeb API界隈では、サービス間のネットワークの制御をライブラリではなく、プロキシのコンテナをサイドカーとして使うのだとか。そのデファクトスタンダード的な立ち位置なのが Envoy さん。
(その3)では、Envoy さんの Sandbox ではなく、Auth0 を使用した JWT 認証にチャレンジしましたが、今回は、(その1)や(その2)と同様、Envoy さんの Sandbox へ戻ります。
やってみた
Lua って
Lua さんです。
聞いたことはありましたが、使ったことはありません。Wikipedia さんでは、以下のような説明になっています。
Lua(ルア)はスクリプト言語およびその処理系の実装で、主にリオデジャネイロ・カトリカ大学(英語版)のコンピュータ科学科 (Department of Computer Science) および/または同大学附属研究所のTecgraf/PUC-Rioに所属するロベルト・イエルサリムスキー Roberto Ierusalimschy、Waldemar Celes、Luiz Henrique de Figueiredoらによって設計開発された。
まぁ、やってみましょう。
今回は、Lua filter です。
環境構築
今回も省略します。必要な方は、(その1) をご覧ください。
Lua filter
Envoy の Lua フィルターについては、ここ に書かれています。今回は、都度見ることにします。
Step 1
今回も Step 1 では、必要なものを全部作って、動かします。書いてあるとおりに動きます。
$ docker-compose pull
Pulling proxy ... done
Pulling web_service ... done
$ docker-compose up --build -d
Creating network "lua_default" with the default driver
Creating lua_proxy_1 ... done
Creating lua_web_service_1 ... done
$ docker-compose ps
Name Command State Ports
----------------------------------------------------------------------------------------------------------------
lua_proxy_1 /docker-entrypoint.sh /usr ... Up 10000/tcp, 0.0.0.0:8000->8000/tcp,:::8000->8000/tcp
lua_web_service_1 /bin/echo-server Up 0.0.0.0:8080->8080/tcp,:::8080->8080/tcp
いつものように docker-compose.yaml
で登場人物(と言っても2人ですが)を見ていきます。
今回は、Envoy が一つで lua_proxy_1
。内部サービスも一つで lua_web_service_1
。
これまでとは異なり、Envoy さんは、マルチステージビルドのターゲット envoy-lua
を指定してます。こちらを見ておくと、
./lib/mylibrary.lua
を取り込んでます。これも中身を見ておくと
ということで、外部の Lua のソースコードも取り込めるということですね。見たとおり M
オブジェクトに foobar
メソッドを付けた感じと思います。
内部サービスは、(その1)の echo2
ではなくて、echo
で、全く別のイメージですが、ま、名前のとおりなのでしょう。
Step 2
ということで、今回も実験します。今回も出力を絞り込まずに全量表示します。
$ curl -v localhost:8000
* Trying [::1]:8000...
* Connected to localhost (::1) port 8000
> GET / HTTP/1.1
> Host: localhost:8000
> User-Agent: curl/8.3.0
> Accept: */*
>
< HTTP/1.1 200 OK
< content-type: text/plain
< date: Wed, 06 Nov 2024 05:05:57 GMT
< content-length: 226
< x-envoy-upstream-service-time: 0
< server: envoy
<
Request served by 5d818f883517
GET / HTTP/1.1
Host: localhost:8000
Accept: */*
Foo: bar
User-Agent: curl/8.3.0
X-Envoy-Expected-Rq-Timeout-Ms: 15000
X-Forwarded-Proto: http
X-Request-Id: 7bf57a12-62cf-4e95-b1f1-51233ca1c779
* Connection #0 to host localhost left intact
Foo: bar
というリクエストヘッダーを内部サービスに送るようにした。ということですね。この動きのための設定は、以下の部分です。
Step 3
同じく全量表示です。
$ curl -v localhost:8000/multiple/lua/scripts
* Trying [::1]:8000...
* Connected to localhost (::1) port 8000
> GET /multiple/lua/scripts HTTP/1.1
> Host: localhost:8000
> User-Agent: curl/8.3.0
> Accept: */*
>
< HTTP/1.1 200 OK
< content-type: text/plain
< date: Wed, 06 Nov 2024 05:06:37 GMT
< content-length: 246
< x-envoy-upstream-service-time: 0
< header_key_1: header_value_1
< server: envoy
<
Request served by 5d818f883517
GET /multiple/lua/scripts HTTP/1.1
Host: localhost:8000
Accept: */*
Foo: bar
User-Agent: curl/8.3.0
X-Envoy-Expected-Rq-Timeout-Ms: 15000
X-Forwarded-Proto: http
X-Request-Id: b3046a4b-f73f-4f9b-9fc3-4a569af1da31
* Connection #0 to host localhost left intact
URL を /multiple/lua/scripts
に変えたら、Foo: bar
というリクエストヘッダーの追加に変わりありませんが、レスポンスヘッダーに header_key_1: header_value_1
も追加されています。こちらの設定は、この部分です。
おわりに
今回、Lua を取り上げたのは、Auth0 で RBAC(Role-Based Access Control)を設定して、JWT に反映された内容に応じた認可を Envoy で実現したかったためです。
ですから、たぶん、第5回もありますね。きっと。
Discussion