概要
- 以下のような構成です
- webapp のパブリックアクセスを遮断して、ApplicationGateway からプライベートエンドポイント経由にします
- 受信規則を WAF、送信規則を NSG か FW で作成します
- やり方は一応どちらも調べたのですが、FW は料金がすごく高くて(月10万ぐらい)今回の場合は NSG で対応出来そうだったので NSG で進めます
- 送信規則を NSG で作成した場合
- FQDN で規則を作成出来ないので、送信先の IP が変わったり、一つの FQDN に大量の IP が存在する場合に設定が面倒くさい
- 無料
- 送信規則を Firewall で作成した場合
- FQDN による規則を作成出来る(Standard 以上)
- 料金が高い(月10万円超え)
- デプロイ時の pip install も pypi.org の送信規則許可が必要で、IP を許可する事で pip install 出来ますが、FQDN で設定出来ない NSG は IP が変わる度に設定を更新する必要がありそうです
リソース作成
- 各リソースを作成します
VirtualNetwork
- VNET を 3 つ作成します
- 動作確認のため NSG, FW 用をどちらも作っていますが、初めからどちらでやるか決めている場合は片方の作成で良いです
- リージョンは揃えます
- プライベートエンドポイント用にサブネットを作成します
- FW 用にサブネットを 2 つ作成します
Webアプリ
app.py
import requests
import gradio as gr
def request(input: str):
try:
r = requests.get(input, timeout=(3.0, 5.0))
return r.text
except Exception as e:
return e
demo = gr.Interface(
fn=request,
inputs=[gr.Textbox(value="https://pypi.org/")],
outputs=["text"],
flagging_mode="never"
)
demo.launch(server_port=8000, server_name='0.0.0.0')
requirements.txt
gradio==5.8.0
requests==2.32.3
- 以下通りにデプロイします
統合する VNET は NSG, FW どちらか利用する方を選択して下さい
NetworkSecurityGroups
-
デフォルトの設定では外部(Internet)の送信が全て許可となっているので、全て拒否(下記画像の優先度:200 のルール)を追加すると、下記のようにデプロイ時の pip install で失敗します
- 下記画像の優先度 180, 181,( 190,191 は無くても良いかも)の pypi に関する規則を追加するとインストールが正常に完了して、アプリを立ち上げられました
Firewall
web アプリの VNET 統合を FW のサブネットに設定してください
NSG のサブネットと統合している場合は切断して付け替えます
-
公式ページを参考に作っていきます
https://learn.microsoft.com/ja-jp/azure/app-service/network-secure-outbound-traffic-azure-firewall -
FW を作ります
- ポリシー、管理パブリック IP は適当な名前で新規作成しました
- DNS を使えるようにする設定は Standard 以上で可能す(Basic では FQDN による規則が作れなさそうでした。Firewall の Basic を使うなら NGS の方が無料・シンプルで良いかもしれないです)
- ルートテーブルを作ります
- ゲートウェイのルートを伝達する:No にします
- ルートを追加します
- 「次ホップ IP アドレス」は FW のプライベート IP アドレスです
FW ポリシーを更新
ApplicationGateway
- 以下手順で ApplicationGateway を作成します
- 「既定のドメイン」で進めていますが、証明書の問題があるので「カスタムドメイン」が良さそうです
- 参考
https://learn.microsoft.com/ja-jp/azure/application-gateway/configure-web-app?tabs=defaultdomain%2Cazure-portal
- この時点では web アプリのパブリックアクセスが有効であれば、ApplicationGateway に設定したパブリック IP にアクセスする事で web サイトが表示されます
ApplicationGateway の動作確認(web アプリのパブリックアクセス無効化~)
事前準備
アクセスして確認
- うまく画面に表示されない時は以下のコマンドで再起動を試します
- 参考
https://zenn.dev/microsoft/articles/20240113-appgw-webapp-pe
az network application-gateway stop --resource-group rgname --name app-gatewayname
az network application-gateway start --resource-group rgname --name app-gatewayname
-
https://[webアプリ名].japanwest-01.azurewebsites.net/ にアクセスすると web アプリのネットワーク設定によりブロックされます
-
ApplicationGateway に設定したパブリック IP にアクセスすると web ページが表示され……ますが css のロードが上記 URL なのでうまくいきません…
-
なぜか書き換えがうまくいっていないようです