2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ASP.NET Core MVC を Heroku でデプロイした

Last updated at Posted at 2020-12-14

やったこと

まず、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で呼び出すようにすればいい。

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>();
            });
}
Data/DbInitializer.cs
public class DbInitializer
{
    public static void Initialize(MvcMovieContext context)
    {
        // これね
        context.Database.EnsureCreated();
    }
}

PostgreSQL に接続できない

次はこんなエラーが。

Npgsql.PostgresException (0x80004005)
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でこれからいろいろ開発してみたいから、とりあえずデプロイの手順の知見を得られたのは大きいだろうと思って、記事を書き残しておいた。
2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?