図1

AWSでWEBサーバーをたてよう(2)

AWS(アマゾンウェブサービス)でWEBサービスを構築する手順の紹介です。同じ手順をPDFファイルにしました、オフラインで手順を見たい人はそちらをどーぞ、本記事の一番最後にあります。
『AWSでWEBサーバーをたてよう』は2回目で、今回はWEBサーバーとDBサーバーを別に構築します。

1.概要

今回、作るものの構成図です

※補足:構成図について
・AWSで構成図を描くときは、AWS提供のアイコンを使用します。
・AWS提供のアイコンは、2種類あります。
・構成図では、旧アイコン、新アイコンと呼称しています。
・構成図は、新旧アイコンで2通り作図しています。

2.1.はじめに

AWSコンソールにサインインし、東京リージョンを選択します。

セキュリティを考慮すると、Rootアカウントではなく、IAMユーザーの利用を推奨します。

2.2.VPCの作成

AWSで仮想サーバーを作るにはVPCやサブネットワークなど用意しないといけないものを作ります。作り方は、前回の『AWSでWEBサーバーをたてよう(1)』2.2 VPCの作成2.2.6.作成したことを確認 を見て、構築します。
 ※PDF版には、全ての手順を書いてあります

この時点で、ここまで構築が完了しました。

2.3.EC2インスタンス(仮想サーバー)を作る

WEBサーバーとDBサーバーを構築するため、仮想サーバーを作ります。AWSで仮想サーバーを作るには、EC2インスタンスを作ります。
EC2インスタンスの作り方は『AWSでWEBサーバーをたてよう(1)』2.3.EC2インスタンスを作る2.4.4.SSH接続 の手順をみて、WEBサーバーとDBサーバーのため、2つEC2インスタンスを作ります。
 ※PDF版には、全ての手順を書いてあります

2.4.DBサーバー構築

作成したEC2インスタンスの1つにPostgreSQLをインストールし、DBサーバーにします。また、別サーバーからDBにアクセスできるようにPostgreSQLの設定を変更します。

2.4.1.バージョン確認

OSバージョンを確認します

$ cat /etc/*release
NAME="Amazon Linux"
VERSION="2"
ID="amzn"
ID_LIKE="centos rhel fedora"
VERSION_ID="2"
PRETTY_NAME="Amazon Linux 2"
ANSI_COLOR="0;33"
CPE_NAME="cpe:2.3:o:amazon:amazon_linux:2"
HOME_URL="https://amazonlinux.com/"
Amazon Linux release 2 (Karoo)

$ cat /etc/system-release
Amazon Linux release 2 (Karoo)

2.4.2.postgreSQLインストール

$ sudo yum install postgresql-server

2.4.3.バージョン確認

$ psql --version
psql (PostgreSQL) 9.2.24

2.4.4.DBの起動

$ sudo postgresql-setup initdb
$ sudo systemctl enable postgresql.service
$ sudo systemctl start postgresql.service

2.4.5.Posgresインストール時にユーザが作成されていることを確認

sudo -u postgres psql -c "ALTER USER postgres PASSWORD 'postgres';"

2.4.6.OSアカウント `postgres` のパスワードも `postgres` にする

$ sudo passwd postgres
Changing password for user postgres.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.

2.4.7.pg_hba.confのパス探す

$ sudo find / -name pg_hba.conf
/var/lib/pgsql/data/pg_hba.conf

2.4.8.pg_hba.confを編集する

$ sudo nano /var/lib/pgsql/data/pg_hba.conf

以下のように編集します

# ↓コメントアウトする
#local   all             all                                     peer

# ↓追記
local   all             all                                     trust

# ↓コメントアウトする
#host    all             all             127.0.0.1/32            ident

# ↓追記
host    all             all             192.168.0.0/16          password

変更前

変更後

2.4.9.Postgresを再起動する

$ sudo service postgresql restart
Redirecting to /bin/systemctl restart postgresql.service

2.4.10.PostgresのDBにアクセスできるか確認する

以下のようになるとアクセス成功

$ psql -U postgres
psql (9.2.24)
Type "help" for help.

postgres=#

コマンド `\l` で、テーブル一覧を出してみる(コマンド `\q` でDBアクセスを終了できます)

postgres=# \l
                                 List of databases
  Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
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
(3 rows)

これで、EC2インスタンスがDBサーバーになりました。
でも、まだ他のサーバーからDBにアクセスはできません。
そのため、以下のように、DBサーバーのIPアドレスを指定すると、アクセスできません。

# DBアクセス失敗例
$ psql -U postgres -h 192.168.1.181
psql: could not connect to server: Connection refused
       Is the server running on host "192.168.1.181" and accepting
       TCP/IP connections on port 5432?

2.5.Postgresを外部接続できるようにする

DBを他のサーバーからアクセスできるように設定を変更します。

2.5.1.postgresql.confのパスを探す

$ sudo find / -name postgresql.conf
/var/lib/pgsql/data/postgresql.conf
/usr/lib/tmpfiles.d/postgresql.conf

2.5.2.`postgresql.conf`を編集する

他の仮想サーバーからDBアクセスできるよう`postgresql.conf`を編集する

$ sudo nano /var/lib/pgsql/data/postgresql.conf

以下を追記する

listen_addresses = '*'
port = 5432

追記前

追記後

2.5.3.PostgreSQL再起動

$ sudo service postgresql restart
Redirecting to /bin/systemctl restart postgresql.service

2.5.4.動作確認

外部からのアクセスできるか確認する。
`127.0.0.1`ではなく、EC2インスタンスに付与されたIPアドレス(例 `192.168.1.74`)を指定してDBにアクセスできれば成功です。

$ psql -U postgres -h 192.168.1.181
Password for user postgres:
psql (9.2.24)
Type "help" for help.

postgres=#

これで、他のサーバーからDBにアクセスできるDBサーバーができました。
次から、DBにデータベースやテーブルを作ります。

2.6.データベースを作る

データベース `testdb` を作ります。
データベース `testdb` に、テーブル `usertbl` を作ります。
テーブル `usertbl` に、`yamada`と`suzuki`という情報を登録します。

$ su - postgres
# データベース作成
$ createdb testdb
# データベースに接続
$ psql testdb
# テーブル作成
CREATE TABLE usertbl (name TEXT, val INTEGER);
# 情報登録
insert into usertbl values ('yamada', 1);
insert into usertbl values ('suzuki', 2);

実際に作業したときの画面を紹介します。

2.7.WEBサーバー構築

前回の『AWSでWEBサーバーをたてよう(2)』ではApacheを使いましたが、今回はNodejsを使ってWEBサーバーを構築してみます。

2.7.1.バージョン確認

OSバージョンを確認します。

$ cat /etc/*release
NAME="Amazon Linux"
VERSION="2"
ID="amzn"
ID_LIKE="centos rhel fedora"
VERSION_ID="2"
PRETTY_NAME="Amazon Linux 2"
ANSI_COLOR="0;33"
CPE_NAME="cpe:2.3:o:amazon:amazon_linux:2"
HOME_URL="https://amazonlinux.com/"
Amazon Linux release 2 (Karoo)

[ec2-user@ip-192-168-1-204 ~]$ cat /etc/system-release
Amazon Linux release 2 (Karoo)

2.7.2.Nodejsインストール

Nodejsをインストールします。
Nodejsの細かいことはおいておいて、とにかく動くものを作ります。

# リポジトリ追加
$ curl -sL https://rpm.nodesource.com/setup_8.x | sudo bash -
# インストール
$ sudo yum install nodejs

# バージョン確認
$ node -v

どんどん作っていきます

$ cd ~
$ mkdir nodejs
$ cd nodejs
$ npm init
# →全ての質問は何も入力せず Enter だけでもOK
$ npm install pg

2.7.3.nodejs/test.jsを作成

作成したディレクトリ`nodejs`の直下に、`test.js`ファイルを作成します。

// test.js
var pg = require('pg');
var conString = "postgres://{ユーザー名}:{パスワード}@{DBサーバーのIPアドレス}/{DB名}";
var resultStr = "";
var client = new pg.Client(conString);
var os = require('os');
var hostname = os.hostname();
client.connect(function(err) {
   if(err) {
       return console.error('could not connect to postgres', err);
   }
   client.query('select name from usertbl;', function(err, result) {
       if(err) {
           return console.error('error running query', err);
       }
       console.log(result.rows[0].name);
       console.log(result.rows[1].name);
       resultStr = "<h3></h3><BR />WEB server : "+ hostname + "<BR>info from DB : " + result.rows[0].name + ", " + result.rows[1].name;
       client.end();
   });
});
var http = require('http');
http.createServer(function (req, res) {
   res.writeHead(200, {'Content-Type': 'text/html'});
   res.end(resultStr);
}).listen(8082, '{WEBサーバーのローカルIPアドレス}');

console.log('Server running at http://{WEBサーバーのローカルIPアドレス}:8082/');

`test.js`の {xxx} を編集します。以下は編集例です。

{ユーザー名} → postgres
{パスワード} → postgres
{DBサーバーのIPアドレス} → 192.168.1.181
{DB名} → testdb
{WEBサーバーのローカルIPアドレス} → 192.168.1.172

以下は、実際に編集したtest.jsです

これで、DBサーバーと連携する、NodejsによるWEBサーバーができました。

2.8.動作確認

WEBサイトにアクセスし、DB情報を表示するサイトが開くか確認します。

2.8.1.Postgresを再起動

念のため、Postgresを再起動します。

# DBサーバーで実行
$ sudo service postgresql restart
Redirecting to /bin/systemctl restart postgresql.service

2.8.2.Nodejsを起動

WEBサイトにアクセスできるよう、Nodejsを起動します。

$ cd ~/nodejs
$ pwd
$ ls
$ node test.js

以下は、実際の実行画面です。

2.8.3.ブラウザでWEBサイトにアクセスしてみる

サイトのURL
  http://{WEBサイトのパブリックDNS名}:8082/

このように、表示されると成功です。

※補足
1行目は、WEBサーバーのホスト名が表示されます。
2行目は、データベースに登録した情報が表示されます。

3.トラブルシュート

3.1.コマンド `node test.js` でエラー

エラーになった場合は、2行目のメッセージがヒントになります。以下の場合は、『database "hogehogedb" does not exist』と、"hogehogedb"なんてありませんよと言っています。
この場合は、『test.jsの {DB名} の値に誤りがある』『 {DB名} のデータベースがない』などが考えられます。

$ node test.js
Server running at http://192.168.1.172:8082/
could not connect to postgres { error: database "hogehogedb" does not exist
   at Connection.parseE (/home/ec2-user/nodejs/node_modules/pg/lib/connection.js:604:11)
   at Connection.parseMessage (/home/ec2-user/nodejs/node_modules/pg/lib/connection.js:401:19)
   at Socket.<anonymous> (/home/ec2-user/nodejs/node_modules/pg/lib/connection.js:121:22)
   at emitOne (events.js:116:13)
   at Socket.emit (events.js:211:7)
   at addChunk (_stream_readable.js:263:12)
   at readableAddChunk (_stream_readable.js:250:11)
   at Socket.Readable.push (_stream_readable.js:208:10)
   at TCP.onread (net.js:601:20)
 name: 'error',
 length: 86,
 severity: 'FATAL',
 code: '3D000',
 detail: undefined,
 hint: undefined,
 position: undefined,
 internalPosition: undefined,
 internalQuery: undefined,
 where: undefined,
 schema: undefined,
 table: undefined,
 column: undefined,
 dataType: undefined,
 constraint: undefined,
 file: 'postinit.c',
 line: '717',
 routine: 'InitPostgres' }

4.PDF版

紹介した手順のPDFファイルです。全ての手順をまとめて確認したい人、オフラインで手順を確認したい人に向けて作りました。全24ページです。

ここから先は

0字 / 1ファイル

¥ 1,000

こんな弱小ブログでもサポートしてくれる人がいることに感謝です。