ASP.NET CoreからHerokuのPostgreSQLに接続する際の接続文字列

ASP.NET Core MVCのアプリケーションからHerokuのPostgerSQLに接続するときにハマったためメモを残す。

環境

Heroku

  • Region:United States
  • Stack:container
  • Framework:Container
  • Heroku Postgres

ASP.NET Core MVC

  • TargetFramework:netcoreapp3.1
  • Microsoft.EntityFrameworkCore:3.1.8
  • Npgsql.EntityFrameworkCore.PostgreSQL:3.1.4

現象

HerokuにデプロイしたアプリケーションからPostgreSQLに接続する際に下記の例外が発生した。(シークレットはXXXXXXXに書き換えている)

1
Unhandled exception. Npgsql.PostgresException (0x80004005): 28000: no pg_hba.conf entry for host "XXXXXXX", user "XXXXXXX", database "XXXXXXX", SSL off

解決方法

  • 調べたところHerokuのPostgerSQLに接続するときにはSSLが必須とドキュメントに記載されている。

  • SSL接続にはSSL検証する方法としない方法がある。

  • ここではSSL検証しない方法を記載する。

  • ASP.NET Core MVCアプリケーションのPostgreSQL接続にはNpgsqlを使用している。

  • SSL接続は接続文字列で有効にできる。

  • 接続文字列をappsettings.jsonに記述する場合は以下のようになる。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
{
  "ConnectionStrings": {
    "DefaultConnection": "Host=YOUR_HOST; Port=5432; Database=YOUT_DATABASE; Username=YOUR_USERNAME; Password=YOUR_PASSWORD; SSL Mode=Require; Trust Server Certificate=true;"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*"
}
  • ポイントはSSL Mode=Require;Trust Server Certificate=true;の2つ。
  • SSL接続を有効にするためSSL Mode=Require;を記述する。
  • また、SSL検証をしない場合はTrust Server Certificate=true;が必要だとNpgsqlのドキュメントに記載されている。

以上

updatedupdated2022-01-042022-01-04