本日は、OpenResty Edge のもう一つの優れた機能をご紹介いたします。それは、ルールベースの小言語である Edge 言語(略して Edgelang)の使用方法です。

Edgelang の紹介

ユーザーは Edgelang を使用して、複雑なゲートウェイルールを記述することができます。これらのルールは、カスタム認証、リクエストとレスポンスの書き換え、動的アップストリームルーティングの設定などに使用できます。これらのルールの実行速度は、通常、手書きの Lua コードよりもはるかに高速です。Edgelang コンパイラは、ゲートウェイサーバー上で実行される効率的なネイティブコードを生成します。

Edgelang コンパイラは非常に効率的です。多くの先進的な最適化技術を実装しています。すべての Edgelang ルールで参照される正規表現を1つのステートマシンに統合することをサポートしています。これにより、リクエストデータを 1 回スキャンするだけで、どのルールがマッチし、それらのルールのどの部分がマッチするかを即座に知ることができます。

また、すべての Edgelang ルールの定数文字列プレフィックスとサフィックスパターンを単一のツリー構造データに組み合わせることもサポートしています。

Edgelang で定義されたページルールの追加

OpenResty Edge の Admin Web コンソールに入りましょう。これは私たちのコンソールのサンプルデプロイメントです。各ユーザーは自身のローカルデプロイメントを持っています。

Screenshot

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

スクリーンショット

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

スクリーンショット

前回のチュートリアルで、すでに 1 つのページルールを作成しました。

Screenshot

このページルールは、アップストリームへのリバースプロキシを設定しています。

スクリーンショット

ここで Edgelang コードを追加できます。

スクリーンショット

最初のルールを追加しましょう。

スクリーンショット

まず、ルールの条件部分です。条件は URI が「/foo/」の場合です。

スクリーンショット

矢印を使用して条件部分の終わりを示します。

スクリーンショット

矢印の後、条件が満たされた場合に実行するアクションを指定します。

Screenshot

このアクションは「/bar/」ページへの HTTP リダイレクトを開始します。

スクリーンショット

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

スクリーンショット

ご覧のように、Edgelang 仕様はルールで構成されています。各ルールには 2 つの基本部分があります:

Screenshot

1 つは条件部分、

スクリーンショット

もう 1 つはアクションで構成される結果です。

スクリーンショット

条件と結果は矢印で接続されています。

スクリーンショット

ルール全体はセミコロンで終わります。

Screenshot

これは最も単純なルールの例です。様々なルールを自由に追加できます。1 つのルールに複数の条件を持たせることができ、条件間は AND または OR で接続できます。1 つのルールの結果部分で複数のアクションを実行することもできます。

Embeded image

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

スクリーンショット

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

スクリーンショット

リリースします!

スクリーンショット

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

Screenshot

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

Embeded video

Embeded video

Embeded video

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

埋め込み画像

テスト

ターミナルで、curl コマンドラインツールを使用して、DNS で解決されたゲートウェイサーバーに HTTP リクエストを送信します。

curl -I http://test-edge.com/bar/

Screenshot

レスポンスヘッダーにリダイレクトがないことに注意してください。

Screenshot

次に、/foo/ URI を持つ HTTP リクエストを送信しましょう。

curl -I http://test-edge.com/foo/

Screenshot

このリクエストがリダイレクトされたことがわかります。

スクリーンショット

/bar/ という場所にリダイレクトされました。先ほど定義した Edgelang ルールが機能しています!

スクリーンショット

「/foo/」で始まる別の URI をテストしてみましょう。

スクリーンショット

この URI には追加のサフィックス「blah/」があります。

スクリーンショット

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

Screenshot

このリクエストは Edgelang ルールにヒットしていないことがわかります。これは、Edgelang の条件が 「/foo/」と完全に一致する必要があるためです。

Screenshot

ページルールの Edgelang 定義の修正

このような場合に対応するために、Edgelang ルールの条件部分を修正することができます。

スクリーンショット

「編集」ボタンをクリックします。

スクリーンショット

元の条件を削除します。

スクリーンショット

URI プレフィックス「/foo/」にマッチするように変更します。

スクリーンショット

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

スクリーンショット

新しい設定を再度リリースします。

Screenshot

Screenshot

Screenshot

Screenshot

ターミナルに戻ります。先ほどのテストリクエストを再度送信します。

スクリーンショット

引き続き「blah/」URI サフィックスを使用します。

スクリーンショット

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

スクリーンショット

リダイレクトがトリガーされたことがわかります。今回は Edgelang ルールにヒットしました。

Screenshot

次に、追加の URI サフィックスのない HTTP リクエストを送信してみましょう。

curl -I http://test-edge.com/foo/

Screenshot

依然としてヒットします。

Screenshot

Edgelang を使用した WAF ルールの定義

Web コンソールの様々な場所で Edgelang を使用できます。例えば、WAF(Web アプリケーションファイアウォール)にカスタムルールを追加するために EdgeLang を使用できます。

スクリーンショット

スクリーンショット

新しい WAF ルールを作成します。

スクリーンショット

ここに Edgelang を記述します。

Screenshot

Edgelang ユーザーマニュアル

私たちが独自に設計した EdgeLang ゲートウェイ小言語は、非常に強力な言語で多くの機能を持っています。この言語はカスタム Lua モジュールや Lua コード、または任意の .so 動的リンクライブラリの呼び出しをサポートしています。そのコンパイラはルール間の深い最適化をサポートしています。

スクリーンショット

詳細については、Edgelang ユーザーマニュアルをご覧ください。

Screenshot

マニュアルには多くのコード例が含まれています。

スクリーンショット

Edgelang の様々な使用方法について非常に詳細に説明されています。

Screenshot

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 以上のオープンソースソフトウェアライブラリを執筆しております。

翻訳

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