【ASP.NET(C#)7】PostgreSQL付きWebアプリケーション(.NET 6)をHerokuにデプロイ

今回はいよいよクラウドでのWebアプリ公開サーバであるHerokuを使ったデプロイ方法を紹介します!

Herokuはコンテナベースクラウドプラットフォーム

https://jp.heroku.com/home

HerokuはAWSやAzureと同じく、クラウド上で動作するプラットフォームですが、二つと比べて圧倒的に費用が安いのが特徴です。

  • AWS/Azureは無料枠や期間があり、それが終了すると継続的に費用が発生してしまう
  • 対するHerokuは公開スペース及び一部のDBが稼働 1000時間/月まで無料で使用可能なのでポートフォリオ公開の場として優秀
  • 最大時間を超えたらサイトは見れなくなるが強制的に課金になるというわけではない。
  • 作成できるアプリ数に制限はなく複数使用可能。(ただし、複数を稼働状態にするとその分上乗せされるため、1000時間を突破しやすくなる
  • 30分で自動停止機能があり、その分は時間加算されないっぽいのでそうそう超えることはなさそう。
  • ロリポップやXサーバなどのレンタルサーバは基本PHPにしか対応していないのでRailsや.NET やPythonを使ったWebアプリ公開に向いている

ASP.NETでのデプロイまでの全手順

  1. Visual Stdio上で個人アプリを作る
  2. HerokuでCreate New App でアプリを新規作成
  3. アプリのadd-onsで「Heroku Postgres」をインストールする
  4. 作成したHeroku Postgresにアクセスし、①で使用するテーブルを作成する
  5. Visual Stdio上で④で作成したテーブルに接続するように変更する
  6. Dockerfileを準備し、デプロイ(Heroku CLIだけインストールが必要)

Visual Stdio上で個人アプリを作る

これは文字通りでVisual stdio上の作成ですね。ただここで注意点が一つあり、Azure上で公開するならいいですが、Herokuを使って公開したい場合、DBがSQLServer(MSSQL)はHerokuでは使用できませんのでご注意ください。(例外があるが後述)

なのでDBは最初からPostgreSQLにするか最初はSQLServerにして接続DBの載せ替え前提で作ることになると思います。

新規App作成/デプロイ(②と⑥)

これについては参考にしたサイトがあるのでリンクしておきます。

ASP.NETをHerokuでDeployしてみた

ASP.NET Core 3.1のREST-APIをVisualStudio2019とDockerでHerokuにデプロイする手順

上記2サイトは参考になるのですがどちらもASP.NET初期状態のものをアップしていてDB接続パターンがありませんでした。ですので今回はDBも含めた案内を執筆しています。

ちなみに今回のイナコーが作成したDockerfileは以下の通りです。

FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src

COPY ["WebBBS.csproj", "WebBBS/"]
RUN dotnet restore "WebBBS/WebBBS.csproj"
WORKDIR "/src/WebBBS"
COPY . .

RUN dotnet build "WebBBS.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "WebBBS.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
CMD ASPNETCORE_URLS=http://*:$PORT dotnet WebBBS.dll

Docker-compose.ymlは不要

上記サイトの一つに「スタートアッププロジェクトをdocker-composeに変更します。」とあったのですがこれは見つかりませんでした。MS2022にはないのだと思います。

今回はVisual StdioそのものにDockerサポートを導入する必要がありません。ただ、 画像のようにDockerサポートを選ぶとDockerfileを自動生成してくれます。それを上記Heroku構成向けに修正する感じですね。ただ、それをしなくてもDockerfileという名前のファイルを手動作成しても良いです。

ソリューションエクスプローラーのプロジェクトの所で右クリック追加→DockerサポートでLinuxを選択

そして、下記記事で実際にDockerで環境構築した時に使用した docker-compose.ymlも今回は不要です。というのもHeroku CLIで行うコンテナーへのデプロイはWebに対してだけ行われ、DBのインストール行うための docker-compose が実行できないからです。

おそらくデプロイ時のプッシュもHeroku CLIの中で行われているので上記Visual stdioでDockerサポートをしなければDocker Windowsのインストールも不要ではないか?と思います。(私はDockerインストールしていたので試していません)

もしダメだったら入れましょう。下記記事はHome版がベースになっていますがProならもっと簡単にインストールできます。

デプロイの最低限のコマンド

ASP.NETはbuildPackにも対応していないのでGitでなく、Container Registryを使います。Gitは不要ですので通常利用していない場合インストールしないように気をつけましょう。

あとはリストに書いてある通りですが、docker psのコマンドは不要です。このコマンドはローカルで利用しているdockerが表示されるだけでデプロイ時には特に関わりがありません。

heroku login
heroku container:login
heroku container:push web -a webbbs
heroku container:release web -a webbbs

一度ログインした後に更新する場合は

heroku container:push web -a webbbs
heroku container:release web -a webbbs

だけで大丈夫です。

Heroku Postgresインストール

前述したようにHeroku上にはDockerを使ったデータベースの構築ができませんので、Heroku Add-onでDBを作成します。

ここでのオススメは断然 Heroku Postgresです。

  • PostgreSQLは実務での採用度も高い
  • 画像のように利用が無料

MSSQLはオススメできない

一応Add-onにはSQLServer(MSSQL)もありましたが有料でした。。月15ドル(およそ1700円前後)

Heroku Postgresにアクセスし、テーブルを作成

こちらについては他解説サイトがありますので貼っておきます。

Heroku Postgres を利用してみよう

いちばん簡単にPostgreSQLを使う ~HerokuPosgresに繋いでみよう

基本、この説明通りで行けますがA5:SQL Mk-2 の OpenSSLの導入 の作業は不要でした。3年以上前の記事だったのでバージョン問題だと思います。

うまくログインできたら右上のDBをログインできたものを選択し、下記画像のようにテーブル作成コマンドを投入すればOKです。

デプロイ完了

こうして無事デプロイは完了し、Heroku上に個人Webアプリがアップできました。

ポートフォリオ版イナコー掲示板

まとめ

今回解説したようにASP.NET MVCで作られたWebアプリをHerokuにあげたいなら、SQLServerでなくPostgreSQLを使った方が断然良いというのは勉強になりました。

AzureがMicrosoftに特化したクラウドということを考えたらASP.NETで作られたソースの内容をまったく変えずにAzure/Heroku(無料)で公開ということができないので相性はあまり良くないようです><

私が今回Web公開する際にはSQLServerの接続先をPostgreSQLにするように修正しましたがその記事は次回書きます。