やったこと
まず、ASP.NET Core MVCのチュートリアルをやった。
https://docs.microsoft.com/ja-jp/aspnet/core/tutorials/first-mvc-app/?view=aspnetcore-5.0
ここで作ったアプリをHerokuでデプロイしたというのが本題。
参考にしたのはこの記事。
https://eiken7.hatenablog.com/entry/2020/08/05/223523
Dockerがまったくわからないので心配だったがそこはなんとかなった。
ちなみに Visual Studio for Mac で開発しています。
つまづいたところ
手順通りやったらいくつか詰まるところがあった。
Heroku 上でテーブルがない
ログをコピーするのを忘れていたけど、確か「'Movie'テーブルが存在しない」とか言われたと思う。
これは、contextに、テーブルがなかったら作るようにするという検証を足すことで対応できた。
context.Database.EnsureCreated()
をProgram.cs
で呼び出すようにすればいい。
public class Program
{
public static void Main(string[] args)
{
var host = CreateHostBuilder(args).Build();
// ここ!!!
CreateDbIfNotExists(host);
using (var scope = host.Services.CreateScope())
{
var services = scope.ServiceProvider;
try
{
SeedData.Initialize(services);
}
catch (Exception ex)
{
var logger = services.GetRequiredService<ILogger<Program>>();
logger.LogError(ex, "An error occurred seeding the DB.");
}
}
host.Run();
}
// ここ!!!
private static void CreateDbIfNotExists(IHost host)
{
using (var scope = host.Services.CreateScope())
{
var services = scope.ServiceProvider;
try
{
var context = services.GetRequiredService<MvcMovieContext>();
DbInitializer.Initialize(context);
}
catch (Exception ex)
{
var logger = services.GetRequiredService<ILogger<Program>>();
logger.LogError(ex, "An error occured creating the DB.");
}
}
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
public class DbInitializer
{
public static void Initialize(MvcMovieContext context)
{
// これね
context.Database.EnsureCreated();
}
}
PostgreSQL に接続できない
次はこんなエラーが。
28000: no pg_hba.conf entry for host "3.95.56.28",
user "ctoondcrubydkb",
database "dfom6cpjugsbme",
SSL off
```エラーメッセージでググるとこんな記事が。
https://neos21.hatenablog.com/entry/2020/08/05/080000
とにかくSSLで接続しなきゃいけないらしい。
このやり方は色々ググったけどなかなか解決しなかった...。
https://docs.microsoft.com/ja-jp/sql/integration-services/import-export-data/connect-to-a-postgresql-data-source-sql-server-import-and-export-wizard?view=sql-server-ver15
https://software.fujitsu.com/jp/manual/manualfiles/m180007/j2ul2368/01z200/j2368-00-04-03-04.html
最終的に、接続文字列をこんな感じにしたらうまくいった。
`$"Host={uri.Host};Port={uri.Port};Database={db};Username={user};Password={password};Enlist=true;Sslmode=Require;TrustServerCertificate=true";`
これでOK。デプロイできた。
## まとめ
ASP.NET Core + Heroku の記事は少なくて大変だった...。
ASP.NET Coreでこれからいろいろ開発してみたいから、とりあえずデプロイの手順の知見を得られたのは大きいだろうと思って、記事を書き残しておいた。