AWS で LAMP 環境を構築する方法

AWS で VPC > サブネット > インスタンス を作って、そして LAMP 環境を作るための方法です。
また、 `FTP` `phpMyAdmin` `VirtualHost` のインストール方法・設定も書いておきます。

## VPCを作成

- `サービス > VPC > VPC` の順にアクセスし、 `VPC の作成` をクリックします。

- 次の情報を入力します。

```yml
名前タグ: sample-vpc  #任意の名前
IPv4 CIDR ブロック: 192.168.0.0/16
IPv6 CIDR ブロック: IPv6 CIDR ブロックなし
テナンシー: デフォルト
```

※ 上記の設定では、IPアドレスを **192.168.<font color="Red">[0-255]</font>.<font color="Red">[0-255]</font>** までを割り振ることができます。

## サブネットを作成

- `サービス > VPC > サブネット` の順にアクセスし、 `サブネットの作成` をクリックします。

- 次の情報を入力します。

```yml
名前タグ: sample-subnet  #任意の名前
VPC: sample-vpc
アベイラビリティーゾーン: ap-northeast-1a
IPv4 CIDR ブロック: 192.168.1.0/24
```

※ アベイラビリティーゾーンは、 `ap-northeast-1a` `ap-northeast-1c` `ap-northeast-1d` から選びます。

※ 上記の設定では、IPアドレスを **192.168.1.<font color="Red">[0-255]</font>** までを割り振ることができます。

## インスタンスを作成

- `サービス > EC2 > インスタンス` の順にアクセスし、 `インスタンスの作成` をクリックします。

- **1. AMIの選択**  
  今回は、 `Amazon Linux 2 AMI (HVM), SSD Volume Type - ami-00d101850e971728d` を選択します。

- **2. インスタンスタイプの選択**  
  無料利用枠の対象である `t2.micro` を選択し、 `次の手順` をクリックします。

- **3. インスタンスの設定**  
  次の情報を入力し、 `次の手順` をクリックします。

```yml
ネットワーク: sample-vpc
サブネット: sample-subnet
自動割り当てパブリック IP: 有効  
テナンシー: 共有
```

- **4. ストレージの追加**  
  今回は、デフォルトのまま、 `次の手順` をクリックします。

- **5. タグの追加**  
  次のタグを追加し、 `次の手順` をクリックします。

```yml
Name: sample-webserver-1  #任意の名前
```

- **6. セキュリティグループの設定**  
  次の情報を入力し、 `次の手順` をクリックします。

```yml
セキュリティグループの割り当て: 新しいセキュリティグループを作成する
セキュリティグループ名: sample-sg
説明: sample security group
```

| タイプ | プロトコル | ポート範囲 | ソース    | 説明 |
| ------ | ---------- | ---------- | --------- | ---- |
| SSH    | TCP        | 22         | マイ IP   |      |
| HTTP   | TCP        | 80         | 0.0.0.0/0 |      |
| HTTPS  | TCP        | 443        | 0.0.0.0/0 |      |

- **7. 確認**  
  問題なければ `起動` をクリックします。

- **既存のキーペアを選択するか、新しいキーペアを作成します。**  
  次の情報を入力後、 `インスタンスの作成` をクリックします。

```yml
新しいキーペアの作成 | 既存のキーペアの選択
キーペア名: sample-key  #任意の名前

# 新規のキーペアの場合は、ここでダウンロードします
# 既存のキーペアの場合は、次の文にチェックを付けます

[レ] 選択したプライベートキーファイル (sample-key.pem) へのアクセス権があり、このファイルなしではインスタンスにログインできないことを認識しています。
```

## インターネットゲートウェイを作成

- `サービス > VPC > インターネットゲートウェイ` の順にアクセスし、 `インターネットゲートウェイの作成` をクリックします。

- 次の情報を入力し、 `作成` をクリックします。

```yml
名前タグ: sample-igw  # 任意の名前
```

- インターネットゲートウェイを VPC にアタッチします。
  - 作成したインターネットゲートウェイを選択し、 `アクション > VPC にアタッチ` をクリックします。
  - 対象の VPC を選択し、 `アタッチ` をクリックします。

- サブネットのルートテーブルを編集して、インターネットへ出れるようにします。
  - `サービス > VPC > サブネット` の順にアクセスし、 対象のサブネットをクリックします。
  - 画面下のルートテーブルタブをクリックします。
  - 青文字のルートテーブルID <font color="Blue">rtb-xxxxxxxxxxxxxxxxx</font> をクリックします。
  - 対象のルートテーブルが選択されていることを確認したら、画面下のルートタブを選択し、 `ルートの編集` をクリックします。
  - そして下記のように、その他の送信先がないものは全てインターネットゲートウェイにルートするように設定を追加します。そして `ルートの保存` をクリックします。

| 送信先    | ターゲット | ステータス | 伝播済み |
| --------- | ---------- | ---------- | -------- |
| ...       | ...        | ...        | ...      |
| 0.0.0.0/0 | sample-igw | active     | いいえ   |

## Elastic IP を作成

- `サービス > VPC > Elastic IP` の順にアクセスし、 `新しいアドレスの割り当て` をクリックします。

- `割り当て` をクリックします。

- 作成したIPアドレスとインスタンスを関連付けるには、IPアドレスを選択し、 `アクション > アドレスの関連付け` の順でクリックします。

- 次の情報を入力し、 `関連付け` をクリックします。

```yml
リソースタイプ: インスタンス
インスタンス: sample-webserver-1  # 上で作成したインスタンス
プライベート IP: 192.168.1.xx     # インスタンスのプライベートIP
```

## インスタンスに LAMP 環境を構築

- ソフトウェアパッケージを最新の状態にします。

```console
$ sudo yum update -y
```

### Apache

- インストール

```console
$ sudo yum install -y httpd

# Amazon Linux 2 PHP パッケージの最新バージョンを取得
$ sudo amazon-linux-extras install -y php7.2
```

- Apache を起動します。

```console
$ sudo systemctl start httpd

$ sudo systemctl enable httpd  # 自動起動を設定
```

- `ec2-user` を `apache` グループに追加します。

```console
$ sudo usermod -a -G apache ec2-user

# グループ設定を確認するには、再ログインする必要があります
$ exit

# グループを確認します (apache が表示できれば成功です)
$ groups
ec2-user adm wheel apache systemd-journal
```

- `/var/www` のグループ所有権を apache グループに変更します。

```console
$ sudo chown -R ec2-user:apache /var/www
```

- グループの書き込み許可を追加します。

```console
$ sudo chmod 2775 /var/www && find /var/www -type d -exec sudo chmod 2775 {} \;

$ sudo find /var/www -type f -exec sudo chmod 0664 {} \;
```

### MariaDB

- インストール

```console
$ sudo yum install -y mariadb-server

# LAMP MariaDB パッケージの最新バージョンを取得
$ sudo amazon-linux-extras install -y lamp-mariadb10.2-php7.2
```

- データベースを起動

```console
$ sudo systemctl start mariadb

$ sudo systemctl enable mariadb  # 自動起動の設定
```

- データベースの初期設定

```console
$ sudo mysql_secure_installation

# root にはパスワードが設定されていませんので Enter キーを押します
Enter current password for root (enter for none):

# root のパスワードを設定します
Set root password? [Y/n] Y
New password: *****           # 1回目の入力
Re-enter new password: *****  # 2回目の入力

# 匿名ユーザーアカウントを削除します
Remove anonymous users? [Y/n] Y

# リモートルートログインを無効にします
Disallow root login remotely? [Y/n] Y

# テストデータベースを削除します
Remove test database and access to it? [Y/n] Y

# 権限テーブルを再ロードし、変更を保存します
Reload privilege tables now? [Y/n] Y
```

## FTP

- インストール

```console
$ sudo yum install vsftpd -y
```

- FTPの設定

```console
$ sudo cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.org

$ sudo vim /etc/vsftpd/vsftpd.conf
```

```conf:/etc/vsftpd.conf
# 次の内容の通り修正します。
anonymous_enable=NO        # 変更
dirmessage_enable=NO       # 変更
ascii_upload_enable=YES    # 有効化
ascii_download_enable=YES  # 有効化
chroot_local_user=YES      # 有効化
chroot_list_enable=YES     # 有効化
tcp_wrappers=NO            # 変更
connect_from_port_20=NO    # 変更
xferlog_std_format=NO      # 変更

# 次の内容を追加します。
pasv_enable=YES
pasv_addr_resolve=YES
pasv_address=xxx.xxx.xxx.xxx    # Elastic IP
pasv_min_port=60001
pasv_max_port=60010
use_localtime=YES
force_dot_files=YES
```

- FTPを起動

```console
$ sudo systemctl start vsftpd

$ sudo systemctl enable vsftpd  # 自動起動の設定
```

- 接続は、上で作成した `キーペア` の `sample-key.pem` で `SFTP` 接続ができます。

## phpMyAdmin をインストール

- 前準備

```console
$ sudo yum install php-mbstring -y

$ sudo systemctl restart httpd

$ sudo systemctl restart php-fpm
```

- ソースパッケージをダウンロード&解凍

```console
$ wget https://www.phpmyadmin.net/downloads/phpMyAdmin-latest-all-languages.tar.gz

$ mkdir phpMyAdmin && tar -xvzf phpMyAdmin-latest-all-languages.tar.gz -C phpMyAdmin --strip-components 1
```

## VirtualHost 設定

- バーチャルホストの設定は次の通りですが、アクセス権の部分で `Apache 2.2` 系と `Apache 2.4` 系で異なります。

`Apache 2.2` 系の場合

```Apache:/etc/httpd/conf.d/vhost-sample.com.conf
<VirtualHost *:80>
  ServerName sample.com
  DocumentRoot /var/www/sample.com
  
  <Directory /var/www/sample.com>
    Order allow,deny               # ← ここが違います
    Allow from all                 # ← ここが違います
  </Directory>
</VirtualHost>
```

`Apache 2.4` 系の場合

```Apache:/etc/httpd/conf.d/vhost-sample.com.conf
<VirtualHost *:80>
  ServerName sample.com
  DocumentRoot /var/www/sample.com

  <Directory /var/www/sample.com>
    Require all granted            # ← ここが違います
  </Directory>
</VirtualHost>
```

- 設定したバーチャルホスト以外は、 `403 Forbidden` エラーを出力します。

```conf:/etc/httpd/conf.d/vhost-00.conf
<VirtualHost *:80>
  ServerName any

  <Location />
    Require all denied
  </Location>
</VirtualHost>
```