Azure App Serviceをプロキシとして利用する

このエントリは2021/03/22現在の情報に基づいています。将来の機能追加・変更に伴い、記載内容との乖離が発生する可能性があります。

標題の通りで、機能実験をやってみた。もちろん、Containerでnginxをプロキシに仕立てて、それをWeb App for Containerに載せてもよいし、API ManagementのGatewayを使ってもいい。もしVNet内のVirtual MachineからWebにアクセスさせたいなら、こういうやり方もある、という実験。

用意するもの

  • App Service
    • ランタイムとしてASP.NET、.NET Core、もしくは.NET 5のいずれかを選択
  • App Serviceの構成ファイル
    • applicationHost.xdt
    • web.config

構成

App Serviceインスタンス自体はランタイムを選択し、ふつうに作成する。インスタンスの作成が完了したら、App Service Editor (プレビュー)をクリックする。

クリック後、[移動]というリンクが現れるので、これをクリックすると、VS Codeのような、GitHub Codespacesのような画面が現れる(下図)。

[EXPLORE] の中で右クリックするとメニューが現れるので、[New File]を選択、新規作成するファイルの名前を指定する。ここで作成するファイルは以下の2個。

  • applicationHost.xdt
  • web.config

applicationHost.xdtは以下をそのままコピペしておく。このファイルは、IISのリバースプロキシ機能を有効にするためのファイル。

<?xml version="1.0" encoding="UTF-8"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <system.webServer>
    <proxy xdt:Transform="InsertIfMissing"
           enabled="true"
           preserveHostHeader="false"
           reverseRewriteHostInResponseHeaders="false" />
  </system.webServer>
</configuration>

以下はweb.configの例。rule要素でHTTPSを強制していたり、宛先にhttps://www.google.comを指定すると共に、Pathに指定したものをGoogle先生に渡すようにしている。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <rewrite>
      <rules>
        <rule name="ForcedTLS" enabled="true" stopProcessing="true">
          <match url="(.*)" />
          <conditions>
            <add input="{HTTPS}" pattern="^OFF$" />
          </conditions>
          <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" />
        </rule>
        <rule name="AccessTo..." stopProcessing="true">
          <match url="(.*)" />
          <action type="Rewrite" url="https://www.google.com/{R:1}" appendQueryString="true" logRewrittenUrl="false" />
          <!-- action type="Rewrite" url="https://{R:0}" appendQueryString="true" logRewrittenUrl="false" / -->
        </rule>
      </rules>
    </rewrite>
    <httpProtocol>
     <customHeaders>
        <add name="strict-transport-security" value="max-age=15552000; includeSubDomains; preload" />
     </customHeaders>
    </httpProtocol>
  </system.webServer>
</configuration>

URLの書き換えを司るモジュールの構成リファレンスは以下のURLにある。

URL Rewrite Module Configuration Reference
https://docs.microsoft.com/iis/extensions/url-rewrite-module/url-rewrite-module-configuration-reference

両ファイルを作成したら、App Service名をクリックしてドロップダウンメニューを開き、Open Kudu Consoleを選択する(下図)。

この操作で、Kudu Consoleが開く。site > wwwroot とディレクトリをたどると、先ほど作成した2ファイルが存在することを確認できるはず。

最後に、applicationHost.xdtを1個上のディレクトリに移動する。コマンドプロンプトで以下を実行する。

move applicationHost.xdt ..

これで構成は完了。App Serviceは再起動しておく。

動作確認

App ServiceのURLをブラウザから叩くと、www.google.comの画面が表示されていることを確認できる。

指定したパスもGoogle先生に渡すことができる。例えば、/search?q=Azureを渡すと、以下のような感じ。

この内容は、ふつうにGoogle先生に問い合わせた場合 (https://www.google.com/search?q=Azure) と同じ。

さらに、web.configのルールをコメント化されているものに置き換えると、Pathに指定したURLにアクセスすることもできる。以下はその例。

これで何ができそうか

App ServiceをPrivate LinkであるVNetに接続しつつ、別のVNetに対してVNet統合し、NAT Gatewayを組み合わせておけば、オンプレミスのノードはオンプレミスからではなく、Azureからインターネットに出ることが可能。具体的には以下のようなイメージ。

まとめ

他のBlogエントリでは、App ServiceのFTPを有効化する必要がある、というような記述を見ることがあるが、この方法ではFTPを有効化する必要がなく、構成はAzure Portal内で全て完結する点で少々異なる。

再度述べるが、今回の内容は機能実験に過ぎない。そのため、セキュリティなどは全く考慮しておらず、実運用にすぐに使えるわけでもなければ、おすすめすることもないので念のため。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中