C#(ASP.NET core)でWeb APIを作ってみる（IISデプロイ編）

# はじめに

前回は、ASP.NET core 2.1でHello World的なAPIを作った後、ローカルPCにあるVisual Studio上でデバッグ実行するところまでやりました。今回はそれをIIS上にデプロイして動かす手順になります。

なおWindows Serverの画面ですが、とある事情により日本語言語パックが当たらず、英語のままになっています。記事の中では日本訳も書きますが、分かりにくくなってすみません。

# 目次

- [Hello World編](https://qiita.com/rawr/items/85abf5f646e20e3438a1)　
- IISデプロイ編　（ここ）

# 準備するもの

- Windows Server 2016
    - ここにIISをインストールします。
- デプロイするWeb API
    - [前回](https://qiita.com/rawr/items/85abf5f646e20e3438a1)作った Todo APIをデプロイします。

# IISをインストールする

(1) Windows Serverのスタートメニューから「サーバーマネージャー(Server Manager)」を起動して、「役割と機能の追加(Add roles and futures)」を選択します。
![2018-11-05_102747.png](https://qiita-image-store.s3.amazonaws.com/0/208281/6e281a98-ac22-fe76-b71d-27ed1fb13955.png)

(2) 開始する前に(Before yo begin)の画面は、そのまま「次へ(Next)」を押します。
![2018-11-05_102802.png](https://qiita-image-store.s3.amazonaws.com/0/208281/50fc2f2b-2efe-d0f5-bc29-0fd40ffea705.png)

(3) インストールの種類(Select installation type)では、IISは役割・機能なので、「役割ベースまたは機能ベースのインストール(Role-baseed or feature-based installation)」を選択します。
![2018-11-05_102815.png](https://qiita-image-store.s3.amazonaws.com/0/208281/0a1f7bec-78f6-20ca-a18d-5eb098e74e5e.png)

(4) 対象サーバーの選択(Select distination server)では、インストール先のサーバーを選択しますた、当然デフォルトの、ローカルホストにします。
![2018-11-05_102854.png](https://qiita-image-store.s3.amazonaws.com/0/208281/15453895-3da0-5004-23f5-c827412a700e.png)

(5) サーバーの役割の選択(Select server roles)では、「Webサーバー(IIS)」を選択します。「必要な機能を選択しますか？」というダイアログが出ますが、そのまま「機能の追加」を押してください。
![2018-11-05_102935.png](https://qiita-image-store.s3.amazonaws.com/0/208281/eb15e74f-b4f3-9bb8-4434-15368cce35d6.png)

(6) 機能の選択(Select features)では、「ASP.NET 4.6」を選択します。
![2018-11-05_103037.png](https://qiita-image-store.s3.amazonaws.com/0/208281/45496cbf-b873-3a3d-4090-e40f8d95c837.png)

(7) Webサーバーの役割(Web Server Role(IIS))は、説明だけなので、そのまま「次へ(Next)」。
![2018-11-05_103215.png](https://qiita-image-store.s3.amazonaws.com/0/208281/61973e3e-0c8e-0658-a6cb-019e7e990534.png)

(8) 役割サービスの選択(Select role Services)は、

- 「アプリケーション開発(Application Development)」＞「ASP.NET 4.6」にチェックする（続いて「必要な機能を追加しますか？」のダイアログが出ますが、そのまま「機能の追加」を押す）
- 「管理ツール(Management Tools)」＞「管理サービス(Management Service)」にチェックする（**これを入れないとWebデプロイができない**）
- （必須ではないが）「Common HTTP Features」＞「Directory Browsing」のチェックを外しておく。コンテンツが無いときに、フォルダの中身一覧が表示されるのは、セキュリティ的にあまりよくない。
![2018-11-05_103337.png](https://qiita-image-store.s3.amazonaws.com/0/208281/ff80dab9-fef5-bf96-79c1-5c043ad606d3.png)
![2018-11-05_103411.png](https://qiita-image-store.s3.amazonaws.com/0/208281/a03d2eef-76cd-811a-7096-d940849c253a.png)
![2018-11-05_103444.png](https://qiita-image-store.s3.amazonaws.com/0/208281/c0ad3653-c7ec-00ee-d170-6d4ab25adf4d.png)

(9) 最後に、確認画面が出るので、「必要に応じて対象サーバーを自動的に再起動する(Restart the destination server automatically if required)」にチェック入れて（多分再起動はしないが）、「インストール(Install)」を押す。
![2018-11-05_103508.png](https://qiita-image-store.s3.amazonaws.com/0/208281/c3dcdfcf-98ed-b087-d2b3-c5a93ba3ca18.png)

(10) インストールが終わるまで待つ
![2018-11-05_103528.png](https://qiita-image-store.s3.amazonaws.com/0/208281/3a1d6522-39ee-2d26-3c5c-455d7430e751.png)

# IISをデプロイ可能にする

IISをインストールするだけでは、まだデプロイ可能になっていないので、デプロイができるようにいろいろ設定が必要になります。

## Web Deployをインストールする

これを入れないと、IISサーバー上で「Web配置による発行の有効化」がメニューに出てきません。

(1) Web Deployのインストーラーをダウンロードする。
[Microsoftのダウンロードページ](https://www.microsoft.com/ja-jp/download/details.aspx?id=43717) からインストーラーをダウンロードします。

(2) Web Deployをインストールする。「完全」でインストールする。
![2018-11-05_135914.png](https://qiita-image-store.s3.amazonaws.com/0/208281/0bc00505-7844-4cb8-a8f0-1c089e49bcde.png)

## Microsoft Visual C++ 2015 再領布可能パッケージを入れる(~~必要に応じて~~)(必須だった)

~~自己完結型の.NET coreアプリケーションを動かす場合は、このパッケージを入れないといけないそうです。~~
次のバンドルを入れるために、必須みたいです。

[Microsoftのダウンロードページ](https://www.microsoft.com/en-us/download/details.aspx?id=52685)から、Japanese(日本語)を選択してダウンロードし、ダブルクリックでインストールできます。

## .NET Core ホスティング バンドルのインストール

[Microsoftのチュートリアルページ](https://docs.microsoft.com/ja-jp/aspnet/core/host-and-deploy/iis/?view=aspnetcore-2.1#install-the-net-core-hosting-bundle)っぽいところから、インストーラーをダウンロードし、ダブルクリックでインストールします。なぜこんなことをしないといけないのかは分かりませんが、これをやらないと[500エラーが出続け、かつログも出ずに路頭に迷い](https://stackoverflow.com/questions/52270350/500-internal-server-error-when-calling-asp-net-core-2-1-web-api-on-windows)ます。
![2018-11-19_231508.png](https://qiita-image-store.s3.amazonaws.com/0/208281/eaa40025-8535-e453-842c-7b3cd486ce2a.png)

## mmcを設定しておく（必須ではない）

今後IISの設定をいじっていくので、いちいちServer Managerから操作するより、Microsoft管理コンソール(mmc)を作っておいたほうがよいでしょう。

(1) Microsoft管理コンソール(mmc)にスナップインしておく。
プログラムとファイルの検索（もしくはWindowsキー+R）で`mmc`と入力します。
![2018-11-05_155320.png](https://qiita-image-store.s3.amazonaws.com/0/208281/78ca76a2-a895-82b8-1304-c91d39066f3a.png)

(2) mmcを起動したら、「ファイル」＞「スナップインの追加と削除(Add/Remove Snap-in)」を選択する。
![2018-11-05_155423.png](https://qiita-image-store.s3.amazonaws.com/0/208281/533ab9f4-e949-f7c5-78ed-d0c517867a6e.png)

(3) 画面がひどく小さいですが、「インターネットインフォーメーションサービス(Internet Information Service)」を選択し、「追加(Add)」で右側ペインに加える。
![2018-11-05_155617.png](https://qiita-image-store.s3.amazonaws.com/0/208281/73e19eed-c1e6-1f49-31a9-09b847361c3c.png)

(4) mmcを適当な名前で保存する。
![2018-11-05_160314.png](https://qiita-image-store.s3.amazonaws.com/0/208281/92653396-3049-bd74-c40e-6201aaf7a3ae.png)

## IISデプロイ用ユーザーを作る

(1) `mmc`から、インターネットインフォメーションサービス(IIS)マネージャーを選択すると、真ん中ペインにWindowsサーバーのマシン名が出るのでこれを選択し、「管理(Management)」から「IISマネージャーユーザー(IIS Manager Users)」を選択する。
![2018-11-05_160453.png](https://qiita-image-store.s3.amazonaws.com/0/208281/f9f51ae4-5e6b-dfeb-10b5-4d8eaffddeb1.png)

(2) 右クリック＞「ユーザーの追加(Add User)」。もしくは右ペインから「ユーザーの追加(Add User)」。
![2018-11-05_160824.png](https://qiita-image-store.s3.amazonaws.com/0/208281/4600633e-161d-948e-959e-137eee2c348e.png)

(3) デプロイ用のユーザーを適当に作る。
このユーザーはOSのユーザーとは別です（Active Directoryにいる必要もない）。IDとパスワードは何でもいいです。ただし、今後デプロイに使うので、忘れないように！
![2018-11-05_160947.png](https://qiita-image-store.s3.amazonaws.com/0/208281/77fe31e1-0ab8-5187-bc56-789321e306c7.png)

### デプロイの有効化

(1) `mmc`を起動し、インターネットインフォメーションサービス(IIS)マネージャーから、（マシン名）＞「サイト」＞「Default Web Site」を右クリックし、「展開(Deploy)」＞「Web配置による発行の有効化(Configure Web Deploy Publishing)」を選択する。
![2018-11-05_161647.png](https://qiita-image-store.s3.amazonaws.com/0/208281/5903116e-5d93-9941-cc67-70612f14364b.png)

(2) 設定をする。

- 「発行アクセス許可を付与するユーザーを選択します(Select a user to give publishing permissions)」は、右側の「...」を押し、IISマネージャーを選択して、先ほど作成したデプロイ用ユーザー：iisdeploy を入力します（あるいは右の「選択」ボタンから iisdeploy を選択します）。
![2018-11-05_162919.png](https://qiita-image-store.s3.amazonaws.com/0/208281/43e1970c-f2a1-1340-3e92-5cd8d464f0ca.png)
- 「発行に使用するSQL Server接続文字列を入力します(Enter SQL Server connection string to be used for publishing)」と「発行に使用するMySQL接続文字列を入力します(Enter MySQL connection string to be used for publishing)」は、使用しないので、空白のまま。
- 「発行サーバーに接続するためにURLを指定します(Specify the URL for the publishing server connection)」は、Visual Studioからリモートでデプロイのときに使用するURLで、**今回使用するので控えておきます**。ホスト名はWindows ServerにアクセスできるURLなら何でも良いのですが、ここではIPアドレスを直書きにしています。ポート番号は変えても良いですが、ここではデフォルトのまま(8172)にしておきます。
- 「発行の設定ファイルの保存先を指定します(Specify a location to save the publish settings file)」は、この設定の保存先です。適当に設定してます（デフォルトはデスクトップ）。
![2018-11-05_162950.png](https://qiita-image-store.s3.amazonaws.com/0/208281/df36d8a7-82e1-f4eb-a6f7-66d06c544d46.png)

(3) 「セットアップ(Set up)」を押すと設定されるので、「閉じる(Close)」でこの画面を閉じます。

# IISにVisual Studioからデプロイする

(1)  Visual Studio上の、プロジェクトを、右クリック＞「発行...」を選択します。
![2018-11-18_112535.png](https://qiita-image-store.s3.amazonaws.com/0/208281/3bc27dbf-f17c-a904-026d-1ad61581ff06.png)

(2) 発行先は、「IIS、FTP、その他」を選択します。
![2018-11-18_112556.png](https://qiita-image-store.s3.amazonaws.com/0/208281/e5d508f1-43d3-b767-925c-8679a7f00fbe.png)

(3) 接続では、先ほど「デプロイの有効化」で設定したIISの接続情報を入力します。

- 「発行方法」は、「Web配置」。
- 「サーバー」は、発行を受け付けるURLで、先ほど「デプロイの有効化」で設定した「発行サーバーに接続するためにURLを指定します(Specify the URL for the publishing server connection)」の値を入力します。
- 「サイト名」とは、IISの「サイト(Sites)」のことです。ここでは、デフォルトで作られている「Default Web Site」を指定することにします。この項目では、「Default Web Site/todo」のようにパスで入力できますが、パスを入れると、複数のアプリケーションを同一サイト(Sites)にいれることができますが、URLが http://172.26.22.44/todo/api/～ のように、コンテキストパスが入ります。
- 「ユーザー名」と「パスワード」は、「IISデプロイ用ユーザーを作る」で作ったユーザーを入力します。
- 「宛て先URL」は、（多分）APIのクライアントがアクセスするURLです。
![2018-11-23_221310.png](https://qiita-image-store.s3.amazonaws.com/0/208281/e10cf390-c0ea-7b6a-2f56-c3b745f66ee2.png)

(4) 全部入力したら、「接続の検証」を押して接続テストをします。証明書検証エラーの画面がでますが、（多分正規の証明書は入れられないので）「承諾」を押してください。（画像紛失しました、すみません）

(5) 設定では、

- 「構成」は、Debug/Release を目的に応じて設定する。
- 「ターゲットフレームワーク」は、当然「netcoreapp2.1」。
- 「配置モード」はどちらでもいいです。この記事では、動作に必要なファイルをすべてデプロイする「自己完結」にしています。「自己完結」にすると、フォルダごと別のIISへ引っ越せますが、デプロイするファイル数が多くなり時間が掛かります。「フレームワーク依存」にすると、デプロイするファイル数は少ないですが、ライブラリのバージョンなど、動作しているIISの環境に依存することになります。
- 「ターゲットランタイム」は、デプロイするAPIの実行環境で、今回はWindows 64bitなIISなので、「win-x64」を選択しておきます。
- 「ファイル発行オプション」は適当に。この記事では、すべてデフォルトのままです。
![2018-11-23_221518.png](https://qiita-image-store.s3.amazonaws.com/0/208281/303b969b-65ec-ed21-e1d9-202b9a23431d.png)

# 上記以外の設定（必要に応じて）

必要最小限の設定はこれで全部なのですが、環境によってはもう少し設定が必要な場合があります。思いつく部分だけ書いておきます。

- デプロイ用ポート 8174 にアクセスできるようにしておく
    - リモートデプロイするとき（設定によるが、デフォルトでは）8174ポートを使うので、WindowsサーバーのWindows FirewallやAWSのセキュリティグループで穴あけしておく必要があります。

# 試す

長かったですが、これで全部です。ブラウザや `curl` でアクセスしてみましょう。GETだけ試すことにします。
※ブラウザでアクセスした画像のIPアドレスが違っていますが、気にしないでください）
![2018-11-23_222016.png](https://qiita-image-store.s3.amazonaws.com/0/208281/9583d710-0273-71e2-c8ad-c264ab62adb1.png)

```
> curl -D - -X GET "http://172.26.22.25/api/todo"
HTTP/1.1 200 OK
Transfer-Encoding: chunked
Content-Type: application/json; charset=utf-8
Server: Kestrel
X-Powered-By: ASP.NET
Date: Fri, 23 Nov 2018 13:19:14 GMT

[{"id":1,"name":"犬の散歩","isDone":false},{"id":2,"name":"買い物","isDone":true},{"id":3,"name":"本棚の修理","isDone":false}]
```

# まとめ

この記事では、デプロイ（発行）先のサイトを Default Web Site にしてしまいましたが、この設定にするとデプロイするファイルが C:\inetpub\wwwroot 直下に配置してしまうので、別のサイトを作った方が良いかもしれません。

いずれにせよ、手順多すぎです…

# 参考文献、サイト

- [IISへのリモートデプロイ手順](http://www.nuits.jp/entry/iis-web-deploy)
    - ほとんどここのコピペになってしまった。ここ見ておけばいいんじゃないの、と思った、のですがいくつか手順が足りないっぽい。
- [.NET coreの前提条件](https://docs.microsoft.com/ja-jp/dotnet/core/windows-prerequisites?tabs=netcore21)
- [IISのチュートリアル](https://docs.microsoft.com/ja-jp/aspnet/core/host-and-deploy/iis/?view=aspnetcore-2.1#install-the-net-core-hosting-bundle)
- [Windowsサーバ―上で ASP.NET core2.1を呼ぶと「500 - Intrenal server error」が出る](https://stackoverflow.com/questions/52270350/500-internal-server-error-when-calling-asp-net-core-2-1-web-api-on-windows)
    - stackoverflow上では、500エラー系の質問が大量にありますが、これが一番的確な質問＆回答だと思います。『Windows Server 2012 RC2でも俺の開発用PCでも完璧に動くのに、最近買った Windows Server 2016 でエラーが出る。』
- [ユーザー 'WDeployConfigWriter' にログオンできません。](https://yigao.jp/technology/windowsserver/12/)
    - コメントで情報を頂いたので、追記します（2020/7/12）。