やりたいこと
PostgreSQL 9.x において, localhost 以外からデータベース接続を設定についてまとめたのは前回. 今回は, これを検証するにあたって Go の testing パッケージでテストコードを書いて検証したお話を少し.
諸注意
動作確認環境は以下の通り.
# 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 を使って, データベースの死活をチェックしている.
作ったもの
参考
(完)