いわりょのBlog

IT関連で学んだことを書いていきます。

PostgreSQLをEC2に導入する

f:id:Ryo10Leo:20200115230205p:plain

AWSのEC2サーバー内でWeb3層構成を構築している際、データベース層には「PostgreSQL」を導入することにした。

導入するのに苦労したので、導入やユーザー、データベース作成の過程を書いていきたい。

PostgreSQLのダウンロードリスト

以下をインストールしました。

$ sudo yum list
postgresql.x86_64                      
postgresql-contrib.x86_64              
postgresql-devel.x86_64                
postgresql-libs.x86_64                  
postgresql-server.x86_64                

存在を確認します。

$ psql --version

PstgreSQLの設定や操作

データベースの初期化

$ sudo service postgresql initdb

データベース起動

$ sudo service postgresql start

起動確認します。

$ service postgresql status

systemctlコマンドでも実行できるけど、違いがわかんねぇ...
「service postgresql status」だと「Redirecting to /bin/systemctl status postgresql.service」と出るからどっちも同じ意味だよね?笑

サーバー(EC2インスタンス)起動時に、PostgreSQL自動起動させる

$ sudo chkconfig postgresql on

以下のコマンドでもできた↓

sudo systemctl enable postgresql

結果が以下の通り(enable)なら無事自動起動の設定完了

$ systemctl list-unit-files -t service | grep postgres
postgresql.service                            enabled 

エンコードの変更

まずデフォルトのデータベースを確認します。

PostgreSQL にスーパーユーザー(postgres)で接続

$ sudo -u postgres psql
postgres=# \l
                                    List of databases
     Name     |  Owner   | Encoding  |   Collate   |    Ctype    |   Access privileges   
--------------+----------+-----------+-------------+-------------+-----------------------
 postgres     | postgres | SQL_ASCII | C           | C           | 
 template0    | postgres | SQL_ASCII | C           | C           | =c/postgres          +
              |          |           |             |             | postgres=CTc/postgres
 template1    | postgres | SQL_ASCII | C           | C           | 

このままデータベースを作成するとエンコードが「SQL_ASCII」になってしまうため、アプリ側で「UTF-8」に設定していると、アプリとデータベースでうまく接続されません。
先にエンコードが「UTF-8」になるように設定します。

参考↓
PostgreSQL: template1 のエンコーディングを UTF-8 に変更する - tkrdの日記

postgres=# UPDATE pg_database SET datistemplate = FALSE WHERE datname = 'template1';
# DROP DATABASE template1;
# CREATE DATABASE template1 WITH TEMPLATE = template0 ENCODING = 'UTF8'
  LC_COLLATE = 'ja_JP.UTF-8' LC_CTYPE = 'ja_JP.UTF-8';
# UPDATE pg_database SET datistemplate = TRUE WHERE datname = 'template1';

これでやっと諸々の作成作業に入れます。

ユーザーやデータベースの作成

ユーザー(パスワード付き)を作成して、そのユーザーが所有するデーターベースを作成します。
今回はアプリの本番環境で使うデータベースを作成します。

ユーザーを作成(パスワード付き)

postgres=# alter role postgres with password ‘password’;  
# alter role ユーザー名 with password ‘password‘;

権限を与えます。↓

postgres=# ALTER ROLE user-name WITH CREATEDB;
ALTER ROLE
postgres=# \du

List of roles
     Role name      |                         Attributes                         | Member of
--------------------+------------------------------------------------------------+-----------
 user-name          | Create DB                                                  | {}

これはいるのかわからないけど。。。↓

/var/lib/pgsql93/data/pg_hba.conf

# TYPE  DATABASE  USER  ADDRESS   METHOD
#local   all       all             peer  ← コメントアウトか、削除
local   all       all             md5   ← 追加

いろいろ調べた結果、今回の作業だと蛇足だったかもです。

データベース作成↓

postgres=# create database [database_name] owner [user_name];

とりあえずこれで、アプリに繋ぐ PostgreSQL側の下準備はできたと思う。