🗂

【Azure】閉域環境下でのPaaSのファイアウォール設定について

2024/11/24に公開

はじめに

閉域環境のネットワークを設計する際、プライベートエンドポイントを利用したプライベートアクセスや、NSGを用いたアクセス制御と合わせて、ストレージアカウントなどのPaaSもファイアウォールによってアクセスを制限することが多いかと思います。
今回は閉域環境下のPaaSのファイアウォールの挙動について簡単にまとめてみたいと思います。

検証環境

以下のようなシンプルな環境で検証します。
AppService上のアプリケーションからBlobストレージにファイルを転送します。
NSGのルールはデフォルトとしています。

環境構築

テストアプリ

コーディングは苦手なのでコードはGPTに作ってもらいました。ローカル上のファイルをAppServiceにアップロード後に、Blobストレージに転送するというシンプルなものです。

main.py
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 を準備します。

requirements.txt
fastapi
uvicorn
azure-storage-blob
python-multipart

Dockerfileを作成します。

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