【Azure】閉域環境下でのPaaSのファイアウォール設定について
はじめに
閉域環境のネットワークを設計する際、プライベートエンドポイントを利用したプライベートアクセスや、NSGを用いたアクセス制御と合わせて、ストレージアカウントなどのPaaSもファイアウォールによってアクセスを制限することが多いかと思います。
今回は閉域環境下のPaaSのファイアウォールの挙動について簡単にまとめてみたいと思います。
検証環境
以下のようなシンプルな環境で検証します。
AppService上のアプリケーションからBlobストレージにファイルを転送します。
NSGのルールはデフォルトとしています。
環境構築
テストアプリ
コーディングは苦手なのでコードはGPTに作ってもらいました。ローカル上のファイルをAppServiceにアップロード後に、Blobストレージに転送するというシンプルなものです。
from fastapi import FastAPI, File, UploadFile
from fastapi.responses import HTMLResponse
from azure.storage.blob import BlobServiceClient
app = FastAPI()
# Azure Blob Storageの接続情報
AZURE_CONNECTION_STRING = "接続文字列"
CONTAINER_NAME = "blob"
# BlobServiceClientのインスタンスを作成
blob_service_client = BlobServiceClient.from_connection_string(AZURE_CONNECTION_STRING)
@app.get("/", response_class=HTMLResponse)
async def main():
content = """
<form action="/uploadfile/" enctype="multipart/form-data" method="post">
<input name="file" type="file">
<input type="submit">
</form>
"""
return content
@app.post("/uploadfile/")
async def upload_file(file: UploadFile = File(...)):
# Blobコンテナを取得
container_client = blob_service_client.get_container_client(CONTAINER_NAME)
# ファイルをBlobストレージにアップロード
blob_client = container_client.get_blob_client(file.filename)
blob_client.upload_blob(await file.read(), overwrite=True)
return {"filename": file.filename, "message": "アップロード成功"}
動作確認
以下のコマンドでローカル実行します。
uvicorn main:app --host 0.0.0.0
ファイルを選択後に、「送信」ボタンを押します。
アップロードが成功すると以下のように表示されます。
Blobストレージ上でもアップロードされたファイルが確認できます。
コンテナ化
コンテナ化に際し、requirements.txt を準備します。
fastapi
uvicorn
azure-storage-blob
python-multipart
Dockerfileを作成します。
# ベースイメージを指定
FROM python:3.12
# 作業ディレクトリを設定
WORKDIR /app
# 依存関係をコピー
COPY requirements.txt .
# 依存関係をインストール
RUN pip install --no-cache-dir -r requirements.txt
# アプリケーションコードをコピー
COPY . .
# アプリケーションを起動
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
以下のコマンドを実行して、Dockerイメージをビルドします。
docker build -t fastapi-app .
Dockerコンテナを実行し動作確認をします。
docker run -d --name my-fastapi-app -p 8000:8000 fastapi-app
コンテナレジストリへPush
ACRへログインします。ユーザー名とパスワードの入力が求められます。
docker login testacr1122.azurecr.io
コンテナのタグ付けを行います。
docker tag fastapi-app testacr1122.azurecr.io/fastapi-app:v1.0
コンテナレジストリへPushします。
docker push testacr1122.azurecr.io/fastapi-app:v1.0
イメージを確認します。
az acr repository list --name testacr1122 --output table
デプロイ
Azure Portal上からデプロイします。
AppServiceの「概要」ペインより、「既定のドメイン」をクリックします。
正常に画面が表示されれば準備OKです。
検証
検証については、アプリケーションからのプライベートアクセス(経路①)とAzure Portal経由のパブリックアクセス(経路②)の2経路があることとします。
ストレージアカウントの「セキュリティとネットワーク」>「ネットワーク」>「ファイアウォールと仮想ネットワーク」から選択できるファイアウォールの設定項目について「経路①」、「経路②」それぞれについて確認してみます。
①すべてのネットワークから有効
「すべてのネットワークから有効」にチェックを入れた場合、「経路①」は問題なくアクセス可能でした。
また「経路②」もアクセス可能でした。
②無効
「無効」にチェックを入れた場合、「経路①」はアクセス可能でした。
ただし、「経路②」はアクセスすることはできません。
パブリックアクセスは無効になるものの、プライベートエンドポイントを経由したプライベートアクセスは通信可能ということですね。
③選択した仮想ネットワークとIPアドレスから有効
「選択した仮想ネットワークとIPアドレスから有効」を選択した場合、「経路①」はアクセス可能でした。
「経路②」については既定設定ではアクセス不可ですが、「インターネットまたはオンプレミスのネットワークからのアクセスを許可するための IP 範囲を追加します。」の箇所にグローバルIPアドレスを登録することで、アクセス可能になります。
まとめ
まとめると以下のような感じになるかと思います。
プライベートアクセスのみ場合は、「無効」設定でよいですが、運用上Azure Portalからのアクセスが必要な場合は、「選択した仮想ネットワークとIPアドレスから有効」に設定し、明示的にIPアドレスを追加する必要があるようですね。
Discussion