ようへいの日々精進XP

よかろうもん

【俺の一行チップス】PostgreSQL 9.x で localhost 以外からデータベース接続する (ことを Go の testing パッケージで検証する)

やりたいこと

PostgreSQL 9.x において, localhost 以外からデータベース接続を設定についてまとめたのは前回. 今回は, これを検証するにあたって Go の testing パッケージでテストコードを書いて検証したお話を少し.

inokara.hateblo.jp

諸注意

動作確認環境は以下の通り.

# PostgreSQL サーバー側 (Ubuntu 上にパッケージで PostgreSQL をインストール)
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.3 LTS"

$ /usr/lib/postgresql/9.6/bin/postgres --version
postgres (PostgreSQL) 9.6.16

# psql 側
$ docker-compose exec postgresql_client psql --version
psql (PostgreSQL) 9.6.16

# Go
$ docker-compose exec go_test go version
go version go1.13.6 linux/amd64

やったこと

環境構築とか

環境も docker-compose で用意する前提.

version: '3'

services:
  postgresql_server:
    build:
      context: .
      dockerfile: Dockerfile
      args:
        DB_PASSWORD: "posgre"
    container_name: postgresql-server
    ports:
      - "5432:5432"
    networks:
      my_net:
        ipv4_address: 10.0.101.10

  postgresql_client:
    image: postgres:9
    container_name: postgresql-client
    networks:
      my_net:
        ipv4_address: 10.0.101.11

  go_test:
    build:
      context: tests
      dockerfile: Dockerfile
    container_name: go-test
    environment:
      - DB_HOST=10.0.101.10
      - DB_PASSWORD=posgre
    networks:
      my_net:
        ipv4_address: 10.0.101.5
    command: tail -f /dev/null

networks:
  my_net:
    driver: bridge
    ipam:
     driver: default
     config:
       - subnet: 10.0.101.0/24

docker-compose up -d で全ての環境を起動した直後に, go test した図.

$ docker-compose exec go_test richgo test -v
START| PostgrePing
PASS | PostgrePing (0.01s)
PASS
PASS | postgresql_test 0.027s

いい感じでパスする.

次に, PostgreSQL の設定をデフォルトの状態に戻す. Dockerfile の以下の箇所をコメントアウトする.

# Enable Remote Access
RUN echo "host all all 0.0.0.0/0 md5" >> /etc/postgresql/9.6/main/pg_hba.conf # ここをコメントアウト
RUN echo "listen_addresses='*'" >> /etc/postgresql/9.6/main/postgresql.conf # ここをコメントアウト

コメントアウトすることで, 外部接続に必要な設定を無効化する.

改めて, 環境を作り直してテストを実行.

$ docker-compose build && docker-compose up -d && docker-compose exec go_test richgo test -v
()
START| PostgrePing
FAIL | PostgrePing (0.00s)
     |     postgresql_test.go:41: got error: dial tcp 10.0.101.10:5432: connect: connection refused
FAIL
     | exit status 1
FAIL |  postgresql_test 0.028s

テストが fail する.

テストコード全貌

ということで, 以下のようなテストを書いた.

package main

import (
    "database/sql"
    "fmt"
    _ "github.com/lib/pq"
    "os"
    "testing"
)

const (
    user   = "pgadmin"
    dbname = "postgres"
)

var (
    host     = os.Getenv("DB_HOST")
    password = os.Getenv("DB_PASSWORD")
)

func TestPostgrePing(t *testing.T) {
    db, err := dbConnection()
    if err != nil {
        t.Errorf("got error: %v", err)
    }
    defer db.Close()

    err = db.Ping()
    if err != nil {
        t.Errorf("got error: %v", err)
    }
}

func dbConnection() (*sql.DB, error) {
    connInfo := fmt.Sprintf("host=%s "+
        "port=5432 "+
        "user=%s "+
        "password=%s "+
        "dbname=%s "+
        "sslmode=disable",
        host, user, password, dbname)
    db, err := sql.Open("postgres", connInfo)
    if err != nil {
        return nil, err
    }

    return db, nil
}

Ping を使って, データベースの死活をチェックしている.

作ったもの

github.com

参考

golang.org

godoc.org

github.com

(完)