Closed5

GCE に PostgreSQL サーバを立ててサーバレスサービスから接続する

こまつやまこまつやま

heroku が無料で使えなくなるらしいので heroku の移行と勉強を兼ねて GCE に PostgreSQL を立てる

実現したいこと

  • GCE に PostgreSQL を立てて、Cloud Run や Cloud Functions などのサーバレス系のサービスと接続
  • DB サーバは外部公開したくない

やること

  • VPC を作る
  • GCE のインスタンスを立てる
  • 内部 IP を固定
  • DB サーバのポートを開放
  • postgres に外部接続許可をする設定
  • VPC コネクタ作成
  • Cloud Functions 作成
  • 疎通確認
こまつやまこまつやま

VPC を作る

vpc ネットワークととサブネットを 1 つ作る。とりあえず細かい設定はナシ
IPv4 ファイアウォールルールの設定が必要だが、ここでは後回し

こまつやまこまつやま

GCE のインスタンスを立てる

インスタンス作成時に、ネットワークインターフェイス に先ほど作成した VPC を設定する
内部 IP を固定したいので、静的内部 IP を予約 をする

インターネットに公開はしないので外部 IP アドレスは作成しない (外部 IP がなくても gcloud compute ssh で ssh は可能

蛇足

インスタンスをプリエンプティブにすると安い。

https://cloud.google.com/compute/docs/instances/preemptible?hl=ja

可用性ポリシー を変更する

こまつやまこまつやま

DB サーバのポートを開放

外部から先程立てた GCE のインスタンスに外部からの接続ができるようにするため、ファイアウォールルールを追加する。PostgreSQL のデフォルトポートである 5432 番への接続を許可する

ファイアウォールルールを作るコマンド
$ gcloud compute --project=project-id firewall-rules create main-vpc-allow-postgres \
  --direction=INGRESS \
  --priority=1000 \
  --network=main-vpc \
  --action=ALLOW \
  --rules=tcp:5432 \
  --source-ranges=0.0.0.0/0 \ # 接続元の IP も制限したほうが良いと思うが、まだわからんのでいったん全許可
  --target-tags=use-5432

↑ のルールを適用するためにファイアウォールのターゲットタグ (use-5432) を ネットワークタグ に設定

こまつやまこまつやま

postgres に外部接続許可をする設定

設定ファイルをいじっていく。やることはほぼ ↓ これ

https://densan-hoshigumi.com/server/postgresql-remote-connection

postgres はインストールしてある前提

$ psql --version 
psql (PostgreSQL) 13.7 (Debian 13.7-0+deb11u1)

postgres 13系だと設定ファイルは下記ディレクトリにあった。バージョンによって設定ファイル場所は異なるらしい

$  ls -1  /etc/postgresql/13/main                
conf.d
environment
pg_ctl.conf
pg_hba.conf
pg_ident.conf
postgresql.conf
start.conf

クライアントが指定できるホストの設定

postgresql.conflisten_addresses を変更する。デフォルトでは localhost だけになっているので、静的内部 IP を予約 してできた IP を追加してやる。接続元は VPC 内部からの接続のみを想定しているのでこれだけで OK。のはず

listen_addresses = 'localhost,10.0.0.2'

接続元の IP を許可

pg_hba.conf に許可する host を追加する。ここに指定した IP から接続が可能になる。IPv4 使ってるのでそこに追加

# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
host    all             all             許可する IP レンジ md5

この段階だと接続元の IP レンジがわからない。接続先が Cloud Functions や Cloud Run なので VPC コネクタ作らないといけない

このスクラップは2022/09/24にクローズされました