⛩️

Azure Application Gatewayの書き換え機能について

2024/03/03に公開

初めに

Azure Application Gatewayの書き換え機能を設定する機会があり、どういった機能なのか個人的に把握するために調査を実施しました。今回の投稿ではその調査結果から把握できたことについて記します。

そもそもAzure Application Gatewayとはなにか?

Azure Application GatewayはL7ロードバランサとして機能するAzureのサービスです。主な用途は指定されたサーバにhttp/httpsリクエストを振り分けるために使います。振り分け先に指定されたサーバは通称、バックエンドサーバと言われています。Azure Application Gatewayの詳細について知りたい場合はMicrosoft LearnのAzure Application Gateway のドキュメントを参照してください。
https://learn.microsoft.com/ja-jp/azure/application-gateway/overview
L7ロードバランサに似たものとしてはリバースプロキシサーバが存在します。apacheやnginx等をリバースプロキシサーバとして使うこともあります。L7ロードバランサとリバースプロキシの違いについては下記のページの内容が分かりやすいです。
https://www.nginx.co.jp/resources/glossary/reverse-proxy-vs-load-balancer/

書き換え機能とはなにか?

書き換え機能とはバックエンドサーバにhttpリクエストを送信する前に一定条件と一致するホスト名、URLパス、httpヘッダ等の内容をL7ロードバランサやリバースプロキシが書き換えを行う処理のことです。書き換え機能はapacheやnginx等のwebサーバにも存在しているためwebサーバ等で書き換え処理を使った経験があればAzure Application Gatewayの書き換え機能についてもイメージがつきやすいと思います。書き換え機能の主な用途としては特定の条件に一致したときに書き換えをしたい場合に使います。例えばバックエンド側のURLに設定するクエリ引数を隠蔽したい、バックエンドサーバ側のアプリケーション側が対応していないURLを対応しているURLに書き換えたい場合等に使われます。書き換え機能では正規表現を使ってパターン判定をすることができるため、複雑な文字列で構成されているURLパスやhttpヘッダの内容を判定して書き換えることが出来ます。Azure Application Gatewayでは書き換え処理を実行する条件のことを書き換え条件、書き換え行うことを書き換えアクションと表しています。Azure Application Gatewayの書き換え処理で書き換えができる項目については下記のページを参照してください。
https://learn.microsoft.com/ja-jp/azure/application-gateway/rewrite-http-headers-url

Azure Application Gatewayではどの正規表現が使えるのか?

Google製の正規表現ライブラリであるre2のシンタックスが利用可能です。re2については下記のページを参照してください。
https://github.com/google/re2
Azure Application Gatewayに書き換え条件の設定を始めた当初はapacheやnginxで利用できるPCRE形式の正規表現のシンタックスを参照して書き換え条件用の正規表現を作成していました。書き換え条件の内に複雑なものがあったため正規表現の後読み機能を使った書き換え条件をAzure Application Gatewayに設定し、書き換え条件と書き換えアクションの動作テストを実施したところ想定した通りに書き換えが行われない事象に遭遇しました。想定した書き換え結果が得られない原因を調査したところAzure Application Gatewayでは正規表現の後読みが使えないことが分かりました。Microsoft LearnにAzure Application Gatewayで使用可能な正規表現の記載があり、Azure Application Gatewayの書き換え機能はGoogle製の正規表現ライブラリであるre2のシンタックスと互換性のある正規表現が使用できると記述されていることを確認しました。re2ではPCRE形式の正規表現と比較すると使用できないシンタックスがあります。後読み機能もre2では利用できないシンタックスに含まれていました。re2形式使用可能なシンタックスについては下記URLを参照してください。
https://github.com/google/re2/wiki/Syntax

正規表現のテスト方法

re2はGoogleの製品で使われており、Google sheetsを用いてre2形式の正規表現のテストをすることも可能です。ただ今回のテスト環境はGoogle sheetsが使用できない環境だったため、re2バインディングライブラリが使え、テスト環境上で使用可能なものを探してみたところpythonを用いてテスト可能だということが分かり、pythonを用いてテストを実施しました。re2バインディングライブラリはgoogle-re2を使いました。google-re2の使い方は基本的にpythonの標準ライブラリであるreと同じでした。search関数やmatch関数は標準ライブラリのreと同じ使用方法で使えました。テスト方法は極めて簡単な方法で、pythonをインタラクティブモードで起動して下記のようなコードを打ち込み必要に応じて、テスト対象の正規表現とマッチ対象の文字列を変更すればテスト可能です。テストする正規表現が多い場合はテストを行うスクリプトを作成して実施してもよいと思います。

import re2
re2.search(r"\d", "abcd1efg") is not None

まとめ

  • Azure Application Gatewayの書き換え機能によってバックエンドサーバにhttpリクエストを振り分ける前にURLやhttpヘッダーの書き換えが可能です。
  • Azure Application Gatewayの書き換え機能で使える正規表現はre2です。
  • re2はPCRE形式の正規表現と比較すると使用できないシンタックスがあります。
  • 正規表現を使う場合は使用可能な正規表現のシンタックスを確認してから作成しましょう。

Discussion