今回はいよいよクラウドでのWebアプリ公開サーバであるHerokuを使ったデプロイ方法を紹介します!
目次
Herokuはコンテナベースクラウドプラットフォーム
HerokuはAWSやAzureと同じく、クラウド上で動作するプラットフォームですが、二つと比べて圧倒的に費用が安いのが特徴です。
- AWS/Azureは無料枠や期間があり、それが終了すると継続的に費用が発生してしまう。
- 対するHerokuは公開スペース及び一部のDBが稼働 1000時間/月まで無料で使用可能なのでポートフォリオ公開の場として優秀
- 最大時間を超えたらサイトは見れなくなるが強制的に課金になるというわけではない。
- 作成できるアプリ数に制限はなく複数使用可能。(ただし、複数を稼働状態にするとその分上乗せされるため、1000時間を突破しやすくなる)
- 30分で自動停止機能があり、その分は時間加算されないっぽいのでそうそう超えることはなさそう。
- ロリポップやXサーバなどのレンタルサーバは基本PHPにしか対応していないのでRailsや.NET やPythonを使ったWebアプリ公開に向いている。
ASP.NETでのデプロイまでの全手順
- Visual Stdio上で個人アプリを作る
- HerokuでCreate New App でアプリを新規作成
- アプリのadd-onsで「Heroku Postgres」をインストールする
- 作成したHeroku Postgresにアクセスし、①で使用するテーブルを作成する
- Visual Stdio上で④で作成したテーブルに接続するように変更する
- Dockerfileを準備し、デプロイ(Heroku CLIだけインストールが必要)
Visual Stdio上で個人アプリを作る
これは文字通りでVisual stdio上の作成ですね。ただここで注意点が一つあり、Azure上で公開するならいいですが、Herokuを使って公開したい場合、DBがSQLServer(MSSQL)はHerokuでは使用できませんのでご注意ください。(例外があるが後述)
なのでDBは最初からPostgreSQLにするか最初はSQLServerにして接続DBの載せ替え前提で作ることになると思います。
新規App作成/デプロイ(②と⑥)
これについては参考にしたサイトがあるのでリンクしておきます。
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で環境構築した時に使用した 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は実務での採用度も高い
画像のように利用が無料2022年11月28日からデータベース関係の無償プランがなくなってしまいました。
現在のHeroku Postgresは月額で9ドルかかるようです。(およそ1100円)
「Heroku」の無償プランが廃止へ ~Webアプリを開発・運用できるプラットフォーム
それでもSQLServerを使うよりは安いですが、他の良さそうな案がないかは別途調査して記事にしたいと思います。
MSSQLはオススメできない
一応Add-onにはSQLServer(MSSQL)もありましたが有料でした。。月15ドル(およそ1700円前後)
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にするように修正しましたがその記事は次回書きます。