🦦

C#(ASP.NET Core)のアプリケーションをAzure VMのIISでホストする

2024/01/11に公開2

はじめに

この記事のメインは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が有効になっている

経緯

この辺りの内容はひとつのドキュメントにまとまっておらず、知識がない状態では探せなかったのでこんなイベントを開いてみたところ、つよつよな方々に教えていただけました…!ご参加くださった皆様には改めて感謝を申し上げます。

https://azure-waigaya.connpass.com/event/306185/

今回詰まった原因

同じことで詰まっている方もいるかもしれないのでまとめておきます。

  • サーバー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の種類の詳細は下記ドキュメントをご参照ください。
https://learn.microsoft.com/ja-jp/windows-server/get-started/editions-comparison-windows-server-2022?tabs=full-comparison

使えるイメージの調べ方はこちらのドキュメントにまとまっています。
名前にcoreが入っているものはデスクトップがなくコマンドでやるしかなくなるのでそれを避けてイメージを選択しました。

https://learn.microsoft.com/ja-jp/azure/virtual-machines/linux/cli-ps-findimage

もともと win10-22h2-pro でVMを立てていたのですが、これはクライアントOSだったのでWindows Server OSに作り直すことになりました。この違いを質問したところ、一瞬場が固まりました。
クライアントOSとサーバOSというものがあること自体知らなかったので適当に作ったんです…ちゃんと調べようね…。

下記サイトにすんごくわかりやすく書いてありますが、サーバーとして使いたいならその用途に最適化されたサーバーOSにしておけばいい感じにしてくれるよということです。
Server Managerなど、サーバーの管理と構成に必要なツールが備わっています。

https://wa3.i-3-i.info/diff939os.html

Azure EditionはAzureで使うための最適化がされているOSです。
再起動しなくても VM にセキュリティ更新プログラムを適用できるなど便利そうです。本題ではないので詳しくはドキュメントをご覧ください。

https://learn.microsoft.com/ja-jp/windows-server/get-started/azure-edition

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に接続できます。

  1. Azure Potalで作成したVMを開く
  2. 接続 > RDPファイルのダウンロード
  3. ダウンロードしたrdpファイルをダブルクリック
  4. パスワードを求められるのでVM作成時に設定したパスワードを入力
    ※警告が2回出ますが無視でOK

Azure PotalでVMのリソースの接続を確認するとこれ以外の接続方法を表示されますが、いずれの方法でもOKです。わかりやすくて助かります。

ドキュメントはこちらです。

https://learn.microsoft.com/ja-jp/azure/virtual-machines/windows/connect-rdp

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) サーバーの役割をインストールするには」に書いてありました。ソロプレイでは辿り着けません…。

https://learn.microsoft.com/ja-jp/windows-server/networking/core-network-guide/cncg/server-certs/install-the-web-server-web1#to-install-the-web-server-iis-server-role

IISの挙動確認

VM内で確認

ここまで来たら、IISがちゃんと動いていることを確認します。
VMでブラウザを立ち上げてアドレスバーに localhost と打ち込みます。
画像のようなデフォルトのサイトが表示されれば成功です!

VM外で確認

続いてVMの外からこのサイトにアクセスできることを確認します。

VMではなく自分のPCのブラウザのアドレスバーにVMのパブリックIPアドレスを打ち込んでください。
パブリックIPアドレスはポータルでVMの概要から確認できます。
もしVMにパブリックIPアドレスがない場合はこちらのドキュメントを参考に設定してください。

https://learn.microsoft.com/ja-jp/azure/virtual-network/ip-services/associate-public-ip-address-vm?tabs=azure-portal

先ほどVMで localhost と打って表示されたのと同じサイトが表示されれば成功です!
VMのネットワークセキュリティグループの受信セキュリティ規則でポート80が許可されていれば表示できるはずです。

アプリケーションのデプロイ

デプロイするソースの準備

検証できればいいので、ひとまず自分のPCからコピペで持っていきます。
まずコピペするソースを出力します。

  1. Visual StudioでASP.NET Coreのアプリケーションを開く
  2. プロジェクトの上で右クリックして発行を選択

  1. 新しいプロファイル>フォルダー

  1. フォルダーの場所は任意で設定(そこに発行されたものをコピーできればいいので場所がわかっていればOK)
  2. ターゲットランタイムの鉛筆ボタンを押してターゲットランタイム「移植可能」配置モード「フレームワーク依存」に設定

※ 配置モードを「自己完結」にするとVMに.NETライブラリなどがなくても動きますが、その分ファイルサイズが大きくなります

  1. 発行!

発行した結果出力されたディレクトリにそれぞれ何が入っているか気になる方はこちらのドキュメントをご参照ください。

https://learn.microsoft.com/ja-jp/aspnet/core/host-and-deploy/directory-structure?view=aspnetcore-8.0

Visual StudioでのASP.NET Coreアプリケーションの発行についてドキュメントで参照したい場合はこちらです。
コマンドラインからの発行方法なども確認できます。
https://learn.microsoft.com/ja-jp/aspnet/core/host-and-deploy/visual-studio-publish-profiles?view=aspnetcore-8.0#publish-profiles

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の方です(ちゃんと読めば書いてある)。

https://dotnet.microsoft.com/ja-jp/download/dotnet/6.0

4. 取得したインストーラーを実行し、Repair を選択

インストールではなくRepairになっていたのですでにサーバーに.NET6がインストールされていたのだと思われます。
下記ドキュメントにもありますが、IISの前にHosting Bundleがインストールされている場合はインストールを修復する必要があるため、ここでRepairを実行しておきます。

https://learn.microsoft.com/ja-jp/aspnet/core/host-and-deploy/iis/hosting-bundle?view=aspnetcore-6.0#install-the-net-core-hosting-bundle

新しいアプリケーションプールの作成

1. インターネット インフォメーション サービス (IIS) マネージャーを開く

「iis」と検索すると出てきます。

2. アプリケーションプールを右クリックして Add Application Pool で画像のようにNo Managed Codeで追加

ASP.NET Coreの場合は.NET CLR versionがNo Managed Codeになる、という設定についてのドキュメントはこちらです。
こんな階層にドキュメントがあっても気づきません…。探せなかっただけでもっとわかりやすい階層にもあるのでしょうか。

https://learn.microsoft.com/ja-jp/visualstudio/debugger/remote-debugging-aspnet-on-a-remote-iis-computer?view=vs-2022#configure-the-aspnet-core-web-site

参考までに新しいアプリケーションプールの作成についてのドキュメントはこちらです。
https://learn.microsoft.com/ja-jp/iis/configuration/system.applicationhost/applicationpools/#how-to-create-a-new-application-pool

IISサイトの作成

1. デフォルトのサイトを停止

IISマネージャーでサーバー名をクリックして下に出てきた Sites > Default Web Site を右クリックし、Manage Website > Stop

2. Webサイトを追加

Sites を右クリックし Add Web Sites

3. Webサイトの設定

サイト名、アプリケーションプール(先ほど作ったもの)、物理パス(アプリケーションの場所。今回はC:\app)を入力してOK

IISサイトの作成についてのドキュメントはこちらです。
https://learn.microsoft.com/ja-jp/aspnet/core/tutorials/publish-to-iis?view=aspnetcore-8.0&tabs=visual-studio#create-the-iis-site

動作確認

1. VM内でlocalhostを開いてみる

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したい方はこちらをご覧ください!

https://zenn.dev/tomokusaba/articles/7400f34a94fd1f

WebDeployする場合はWebDeploy用のポートをインターネットに公開することになるので、それを避けたい場合はGithub self-hosted runnersを利用するなどの検討が必要かも、という話も出ました。

https://docs.github.com/ja/actions/hosting-your-own-runners/managing-self-hosted-runners/about-self-hosted-runners

おわりに

今回イベント形式でわからない部分を教えていただきながらやっていたのですが、わいがやできて楽しかったのでこんなコミュニティを作りました。
一人のドライバーを囲んでわいがやしながら勉強、検証する会です。
テーマもメンバーも募集中です!

https://azure-waigaya.connpass.com/

Discussion

ericeric

個人的には特に「アプリケーションのデプロイ」の部分が面白かったです。私が思った何倍以上の注意事項とトピックがありましたね(汗)

yumayuma

確認していただきありがとうございます!
いくつか方法はあると思いますが、確かにVisual Studioに慣れていなかったりするとこの方法は新鮮かもしれませんね🤔