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 は可能
蛇足
インスタンスをプリエンプティブにすると安い。
可用性ポリシー
を変更する
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 に外部接続許可をする設定
設定ファイルをいじっていく。やることはほぼ ↓ これ
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.conf
の listen_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 コネクタ作らないといけない