AWS で、フロントを Web サーバー、バックエンドに DB サーバーの構築時のメモ（その1）

自分のアマゾンのリソースを、そのアカウント情報も含めて、アマゾンのベストプラクティスに合わせる取組をはじめました。

自分のアカウントは、今まで、root ログインであったものを IAM （AWS Identity and Access Management）を活用して、やりたい事象毎に IAM ユーザーを作成して、そのユーザー上で構築を行うように直しました。

過去 5年間にやっていたことは、言わば過去に自分でやっていた自宅サーバーをクラウド上にもってくる、という意味で、コミュニティ版の OS イメージを EC2 インスタンスとして立ち上げ、その上で PHP+PostgreSQL のサイトを立ち上げていただけでいた。まあ、これはこれでオンプレのサーバーをクラウドにおいて管理する、ということで意味があるかとはおもいますが、AWS のベストプラクティスを実践していたとは言えなかったです。

これを、あらたに VPC を作成し、Web サーバーと DB サーバーに分離して、前者を public subnet に、後者を private subnet に置き、internet-gateway、nat-gateway を作成して、DB サーバーをバックエンドに格納してセキュリティを高め、Web サーバーと DB サーバーとの通信は、あらたに作成する routing table により行うことにしてみます。また、EIP もあらたに作成して、インスタンス再起動によっても EC2 インスタンスは複数必要となりますが、最近数年間で、AWS は値下げを続けているそうで、実際、私が数年前、試しに複数インスタンスや EIP をつかってみた時の課金状況よりも、大分改善された（安くなった）と感じているので、AWS のベストプラクティスに従ってちょっとやり直しをしてみよう、ということです。

では、実際にやってみたことを、以下に記述します。

 アカウントについて
root ユーザーでログインするときは、メールアドレスでログインして、パスワードを入れます。

IAM ユーザーを作成します。
このアカウントには、一つの環境しか作成しない方がいいです。
また、試験環境のアカウントと、本番環境のアカウントで、分けた方がいいです。
要すれば、アカウント単位で分けるのがいいということになります。

IAM ユーザーでログインする時は、ID + IAMユーザー名 + IAMユーザーのパスワード でログインします。
なお、IAM ユーザーに billing を閲覧させるには、以下のページの通りを設定してください。
https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_billing.html?icmpid=docs_iam_console#tutorial-billing-step1

要すれば、web サーバーを public に置いて、プライベートに置いた db サーバーからデータを取得する、ということをやりたいです。

VPC をクリックします。
vpc を作成します（10.0.0.0/16）。
10.0.0.0/16 のネットワークを作成します。

4つの subnet を作成します。

```
subnet-xxxx-public-1a （10.0.11.0/24）
subnet-xxxx-public-1c（10.0.12.0/24）
subnet-xxxx-private-1a（10.0.21.0/24）
subnet-xxxx-private-1c（10.0.22.0/24）
```

それぞれ、north-eastern-1a,1c と紐づけます。

internet-gateway を作成します。
internet-gateway を、取得した EIP に紐づけます。

セキュリティグループを作成します。
web サーバー用のセキュリティグループを作成します。
ssh を、Myip にします。
http も追加します。

dbサーバー用のセキュリティグループを作成します。
ssh を、subnet-xxxx-public-1a のアドレス体系に許可します。
postgresql を追加します。これも、subnet-xxxx-public-1a のアドレス体系に許可します。

nat-gateway を、subnet-xxxx-public-1a （10.0.11.0/24） に作成します。

EC2 を Launch します。
community の fedora をチェックします。
atomic-host-upgrade-20181127 を選びます。
それぞれの項目を適切に選択します。
（あとで記述を追加する）

セキュリティグループ
ssh でログインします。
Elastic IP を指定しておきます。
そしてそれを、作成したマシンに紐づけておきます。

```
$ ssh -i xxxx.pem fedora@<EIP に紐づいたグローバルIP>
[fedora@ip-10-0-11-112 ~]$
```

上記のように、subnet に紐づいた名前が出てきますね。
- では、OS のアップグレードをします。
OS のアップグレード

```
# sudo su -
# atomic host upgrade
# systemctl reboot
```

- パッケージの確認をします。

```
# rpm -qa | wc -l
# rpm -q kernel
kernel-4.19.3-300.fc29.x86_64
```

- vim のインストールをします。

```
# atomic host install vim
```

- httpd のインストールをします。

```
# atomic host install httpd
```

- php のインストールをします。

```
# atomic host install php
```

ところで、インストールした後に、systemctl reboot としろ、となりますが、
これはなんなんだろう。これやらないと、rpm -qa | grep <package名>で
出てこないので、やっておきます。

```
# systemctl reboot
```

ところで、dnf も yum も入っていません。。インストール・アップデートは、atomic host コマンドを使うようです。あとでまた調べよう。。

ここで、ip a としてみます。

```
[fedora@ip-10-0-11-112 ~]$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc fq_codel state UP group default qlen 1000
link/ether 06:20:e7:b2:4a:12 brd ff:ff:ff:ff:ff:ff
inet 10.0.11.112/24 brd 10.0.11.255 scope global dynamic noprefixroute eth0
valid_lft 3323sec preferred_lft 3323sec
inet6 fe80::420:e7ff:feb2:4a12/64 scope link
valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:9e:5b:b1:77 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 scope global docker0
valid_lft forever preferred_lft forever
```

なるほど、あくまで、ip は、10.0.11.112 という事なのですね。

```
# systemctl enable httpd
# systemctl start httpd
# systemctl status httpd
```

DB サーバーを Launch します。PostgreSQL をインストールします。

```
# atomic host upgrade
# atomic host install postgresql vim postgresql-server
# systemctl reboot
```

db サーバーを web サーバーと同様に作成します。

web サーバーを踏み台として、dbサーバーに ssh 経由でログインしましょう。
その時に、ローカルホストから、秘密鍵を scp でコピーしておきます。
要すれば、web サーバーに ssh 経由でログインしてから、さらに、db サーバー
にログインする、ということになります。

db サーバーにログインできたら、次のコマンドを実行します。

```
# rpm -qa | grep postgresql
postgresql-10.6-1.fc29.x86_64
postgresql-libs-10.6-1.fc29.x86_64
postgresql-server-10.6-1.fc29.x86_64
# systemctl status postgresql.service
# systemctl enable postgresql.service
# systemctl start postgresql.service
# systemctl status postgresql.service
--------
Directory "/var/lib/pgsql/data" is missing or empty.
Use "/usr/bin/postgresql-setup --initdb"
--------
```

ということなので、以下のコマンドを実行します。


```
# /usr/bin/postgresql-setup --initdb
--------
* Initializing database in '/var/lib/pgsql/data'
* Initialized, logs are in /var/lib/pgsql/initdb_postgresql.log
--------
# systemctl enable postgresql.service
# systemctl start postgresql.service
# systemctl status postgresql.service
```

立ち上がっていますよね。

```
# exit
$ exit
```

とすると、web サーバーに戻ります。

```
$ exit
```

で、ホストマシンに戻ります。


参考資料：

AWS でシステム構築するときに使うアイコンのガイドラインとなります。

AWS Simple Icons

 今回参考にしたサイトになります。

https://www.udemy.com/aws-14days/

つづく。