C#(ASP.NET Core)のアプリケーションをAzure VMのIISでホストする
はじめに
この記事のメインはIISでASP.NET Coreのアプリケーションをホストする部分です。
ASP.NET CoreのアプリケーションをVMに配置して外からアクセスできるようにするためのVM,IISの設定についてまとめています。
Azure VMであることは重要ではありません。
が、諸々わからない状態だとどう検索すればいいのかもわからなかったので、そんな人も辿り着きやすいようにタイトルがごちゃついています。
ドキュメントが散らばっているため、ブックマーク的に利用できるよう見つけた限りMicrosoftのドキュメントを各手順で紹介しています。
少しのバージョン違いであれば下の画像のように公式ドキュメントでバージョンを切り替えて参考にできると思います。
ゴール
- Azure VMでIISを有効化してASP.NET Coreをデプロイし、VMの外からそのアプリケーションにアクセスできる
- アプリケーションでSQL Server上のデータベースとの接続ができる
前提条件
- ASP.NET Core(.NET6)のアプリケーションが準備されている
- Windows Server のAzure VM, VNET, SQL ServerなどのリソースはAzureで作成済み(この記事では注意点のみ記し作成手順は省きます)
- Azure VMのネットワークセキュリティグループの受信セキュリティ規則でポート3389(RDP用)、80(HTTP用)を許可している
- SQL Serverの仮想ネットワークのルールでVMと同じ仮想ネットワーク、サブネットのサービスエンドポイントを有効にしている
- 仮想ネットワークのサービスエンドポイントで、VMに設定しているのと同じサブネットのMicrosoft.Sqlが有効になっている
経緯
この辺りの内容はひとつのドキュメントにまとまっておらず、知識がない状態では探せなかったのでこんなイベントを開いてみたところ、つよつよな方々に教えていただけました…!ご参加くださった皆様には改めて感謝を申し上げます。
今回詰まった原因
同じことで詰まっている方もいるかもしれないのでまとめておきます。
- サーバーOSとクライアントOSの違いを知らなかった(詳細後述)
- .NET Hosting Bundleの存在を知らなかった
- .NET SDKをインストールしてしまっていて、.NET Hosting Bundleをインストールしていなかった
- AzureでVM立てる→IISの設定→アプリケーションデプロイまでの流れがドキュメントでまとまっておらず、手順を探せなかった
- わからなすぎてAzure VMではなくIISやASP.NET Coreの方でドキュメントを漁るべきだと気づくのに時間がかかった
Azure VM作成の注意点
Azure VMの作成方法は掘り下げませんが、注意点のみ記しておきます。
VMの種類
今回は 2022-datacenter-azure-edition
で作成しました。
Window Serverの種類の詳細は下記ドキュメントをご参照ください。
使えるイメージの調べ方はこちらのドキュメントにまとまっています。
名前にcoreが入っているものはデスクトップがなくコマンドでやるしかなくなるのでそれを避けてイメージを選択しました。
もともと win10-22h2-pro
でVMを立てていたのですが、これはクライアントOSだったのでWindows Server OSに作り直すことになりました。この違いを質問したところ、一瞬場が固まりました。
クライアントOSとサーバOSというものがあること自体知らなかったので適当に作ったんです…ちゃんと調べようね…。
下記サイトにすんごくわかりやすく書いてありますが、サーバーとして使いたいならその用途に最適化されたサーバーOSにしておけばいい感じにしてくれるよということです。
Server Managerなど、サーバーの管理と構成に必要なツールが備わっています。
Azure EditionはAzureで使うための最適化がされているOSです。
再起動しなくても VM にセキュリティ更新プログラムを適用できるなど便利そうです。本題ではないので詳しくはドキュメントをご覧ください。
Bicepはこんな感じです。
サーバーとして使いたいならちゃんとofferが WindowsServer
のものを使おう!
resource vm 'Microsoft.Compute/virtualMachines@2023-03-01' = {
name: {{任意のvmName}}
location: {{任意のlocation}}
properties: {
hardwareProfile: {
vmSize: {{任意のvmSize}}
}
storageProfile: {
osDisk: {
createOption: 'FromImage'
managedDisk: {
storageAccountType: {{任意のosDiskType}}
}
}
imageReference: {
publisher: 'MicrosoftWindowsServer'
offer: 'WindowsServer'
sku: '2022-datacenter-azure-edition'
version: 'latest'
}
}
networkProfile: {
networkInterfaces: [
{
id: networkInterface.id
}
]
}
osProfile: {
computerName: {{任意のvmName}}
adminUsername: {{任意のadminUsername}}
adminPassword: {{任意のadminPassword}}
}
}
}
VMでIISの有効化
VMにリモートデスクトップ接続
VMにリモートデスクトップ接続します。
VMのネットワークセキュリティグループの受信セキュリティ規則でポート3389
を許可していればエラーにならずに接続できるはずです。
下記手順で簡単にVMに接続できます。
- Azure Potalで作成したVMを開く
- 接続 > RDPファイルのダウンロード
- ダウンロードしたrdpファイルをダブルクリック
- パスワードを求められるのでVM作成時に設定したパスワードを入力
※警告が2回出ますが無視でOK
Azure PotalでVMのリソースの接続
を確認するとこれ以外の接続方法を表示されますが、いずれの方法でもOKです。わかりやすくて助かります。
ドキュメントはこちらです。
Server ManagerでIISをインストール
ちゃんとサーバーOSでVMを立てていれば、VMに接続すると勝手にServer Managerが立ち上がります。
今回日本語化は省くため、英語表記での手順を記します。
- Server Manager で Manage > Add Roles and Features
- Before you begin, Select installation type, Server SelectionはそのままNext
- Server RolesでWeb Server(IIS)をクリックし、でできたポップアップでAdd Featuresを押してNext
- 残りはすべてNext,最後まで行ったらinstall
- インストールが終わったらclose
この手順はなんとこちらのドキュメントの最後「Web サーバー (IIS) サーバーの役割をインストールするには」に書いてありました。ソロプレイでは辿り着けません…。
IISの挙動確認
VM内で確認
ここまで来たら、IISがちゃんと動いていることを確認します。
VMでブラウザを立ち上げてアドレスバーに localhost
と打ち込みます。
画像のようなデフォルトのサイトが表示されれば成功です!
VM外で確認
続いてVMの外からこのサイトにアクセスできることを確認します。
VMではなく自分のPCのブラウザのアドレスバーにVMのパブリックIPアドレスを打ち込んでください。
パブリックIPアドレスはポータルでVMの概要から確認できます。
もしVMにパブリックIPアドレスがない場合はこちらのドキュメントを参考に設定してください。
先ほどVMで localhost
と打って表示されたのと同じサイトが表示されれば成功です!
VMのネットワークセキュリティグループの受信セキュリティ規則でポート80
が許可されていれば表示できるはずです。
アプリケーションのデプロイ
デプロイするソースの準備
検証できればいいので、ひとまず自分のPCからコピペで持っていきます。
まずコピペするソースを出力します。
- Visual StudioでASP.NET Coreのアプリケーションを開く
- プロジェクトの上で右クリックして発行を選択
- 新しいプロファイル>フォルダー
- フォルダーの場所は任意で設定(そこに発行されたものをコピーできればいいので場所がわかっていればOK)
- ターゲットランタイムの鉛筆ボタンを押してターゲットランタイム「移植可能」配置モード「フレームワーク依存」に設定
※ 配置モードを「自己完結」にするとVMに.NETライブラリなどがなくても動きますが、その分ファイルサイズが大きくなります
- 発行!
発行した結果出力されたディレクトリにそれぞれ何が入っているか気になる方はこちらのドキュメントをご参照ください。
Visual StudioでのASP.NET Coreアプリケーションの発行についてドキュメントで参照したい場合はこちらです。
コマンドラインからの発行方法なども確認できます。
VMにアプリケーションを配置
1. Visual Studioで発行したものをVMにコピー
先ほどVisual Studioで発行した階層に行き、publishフォルダ以下すべてをコピーします。
コピーする場所は任意ですが、今回はVMのCドライブに app
というフォルダを作りその下にコピーしました。
Ctrl+C,Ctrl+VでローカルPCからVMにコピペできます。
2. コピーしたアプリケーションの設定が今回の環境のものになっているか確認
データベースの接続文字列が今回接続したいものになっているかなど、環境によって変わる部分の修正漏れがないかを確認しておきます。
今回はIISでサイトの設定をしてからappsettings.json
でDBの接続文字列を変更したので、「さっき接続文字列は正しいものに変えたのになんで反映されないんだー」となりました。
その場合はアプリケーションプールのリサイクルが必要になるので、この段階で変更しておくとリサイクル不要になり混乱が少ないです。
3. .NET6 のWindows Hosting Bundle をダウンロード
まだアプリケーションはIISで動きません。
ASP.NET Core アプリを IIS で実行するには.NET Core Hosting Bundleが必要です。
.NET 6 の場合は下記から、他のバージョンであればそれに合わせてインストールしてください。
私はSDKの方をダウンロードしていた()せいでIISからアクセスするとアプリケーションがエラーになり詰まりましたが、必要なのはRuntimeの方です(ちゃんと読めば書いてある)。
Repair
を選択
4. 取得したインストーラーを実行し、インストールではなくRepair
になっていたのですでにサーバーに.NET6がインストールされていたのだと思われます。
下記ドキュメントにもありますが、IISの前にHosting Bundleがインストールされている場合はインストールを修復する必要があるため、ここでRepair
を実行しておきます。
新しいアプリケーションプールの作成
1. インターネット インフォメーション サービス (IIS) マネージャーを開く
「iis」と検索すると出てきます。
Add Application Pool
で画像のようにNo Managed Code
で追加
2. アプリケーションプールを右クリックして ASP.NET Coreの場合は.NET CLR versionがNo Managed Code
になる、という設定についてのドキュメントはこちらです。
こんな階層にドキュメントがあっても気づきません…。探せなかっただけでもっとわかりやすい階層にもあるのでしょうか。
参考までに新しいアプリケーションプールの作成についてのドキュメントはこちらです。
IISサイトの作成
1. デフォルトのサイトを停止
IISマネージャーでサーバー名をクリックして下に出てきた Sites > Default Web Site
を右クリックし、Manage Website > Stop
2. Webサイトを追加
Sites
を右クリックし Add Web Sites
3. Webサイトの設定
サイト名、アプリケーションプール(先ほど作ったもの)、物理パス(アプリケーションの場所。今回はC:\app
)を入力してOK
IISサイトの作成についてのドキュメントはこちらです。
動作確認
localhost
を開いてみる
1. VM内でVM内のブラウザにlocalhost
と打ち込み確認します。
配置した自分のアプリケーションが動作していれば成功です!
もしアプリケーションでエラーが起きていたら下記を参考にして調査してください。
トラブルシューティング方法
- Event Viewerの
Windows Logs > Application
でエラー内容を確認してみる- アプリケーション側でログを出していればそちらも確認する
- アプリケーションを修正した場合はIIS Managerで先ほどサイトに設定したアプリケーションプールを右クリックしてrecycle
- アプリケーションプールをリサイクルしないと変更が読み込まれないことがある
2. VMの外からVMのパブリックIPアドレスにアクセス
ローカルPCのブラウザでVMのパブリックIPアドレスにアクセスし、アプリケーションが動作すれば成功!
※もし接続できなければネットワークセキュリティグループの受信セキュリティ規則でHTTPのポートである80番を許可しているか確認
IISへのWebDploy
毎度コピペでVMにアプリケーションをデプロイするのはつらいです。
そんなときに便利なのがWebDeployです。
WebDeploy3.5を使っている記事がよくヒットしますが、今はインストールできなくなっているそうです。
現在インストール可能なWebDeploy3.6はWebDeploy3.5と操作方法が変わっているようなので注意が必要です。
くさばさんが書いてくださったこちらの記事の手順でAzure VMにもデプロイできることを確認したので、WebDeployしたい方はこちらをご覧ください!
WebDeployする場合はWebDeploy用のポートをインターネットに公開することになるので、それを避けたい場合はGitHub self-hosted runnersを利用するなどの検討が必要かも、という話も出ました。
おわりに
今回イベント形式でわからない部分を教えていただきながらやっていたのですが、わいがやできて楽しかったのでこんなコミュニティを作りました。
一人のドライバーを囲んでわいがやしながら勉強、検証する会です。
テーマもメンバーも募集中です!
Discussion
個人的には特に「アプリケーションのデプロイ」の部分が面白かったです。私が思った何倍以上の注意事項とトピックがありましたね(汗)
確認していただきありがとうございます!
いくつか方法はあると思いますが、確かにVisual Studioに慣れていなかったりするとこの方法は新鮮かもしれませんね🤔