
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ページです。
ここから先は
¥ 1,000
こんな弱小ブログでもサポートしてくれる人がいることに感謝です。