【AWS入門】EC2インスタンス上に.NET Core + nginx環境を構築

[VSCode Remote Containersで.NET Core + MySQL + Elasticsearchの開発環境構築](https://qiita.com/ashicom/items/88d5e5bfc0febe1db30a) の続きです。

今回はAWSのEC2インスタンス上にWebアプリを配置後、nginxでリバースプロキシするところまでをご紹介しようと思います。

#はじめに
ネットワーク構築とEC2インスタンスの作成が済んでいることが前提となります。
その部分に関しては以下書籍で勉強しましたので合わせてご紹介します。
[Amazon Web Services 基礎からのネットワーク&サーバー](https://www.amazon.co.jp/Amazon-Services-基礎からのネットワーク-サーバー構築-改訂3版/dp/4296105442/ref=asc_df_4296105442/?tag=jpgo-22&linkCode=df0&hvadid=414420639029&hvpos=&hvnetw=g&hvrand=5662919067394440058&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009225&hvtargid=pla-873736652857&psc=1&th=1&psc=1)

#環境
- Amazon Linux 2 AMI (HVM), SSD Volume Type
- t2.micro

#ソースコード
https://github.com/t-ash0410/asp.net-core-sample

#1. EC2インスタンスにnginxのインストール
まずはnginxをインストールしましょう。
EC2インスタンスにSSHして、以下コマンドを実行します。

```
$ sudo yum -y update 
$ sudo amazon-linux-extras install nginx1
$ sudo service nginx start
```

以上を実施した後、ローカルマシンのブラウザにて`http://サーバIP`に接続し、以下のような画面が表示されれば成功です。

![スクリーンショット 2020-10-26 2.57.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562139/4ba5a0a9-8deb-b839-3031-1dfcc1d10774.png)


`$ sudo amazon-linux-extras install nginx1`
このコマンドについてですが、EC2インスタンス上でnginxをインストールしようとするとこのコマンドを使ってねという案内が表示されました。
[amazon-linux-extrasについてはこちらで紹介されています。](https://aws.amazon.com/jp/amazon-linux-2/faqs/)

#2. nginxにリバースプロキシ設定
次にnginxにリバースプロキシの設定をしていきます。
nginxのコンフィグファイルを編集するため、EC2インスタンスにSSHして、以下コマンドを実行します。

```
$ sudo vim /etc/nginx/nginx.conf
```

コンフィグファイルの内容を以下のように編集します。

```
server {
      # ここから
      location / {
          proxy_pass http://localhost:5000/;
      }
      # ここまで追加
  }
```

以下コマンドでコンフィグファイルの内容が正しいか確認します。

```
$ sudo nginx -t

#これが出力されればOK
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
```

編集完了後、設定を反映させるためnginxを再起動します。

```
$ sudo service nginx restart
```

もう一度、ローカルマシンのブラウザにて`http://サーバIP`に接続してみましょう。
現状ではポート5000にてアプリケーションを起動していないため、以下のような画面が表示されればOKです。

![スクリーンショット 2020-10-26 3.15.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562139/ff20f258-fe93-d2df-0085-06714cd42e05.png)

#3. EC2インスタンスに.NET Core Runtimeのインストール
続いて、.NET Coreアプリケーション実行のために、.NET Core Runtimeをインストールしていきます。
EC2インスタンスにSSHして、以下コマンドを実行します。

```
$ sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
$ sudo yum install -y aspnetcore-runtime-3.1
```

runtimeが正常にインストールされたかを確認します。

```
$ dotnet -h

#これが出力されればOK
  It was not possible to find any installed .NET Core SDKs
  Did you mean to run .NET Core SDK commands? Install a .NET Core SDK from:
      https://aka.ms/dotnet-download

Usage: dotnet [host-options] [path-to-application]

path-to-application:
  The path to an application .dll file to execute.

host-options:
  --additionalprobingpath <path>  Path containing probing policy and assemblies to probe for.
  --depsfile <path>               Path to <application>.deps.json file.
  --runtimeconfig <path>          Path to <application>.runtimeconfig.json file.
  --fx-version <version>          Version of the installed Shared Framework to use to run the application.
  --roll-forward <value>          Roll forward to framework version (LatestPatch, Minor, LatestMinor, Major, LatestMajor, Disable)
  --additional-deps <path>        Path to additional deps.json file.
  --list-runtimes                 Display the installed runtimes
  --list-sdks                     Display the installed SDKs

Common Options:
  -h|--help                           Displays this help.
  --info                              Display .NET Core information.
```

#4. EC2インスタンスに.NET Coreアプリケーションをデプロイ
続いては.NET Coreアプリケーションのデプロイまでを一気にやっていきます。

---

まずは、アプリケーションをデプロイするディレクトリを作成しましょう。
EC2インスタンスにSSHして、以下コマンドを実行します。

```
$ sudo mkdir -p /var/www/asp-net-app
$ sudo chown ec2-user /var/www/asp-net-app
```

---

次に、アプリケーションを発行します。
ローカルマシンで以下コマンドを実行してください。

```
$ cd アプリケーションのルートディレクトリ/app/Web
$ dotnet publish -c Release

# これが表示されればOK
Microsoft (R) Build Engine version 16.7.0+7fb82e5b2 for .NET
Copyright (C) Microsoft Corporation. All rights reserved.

  Determining projects to restore...
  All projects are up-to-date for restore.
  Lib -> アプリケーションのルートディレクトリ/app/Lib/bin/Release/netcoreapp3.1/Lib.dll
  Web -> アプリケーションのルートディレクトリ/app/Web/bin/Release/netcoreapp3.1/Web.dll
  Web -> アプリケーションのルートディレクトリ/app/Web/bin/Release/netcoreapp3.1/Web.Views.dll
  Web -> アプリケーションのルートディレクトリ/app/Web/bin/Release/netcoreapp3.1/publish/
```

---

続いて、発行されたアプリケーションをデプロイしましょう。
以下コマンドをローカルマシンにて実行します。

```
$ scp -i "pemファイル" -r アプリケーションのルートディレクトリ/app/Web/bin/Release/netcoreapp3.1/publish/* ec2-user@サーバアドレス:/var/www/asp-net-app

# ファイルの転送状況が表示されていればOK
```

---

ここまででアプリケーションのデプロイが完了しました。
確認のため、EC2インスタンスにSSHして以下を実行してみましょう。

```
$ dotnet /var/www/asp-net-app/Web.dll
```

次に、ローカルマシンのブラウザで`http://サーバIP/health/check`を表示してみます。
以下のようなレスポンスが返却されればサーバ上でアプリケーションの実行に成功しています。

![スクリーンショット 2020-10-26 3.43.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562139/e364b9ce-c914-1f27-edd5-ce0232a8e7a1.png)

#5. サービスにアプリケーションを追加
以上の手順でEC2上にて.NET Coreアプリケーションを実行することに成功しましたが、このままだと実行ユーザがSSHでログインしたユーザになっているので、ログアウトするとアプリが停止してしまいます。

そんなWebアプリケーションは聞いたことがないので、nginxにアプリケーションの管理を任せ、ログアウト後も実行を継続させましょう。

---

まずは追加するサービスの構成ファイルを作成します。
以下コマンドを実行しましょう。

```
$ sudo vim /etc/systemd/system/kestrel-asp-net-app.service
[Unit]
Description=Service file for book app.

[Service]
WorkingDirectory=/var/www/asp-net-app
ExecStart=/usr/bin/dotnet /var/www/asp-net-app/Web.dll
Restart=always
RestartSec=10
SyslogIdentifier=dotnet-example
User=nginx
Environment=ASPNETCORE_ENVIRONMENT=Production

[Install]
WantedBy=multi-user.target
```

---

次に、作成したサービスをsystemctlに登録します。
以下コマンドを実行しましょう。

```
$ sudo systemctl enable kestrel-asp-net-app.service
$ sudo systemctl start kestrel-asp-net-app.service
```

以下コマンドで正常に起動しているかの確認ができます。
反映まで数秒かかる場合がありますので、焦らずに確認していきましょう。

```
$ systemctl status kestrel-asp-net-app.service

#これが表示されればOK
kestrel-asp-net-app.service - Service file for book app.
   Loaded: loaded (/etc/systemd/system/kestrel-asp-net-app.service; enabled; vendor preset: disabled)
   Active: active (running) since 日 2020-10-25 19:14:25 UTC; 11h ago
 Main PID: 9868 (dotnet)
   CGroup: /system.slice/kestrel-asp-net-app.service
           └─9868 /usr/bin/dotnet /var/www/asp-net-app/publish/Web.dll
```

---

以上でサービスへの登録が完了し、ログアウト後もサービスを続けることが可能になりました。
確認のため、SSH接続を終了し、ローカルマシンにて`http://サーバIP/health/check`にアクセスしてみましょう。
`{message:"ok"}`が表示されれば正常にアプリケーションが動作しています。

#link
[MS Nginx 搭載の Linux で ASP.NET Core をホストする](https://docs.microsoft.com/ja-jp/aspnet/core/host-and-deploy/linux-nginx?view=aspnetcore-3.1)