Install PostgreSQL on AWS EC2(Amazon Linux AMI 2013.03.1)

2013.08.09

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ちょっとした調査作業の一環でPostgreSQL on EC2の動作環境を作成してみようと思い、このエントリを書いてみました。基本的には以前書かれたこちらの記事と流れは同じなのですが、別の手法で同等(バージョン)の環境が導入出来たので備忘録がてら残しておきます。

EC2インスタンスの準備

まずはPostgreSQLインストール用のEC2インスタンスを1つ、用意します。

  • イメージは特に拘りは無いので『Amazon Linux AMI 2013.03.1』を利用
  • VPCを作成、そこに紐付ける形でEC2インスタンスを作成(タイプも特に気にしないのでt1.microで)
  • セキュリティグループの指定:任意のグループを作成しSSH(22)、HTTP(80)を選択で追加、また併せて値入力でPostgreSQL用の接続ポート(5432)を追加
  • TagもEC2認識用の内容を適当に設定
  • Elastic IPを取得し、作成したEC2に割り当て

ec2-for-postgresql

用意が出来たらEC2インスタンスへアクセス。

$ ssh -i aws-research-key.pem ec2-user@ec2-XX-XXX-XXX-X.ap-northeast-1.compute.amazonaws.com
The authenticity of host 'ec2-XX-XXX-XXX-XX.ap-northeast-1.compute.amazonaws.com (XX.XXX.XXX.XX)' can't be established.
RSA key fingerprint is XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'ec2-XX-XXX-XXX-XX.ap-northeast-1.compute.amazonaws.com,XX.XXX.XXX.XX' (RSA) to the list of known hosts.

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2013.03-release-notes/
There are 6 security update(s) out of 13 total update(s) available
Run "sudo yum update" to apply all updates.
$

PostgreSQLのインストール

PostgreSQL及びPostgreSQLインストールに必要なパッケージ各種を導入。ググった結果の中では全体更新の後『uuid.i686』も導入していましたが、その場合だと最後のpostgresql関連のパッケージインストール時に内容が衝突するので対象から外しました。

$ sudo yum update -y
$ sudo yum install -y libxslt.i686
$ sudo yum install -y postgresql postgresql-server postgresql-devel postgresql-contrib postgresql-docs
Loaded plugins: priorities, security, update-motd, upgrade-helper
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package postgresql.noarch 0:9.2-1.19.amzn1 will be installed
  :
  (中略)
  :
  Verifying  : postgresql-server-9.2-1.19.amzn1.noarch                                                                                    11/12 
  Verifying  : postgresql-devel-9.2-1.19.amzn1.noarch                                                                                     12/12 

Installed:
  postgresql.noarch 0:9.2-1.19.amzn1
  postgresql-contrib.noarch 0:9.2-1.19.amzn1
  postgresql-devel.noarch 0:9.2-1.19.amzn1      
  postgresql-docs.noarch 0:9.2-1.19.amzn1
  postgresql-server.noarch 0:9.2-1.19.amzn1       

Dependency Installed:
  postgresql9.x86_64 0:9.2.4-1.35.amzn1
  postgresql9-contrib.x86_64 0:9.2.4-1.35.amzn1
  postgresql9-devel.x86_64 0:9.2.4-1.35.amzn1    
  postgresql9-docs.x86_64 0:9.2.4-1.35.amzn1
  postgresql9-libs.x86_64 0:9.2.4-1.35.amzn1
  postgresql9-server.x86_64 0:9.2.4-1.35.amzn1   
  uuid.x86_64 0:1.6.2-11.16.amzn1              

Complete!

導入バージョン確認。上記操作では現在9.2.4が入るようです。

$ psql --version
psql (PostgreSQL) 9.2.4

サービスの起動・停止・再起動

まずは現状構成で動作するかどうかを確認してみます。ec2-userで実行。

## 初期化(PostgreSQLインストール後には必ず実施)
$ sudo /sbin/service postgresql initdb
Initializing database:                                     [  OK  ]

## 起動・停止・再起動
[ec2-user@ip-xx-xxx-xxx-XXX ~]$ sudo /sbin/service postgresql start
Starting postgresql service:                               [  OK  ]
[ec2-user@ip-xx-xxx-xxx-XXX ~]$ sudo /sbin/service postgresql stop
Stopping postgresql service:                               [  OK  ]
[ec2-user@ip-xx-xxx-xxx-XXX ~]$ sudo /sbin/service postgresql restart
Stopping postgresql service:                               [  OK  ]
Starting postgresql service:                               [  OK  ]

サービスの自動起動化設定

必要に応じて以下の自動起動設定を行なってください。

$ sudo /sbin/chkconfig --list | grep postgresql
postgresql     	0:off	1:off	2:off	3:off	4:off	5:off	6:off
$ sudo /sbin/chkconfig postgresql on
$ sudo /sbin/chkconfig --list | grep postgresql
postgresql     	0:off	1:off	2:on	3:on	4:on	5:on	6:off

接続諸設定(ユーザー:postgres)

postgresユーザのパスワードを変更

ec2-userにてPostgreSQL用ユーザーpostgresのパスワードを変更します。

$ sudo passwd postgres
ユーザー postgres のパスワードを変更。
新しいパスワード:(**************)
新しいパスワードを再入力してください:(**************)
passwd: 全ての認証トークンが正しく更新できました。

ユーザが変更出来ることを確認してみます。(確認出来たらec2-userに戻る)

$ su - postgres
パスワード:
-bash-4.1$ exit
-bash-4.1$ 
$

環境諸設定

次は今回のエントリ用に接続設定等を少々変更。PostgreSQLの起動ファイルから設定内容を一部確認してみます。実行プログラムの中身を覗いてみると、パス情報はこんな設定内容になっておりました。

$ vi /etc/init.d/postgresql
-------------------------------
PGVERSION=9.2.4
PREVMAJORVERSION=9.1
PREVPGENGINE=/usr/lib64/pgsql/postgresql-9.1/bin
PGDOCDIR=/usr/share/doc/postgresql9-9.2.4

# Set defaults for configuration variables
PGENGINE=/usr/bin
PGPORT=5432
PGDATA=/var/lib/pgsql9/data
PGLOG=/var/lib/pgsql9/pgstartup.log

DB接続ユーザの作成

設定ファイルpostgresql.confを編集。listen_addressは行先頭のコメントを除去し内容を『*』に変更。

$ su - postgres
$ vi /var/lib/pgsql9/data/postgresql.conf
-----
#------------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#------------------------------------------------------------------------------
# - Connection Settings -
listen_addresses = '*'                  # what IP address(es) to listen on;
                                        # comma-separated list of addresses;
                                        # defaults to 'localhost'; use '*' for all
                                        # (change requires restart)
port = 5432                             # (change requires restart)

次いでpg_hba.confの編集。ここは以下の様に最低限の設定でひとまず進めます。

$ vi /var/lib/pgsql9/data/pg_hba.conf
## ファイル内有効行全コメント→末尾に追加
local   all     all     trust
host    all     all     0.0.0.0/0       md5

設定内容が有効な状態になっているかの確認も兼ねてec2-userで起動停止を確認。

$ sudo /sbin/service postgresql stop
Stopping postgresql service:                               [  OK  ]
$ sudo /sbin/service postgresql start
Starting postgresql service:                               [  OK  ]
$ sudo /sbin/service postgresql restart
Stopping postgresql service:                               [  OK  ]
Starting postgresql service:                               [  OK  ]

DB接続用ユーザーの作成

postgresユーザとは別に、今回の動作確認用のDB接続ユーザーを作成します。まずは、実行ユーザをpostgresにチェンジ。

$ su - postgres
パスワード: (***********)
-bash-4.1$
ユーザー名 cmtestuser
パスワード cmtestpass
データベース cmtestdb

今回作業用の接続ユーザー及びパスワードの設定は上記内容とします。まずはDB接続ユーザー作成/パスワード設定。

$ createuser -AdPE cmtestuser
Enter password for new role: (作成ユーザー名に対応するパスワードを設定)
Enter it again: (上記内容を再入力)
-bash-4.1$

ユーザーが利用するDBの作成(パスワードは上記作成ユーザのパスワードを入力)

$ createdb -E UTF8 -U cmtestuser -W cmtestdb
Password: (**********) 
-bash-4.1$

以上でDBに関する接続ユーザー情報の設定は完了。postgresからec2-userに戻り、DBユーザに紐付くOS側のユーザー名・パスワードを作成。(※内容はDB作成時のユーザに関するものと同じです)

$ sudo adduser cmtestuser
$ sudo passwd cmtestuser
ユーザー cmtestuser のパスワードを変更。
新しいパスワード: (**************)
新しいパスワードを再入力してください: (**************)
passwd: 全ての認証トークンが正しく更新できました。
$

接続確認(Local:CUI)

ユーザーをec2-userからcmtestuserに変更の後、psqlコマンド実行。結果としてDB名一覧の中に作成したものが含まれている事が確認出来ます。

$ su - cmtestuser
パスワード:
[cmtestuser@ip-xx-xxx-xxx-xxx ~]$ psql -l
                                   List of databases
   Name    |   Owner    | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+------------+----------+-------------+-------------+-----------------------
 cmtestdb  | cmtestuser | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 postgres  | postgres   | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 template0 | postgres   | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |            |          |             |             | postgres=CTc/postgres
 template1 | postgres   | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |            |          |             |             | postgres=CTc/postgres
(4 rows)

[cmtestuser@ip-xx-xxx-xxx-xxx ~]$ ¥q

テーブル作成SQLファイルの準備:幾つかのテーブルCREATE文を用意。

$ vi rs_gettingstarted.sql
-------------------------
create table users(
    userid integer not null,
    username char(8),
    firstname varchar(30),
    lastname varchar(30),
    city varchar(30),
    state char(2),
    email varchar(100),
    phone char(14),
    likesports boolean,
    liketheatre boolean,
    likeconcerts boolean,
    likejazz boolean,
    likeclassical boolean,
    likeopera boolean,
    likerock boolean,
    likevegas boolean,
    likebroadway boolean,
    likemusicals boolean);
 
create table venue(
    venueid smallint not null,
    venuename varchar(100),
    venuecity varchar(30),
    venuestate char(2),
    venueseats integer);
 
create table category(
    catid smallint not null,
    catgroup varchar(10),
    catname varchar(10),
    catdesc varchar(50));
 
create table date(
    dateid smallint not null,
    caldate date not null,
    day character(3) not null,
    week smallint not null,
    month character(5) not null,
    qtr character(5) not null,
    year smallint not null,
    holiday boolean default('N'));
 
create table event(
    eventid integer not null ,
    venueid smallint not null,
    catid smallint not null,
    dateid smallint not null ,
    eventname varchar(200),
    starttime timestamp);
 
create table listing(
    listid integer not null ,
    sellerid integer not null,
    eventid integer not null,
    dateid smallint not null  ,
    numtickets smallint not null,
    priceperticket decimal(8,2),
    totalprice decimal(8,2),
    listtime timestamp);
 
create table sales(
    salesid integer not null,
    listid integer not null,
    sellerid integer not null,
    buyerid integer not null,
    eventid integer not null,
    dateid smallint not null,
    qtysold smallint not null,
    pricepaid decimal(8,2),
    commission decimal(8,2),
    saletime timestamp);

DBにログインし、上記SQLファイルを読み込み実行。

$ psql cmtestdb
psql (9.2.4)
Type "help" for help.

cmtestdb=> \i /home/cmtestuser/rs_gettingstarted.sql
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
COMMIT
cmtestdb=>

テーブル一覧コマンド(¥d)で作成したテーブルを確認出来ました。

cmtestdb=> \d
           List of relations
 Schema |   Name   | Type  |   Owner    
--------+----------+-------+------------
 public | category | table | cmtestuser
 public | date     | table | cmtestuser
 public | event    | table | cmtestuser
 public | listing  | table | cmtestuser
 public | sales    | table | cmtestuser
 public | users    | table | cmtestuser
 public | venue    | table | cmtestuser
(7 rows)

cmtestdb=>

接続確認(Remote:GUI)

ローカル:CUIでの接続確認が出来ました。次いで、リモート(今回は動作確認で使ったMac)からAWSのEC2内にインストールしたPostgreSQLのDBにアクセス出来るかどうかを確認してみます。

今回の接続確認にはpgAdminを使いました。Macの場合、pgAdmin: Download - Mac OSXからバージョンv1.16.1のアーカイブを入手、導入しました。

pgAdminを起動、必要な情報を設定。今回追加で設定欄を埋めた内容は以下の通り。

  • 名前:任意の識別名称
  • ホスト:EC2に割り当てたElastic IP
  • パスワード:DB接続ユーザーのパスワード

pgadmin-connect-01

無事、繋がりました!

pgadmin-connect-02

まとめ

この手のエントリは直近・自分が導入したいバージョンや環境に即した情報がなかったりするので割と途中で『ん?』となりがちですよね。AWSだとPostgreSQLでもこのようにパッと環境を用意する事が出来たりします。早くRDSの仲間入りをして欲しいところですね。

参考情報