Azure Files を IIS でマウントして Web ページをホストしてみた
背景
今回は Azure Files を使って IIS で Web ページをホストする方法 を試しました。
Web サーバーにファイルを配置するには RDP でコピー するのが簡単ですが、毎回手動でコピーするのはなんかカッコ悪い…。そこで Azure Files を使ってストレージ上にファイルを置き、それを IIS にマウント することで、ファイル管理の手間を減らせないか試してみました。
また、実際に試す中で 403 エラーが発生し、アクセス権限の問題を解決する過程 もあったので、その点についても詳しく記録しておきます。
環境
- Azure VM(Windows Server 2022)
- IIS(Internet Information Services)
- Azure Files(SMB 3.0)
- PowerShell を使用してマウント
手順と試行錯誤
① Azure Files の作成とファイルアップロード
まず、Azure Portal で employee-app というファイル共有を作成し、Web ページのファイルをアップロードしました。
② Azure VM に SMB 共有をマウント
Azure Portal の「接続」オプションから、Windows 用のコマンドを取得し、VM の PowerShell で実行。
これにより、Azure Files を Y:
ドライブとしてマウントしました。
③ IIS の仮想ディレクトリ設定
次に、IIS の仮想ディレクトリを作成し、物理パスとして ¥¥<ストレージアカウント名>¥employee-app
(Azure Files)を指定しました。
④ アクセスしてみると 403 Forbidden エラーが発生
iisreset
を実行し、ブラウザでアクセスしてみると…
エラーメッセージ:
HTTP Error 403.14 - Forbidden
The Web server is configured to not list the contents of this directory.
⑤ 権限の問題を疑う
403.14 Forbidden
は ディレクトリの表示が許可されていない場合に発生 するエラー。
ただ、index.html
はあるはずなので、 権限の問題の可能性が高い と考えました。
参考にしたサイト
https://jpaztech.github.io/blog/vm/azure-files-user-mount/
上記のサイトを参考に、New-SmbGlobalMapping
を試してみることに。
⑥ New-SmbGlobalMapping の実行
New-SmbGlobalMapping とは?
通常、Windows では net use やエクスプローラーを使って Azure Files をマウントすると、そのマウントは 実行したユーザー専用 になります。そのため、異なるユーザー(例えば IIS の IUSR ユーザー)からは、そのマウント先にアクセスできません。
しかし、Windows Server 2019 / Windows 10 以降では New-SmbGlobalMapping コマンドを使うことで、システム全体で Azure Files をマウント できます。このコマンドを使うことで、IIS などのシステムアカウント(IUSR など)もマウントした Azure Files にアクセスできるようになるため、今回の問題解決に役立つと考えました。
📌 ポイント
net use やエクスプローラーでマウントすると、そのマウントは 実行したユーザーのみに適用 される。
IIS で匿名認証を使う場合、IUSR ユーザーがファイルにアクセスする必要がある。
New-SmbGlobalMapping を使うと、すべてのユーザーが Azure Files にアクセス可能になる。
Windows ユーザーがログインしていない状態でも、IIS などのサービスからファイルを参照できる。
実行したコマンド:
$User = "localhost\<ストレージアカウント名>"
$PWord = ConvertTo-SecureString -String "<ストレージアカウントアクセスキー>" -AsPlainText -Force
$Credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User, $PWord
New-SmbGlobalMapping -RemotePath \\<ストレージアカウント名>.file.core.windows.net\<ファイル共有名> -Credential $Credential -LocalPath Y: -Persistent $True
⑦ それでも解決しない…
再度ブラウザを開いてみると…
キャッシュを削除しても問題解決せず…。
そこで Get-ChildItem
を実行し、ファイルが正しく見えているか確認。
⑧ 実はファイル名が原因だった!
ファイルを見直してみると index.html の拡張子が認識されていない ことが判明。
原因は index.html のファイル名の後ろにスペースが入っていた ことだった…。
このせいで IIS から index.html
が正しく見えず、403 エラーの原因になっていた。
📷 ファイル名の後ろに謎のスペースがあった
修正後、再度 IIS をリセットし、アクセスしてみると…
まとめ
- IIS で 403 エラーが出たら、まずは基本を疑え!
- 今回は 権限設定ではなく、ファイル名のスペース が原因だった
- 設定やキャッシュを疑う前に、ファイルの存在や名前をチェックするのが大事
- トラブルシューティングは焦らず前提条件を確認するのが鉄則!
- 次回からは、まず シンプルなミスを疑う癖をつけよう