本 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 コンソールに入りましょう。これは当社コンソールのサンプルデプロイメントです。各ユーザーは自身のローカルデプロイメントを持っています。

OpenResty Edge Web コンソールのサンプルデプロイメント

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

サンプルアプリ test-edge.com を表示する OpenResty Edge のアプリ一覧

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

OpenResty Edge の test-edge.com アプリケーションに入る

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

OpenResty Edge アプリ内の既存のページルール

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

アップストリームへのリバースプロキシとして設定されたページルール

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

ページルール内の EdgeLang コードエディタ

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

最初の EdgeLang ルールを追加

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

URI /foo/ にマッチする EdgeLang ルールの条件

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

矢印で EdgeLang 条件部分を終える

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

矢印の後に EdgeLang アクションを指定

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

/bar/ への HTTP リダイレクトを開始する EdgeLang アクション

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

EdgeLang ルールを保存

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

2 つの基本部分を示す EdgeLang ルール

1 つは条件部分、

EdgeLang ルールの条件部分

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

EdgeLang ルールの結果(アクション)部分

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

矢印で接続された EdgeLang の条件と結果

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

セミコロンで終わる EdgeLang ルール

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

図:AND/OR 条件と複数アクションを持つ複数の EdgeLang ルール

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

OpenResty Edge で新しい設定バージョンをリリース

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

OpenResty Edge の設定リリースボタン

リリースします!

設定リリースの確認

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

新しいバージョンが全ゲートウェイサーバーに同期

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

設定リリースがゲートウェイクラスターとサーバーに同期中(開始)

設定リリースがゲートウェイクラスターとサーバーに同期中(進行中)

設定リリースが全ゲートウェイクラスターとサーバーに同期完了

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

図:リロード・再起動・バイナリアップグレードなしで設定変更をゲートウェイにプッシュ

curl で EdgeLang ルールをテストする

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

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

ターミナル:test-edge.com/bar/ への curl -I リクエスト

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

リダイレクトのない /bar/ のレスポンスヘッダー

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

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

ターミナル:test-edge.com/foo/ への curl -I リクエスト

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

/foo/ リクエストがリダイレクトされたことを示すレスポンスヘッダー

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

/bar/ へのリダイレクトを確認、EdgeLang ルールが機能

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

ターミナル:/foo/ プレフィックスを持つ別の URI をテスト

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

ターミナル:追加サフィックス付きの /foo/blah/ リクエスト

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

/foo/blah/ リクエストを送信

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

完全一致では /foo/blah/ が EdgeLang ルールにヒットしないことを示すレスポンス

EdgeLang ルールの修正:完全一致とプレフィックス一致

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

プレフィックスに対応するため EdgeLang ルールの条件を編集

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

EdgeLang ページルールの「編集」ボタン

元の条件を削除します。

元の完全一致条件を削除

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

条件を URI プレフィックス /foo/ にマッチするよう変更

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

修正した EdgeLang ルールを保存

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

ルール編集後に新しい設定バージョンをリリース

設定リリースのダイアログ

設定リリースの進行中

設定リリースがゲートウェイに同期完了

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

ターミナル:先ほどの /foo/blah/ テストリクエストを再送信

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

ターミナル:リクエストは引き続き /foo/blah/ サフィックスを使用

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

プレフィックス一致に変更後に /foo/blah/ リクエストを送信

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

プレフィックス一致で /foo/blah/ がリダイレクトされることを示すレスポンス

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

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

ターミナル:サフィックスなしで test-edge.com/foo/ への curl -I リクエスト

同様にヒットします。

プレフィックス一致で /foo/ も引き続きリダイレクトされることを示すレスポンス

EdgeLang で WAF ルールを書く方法

Web コンソールの様々な場所で EdgeLang を使用できます。例えば、WAF(Web アプリケーションファイアウォール)にカスタムルールを追加するために EdgeLang を使用できます。プログラマブル WAF そのもの——有効化・テスト・攻撃のブロック方法ModSecurity との性能ベンチマーク——について詳しくは、これらの専用チュートリアルをご覧ください。

OpenResty Edge コンソールの Web アプリケーションファイアウォール(WAF)セクション

OpenResty Edge の WAF ルール一覧

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

OpenResty Edge で新しい WAF ルールを作成

ここに EdgeLang を記述します。

WAF ルールエディタで EdgeLang を記述

EdgeLang ユーザーマニュアルとその他の例

当社が独自に設計したゲートウェイ DSL である EdgeLang は、非常に強力な言語で多くの機能を持っています。この言語はカスタム Lua モジュールや Lua コード、または任意の .so 動的リンクライブラリの呼び出しをサポートしています——実践例は EdgeLang から Lua モジュールを呼び出す をご覧ください。そのコンパイラはルール間の高度な最適化をサポートしています。

EdgeLang の機能:カスタム Lua モジュール・.so ライブラリの呼び出しとルール間最適化

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

EdgeLang ユーザーマニュアルのドキュメントページ

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

多くのコード例を掲載した EdgeLang ユーザーマニュアル

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、LuaJITGDBSystemTapLLVM、Perl など、複数のオープンソースプロジェクトに累計 100 万行以上のコードを寄与し、60 以上のオープンソースソフトウェアライブラリを執筆しております。

翻訳

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