EdgeLang チュートリアル:OpenResty Edge でゲートウェイ・WAF ルールを書く方法
本 EdgeLang チュートリアルでは、OpenResty Edge でルールベースのドメイン固有言語 EdgeLang を使ってゲートウェイルールを記述する方法を紹介します。各 EdgeLang ルールは条件と結果(アクションのリスト)を矢印(=>)で結び、セミコロンで終えます——例えば /foo/ へのリクエストを /bar/ にリダイレクトします。以下では、ページルールのリダイレクトを追加し、curl でテストし、完全一致からプレフィックス一致へ変更し、さらに WAF ルールを記述します——すべての変更はリロード・再起動・バイナリアップグレードなしで各ゲートウェイにプッシュされます。EdgeLang が初めての方は、まず EdgeLang とは何か、なぜ手書きの Lua より優れているか をご覧ください。
EdgeLang がルールを高速にコンパイルする仕組み
ユーザーは EdgeLang を使用して、複雑なゲートウェイルールを記述することができます。これらのルールは、カスタム認証、リクエストとレスポンスの書き換え、動的アップストリームルーティングの設定などに使用できます。これらのルールの実行速度は、通常、手書きの Lua コードよりもはるかに高速です。EdgeLang コンパイラは、ゲートウェイサーバー上で実行される効率的なネイティブコードを生成します。
EdgeLang コンパイラは非常に効率的です。多くの先進的な最適化技術を実装しています。すべての EdgeLang ルールで参照される正規表現を1つのステートマシンに統合することをサポートしています。これにより、リクエストデータを 1 回スキャンするだけで、どのルールがマッチし、それらのルールのどの部分がマッチするかを即座に知ることができます。
また、すべての EdgeLang ルールの定数文字列プレフィックスとサフィックスパターンを単一のツリー構造データに組み合わせることもサポートしています。
EdgeLang ページルールの書き方(URL リダイレクトの例)
OpenResty Edge の Admin Web コンソールに入りましょう。これは当社コンソールのサンプルデプロイメントです。各ユーザーは自身のローカルデプロイメントを持っています。
以前のサンプルアプリケーション、test-edge.com を引き続き使用できます。
そのアプリケーションに入ります。
前回のチュートリアルで、すでに 1 つのページルールを作成しました。
このページルールは、アップストリームへのリバースプロキシを設定しています。
ここで EdgeLang コードを追加できます。
最初のルールを追加しましょう。
まず、ルールの条件部分です。条件は URI が「/foo/」の場合です。
矢印を使用して条件部分の終わりを示します。
矢印の後、条件が満たされた場合に実行するアクションを指定します。
このアクションは「/bar/」ページへの HTTP リダイレクトを開始します。
このルールを保存します。
ご覧のように、EdgeLang 仕様はルールで構成されています。各ルールには 2 つの基本部分があります:
1 つは条件部分、
もう 1 つはアクションで構成される結果です。
条件と結果は矢印で接続されています。
ルール全体はセミコロンで終わります。
これは最も単純なルールの例です。様々なルールを自由に追加できます。1 つのルールに複数の条件を持たせることができ、条件間は AND または OR で接続できます。1 つのルールの結果部分で複数のアクションを実行することもできます。
いつものように、先ほどの変更をプッシュするために新しいバージョンをリリースする必要があります。
このボタンをクリックします。
リリースします!
新しいバージョンがすべてのゲートウェイサーバーに同期されました。
これで、新しいページルールがすべてのゲートウェイクラスターとサーバーにプッシュされました。
これらの設定変更にはサーバーのリロード、再起動、またはバイナリアップグレードは必要ありません。そのため、非常に効率的でスケーラブルです。
curl で EdgeLang ルールをテストする
ターミナルで、curl コマンドラインツールを使用して、DNS で解決されたゲートウェイサーバーに HTTP リクエストを送信します。
curl -I http://test-edge.com/bar/
レスポンスヘッダーにリダイレクトがないことに注意してください。
次に、/foo/ URI を持つ HTTP リクエストを送信しましょう。
curl -I http://test-edge.com/foo/
このリクエストがリダイレクトされたことがわかります。
/bar/ という場所にリダイレクトされました。先ほど定義した EdgeLang ルールが機能しています!
「/foo/」で始まる別の URI をテストしてみましょう。
この URI には追加のサフィックス「blah/」があります。
リクエストを送信します。
このリクエストは EdgeLang ルールにヒットしていないことがわかります。これは、EdgeLang の条件が 「/foo/」と完全に一致する必要があるためです。
EdgeLang ルールの修正:完全一致とプレフィックス一致
このような場合に対応するために、EdgeLang ルールの条件部分を修正することができます。
「編集」ボタンをクリックします。
元の条件を削除します。
URI プレフィックス「/foo/」にマッチするように変更します。
このルールを保存します。
新しい設定を再度リリースします。
ターミナルに戻ります。先ほどのテストリクエストを再度送信します。
引き続き「blah/」URI サフィックスを使用します。
リクエストを送信します。
リダイレクトがトリガーされたことがわかります。今回は EdgeLang ルールにヒットしました。
次に、追加の URI サフィックスのない HTTP リクエストを送信してみましょう。
curl -I http://test-edge.com/foo/
同様にヒットします。
EdgeLang で WAF ルールを書く方法
Web コンソールの様々な場所で EdgeLang を使用できます。例えば、WAF(Web アプリケーションファイアウォール)にカスタムルールを追加するために EdgeLang を使用できます。プログラマブル WAF そのもの——有効化・テスト・攻撃のブロック方法や ModSecurity との性能ベンチマーク——について詳しくは、これらの専用チュートリアルをご覧ください。
新しい WAF ルールを作成します。
ここに EdgeLang を記述します。
EdgeLang ユーザーマニュアルとその他の例
当社が独自に設計したゲートウェイ DSL である EdgeLang は、非常に強力な言語で多くの機能を持っています。この言語はカスタム Lua モジュールや Lua コード、または任意の .so 動的リンクライブラリの呼び出しをサポートしています——実践例は EdgeLang から Lua モジュールを呼び出す をご覧ください。そのコンパイラはルール間の高度な最適化をサポートしています。
詳細については、EdgeLang ユーザーマニュアルをご覧ください。
マニュアルには多くのコード例が含まれています。
EdgeLang の様々な使用方法について非常に詳細に説明されています。
よくある質問
EdgeLang ルールはどう書きますか?
EdgeLang 仕様はルールで構成されます。各ルールは 2 つの部分——条件と結果(アクションのリスト)——を矢印(=>)で結び、セミコロンで終えます。1 つのルールは AND/OR で複数の条件を組み合わせ、結果部分で複数のアクションを実行できます。例えば、URI /foo/ にマッチする条件を持つルールは、リクエストを /bar/ にリダイレクトするアクションをトリガーできます。
EdgeLang ルールの変更にはゲートウェイのリロードや再起動が必要ですか?
いいえ。EdgeLang ルールを編集したら、新しい設定バージョンをリリースすると、すべてのゲートウェイサーバーとクラスターに同期されます。これらの変更にはサーバーのリロード、再起動、バイナリアップグレードは一切不要で、新しいルールのロールアウトを非常に効率的かつスケーラブルにします。
EdgeLang で WAF ルールを定義できますか?
はい。ページルールに加えて、EdgeLang は Web コンソールの多くの場所で使用でき、Web アプリケーションファイアウォール(WAF)のカスタムルールも含まれます。WAF ルールエディタで、同じ条件とアクションの構文を使って EdgeLang を直接記述します。
EdgeLang の完全一致とプレフィックス一致の違いは何ですか?
/foo/ に対する完全一致条件は URI がちょうど /foo/ の場合のみヒットするため、/foo/blah/ へのリクエストはヒットしません。ルールでサブパスもカバーしたい場合は、条件を URI プレフィックス /foo/ にマッチするように変更します。すると /foo/ と /foo/blah/ の両方がルールをトリガーします。
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、LuaJIT、GDB、SystemTap、LLVM、Perl など、複数のオープンソースプロジェクトに累計 100 万行以上のコードを寄与し、60 以上のオープンソースソフトウェアライブラリを執筆しております。
翻訳
英文版の原文と日本語訳版(本文)をご用意しております。読者の皆様による他の言語への翻訳版も歓迎いたします。全文翻訳で省略がなければ、採用を検討させていただきます。心より感謝申し上げます!













































































