AWS CLIでWordPress環境を構築する~part3~

## 概要
AWS学習目的で、下記記事のレシピを参考にAWS CLIでの環境構築を行う。
[【Amazon3時間クッキング】材料費500円でAWSにWordPress環境を構築するレシピ ～part3～](https://qiita.com/blackriver/items/a0ff95098cf0949aef0b)

この記事では以下の作業を行う。

- サブネットの作成（プライベートセグメント）
- キーペアの作成
- セキュリティグループの作成（DBサーバー用）
 - ルールの追加
- EC2インスタンスの作成（DBサーバー用）
- NATゲートウェイの作成
 - メインのルートテーブルにNATゲートウェイのルートを追加
- MySQLのインストール
 - 初期設定
 - データベース作成
 - ユーザー作成と権限の設定
- WordPressのインストール
 - PHPのインストール
 - MySQL Clientのインストール
 - WordPressのデプロイ

## 環境
- macOS Catalina

## 前提条件
- AWSアカウント
- AWS CLI
 - aws configureで設定済み
- [AWS CLIでWordPress環境を作成する~part1~]()の作業を実施
- [AWS CLIでWordPress環境を作成する~part2~]()の作業を実施

## 構築

### サブネットの作成（プライベートセグメント）
|項目|値|
|:--|:--|
|CIDRブロック|10.0.2.0/24|
|名前|test-PrivateSegment|

```
# パブリックセグメントのアベイラビリティゾーンの取得
$ aws ec2 describe-subnets --subnet-ids subnet-02558655ff2936296
{
    "Subnets": [
        {
            "AvailabilityZone": "ap-northeast-1c",
            "AvailabilityZoneId": "apne1-az1",
            "AvailableIpAddressCount": 250,
            "CidrBlock": "10.0.1.0/24",
            "DefaultForAz": false,
            "MapPublicIpOnLaunch": false,
            "State": "available",
            "SubnetId": "subnet-02558655ff2936296",
            "VpcId": "vpc-07154996e6c851750",
            "OwnerId": "403733593576",
            "AssignIpv6AddressOnCreation": false,
            "Ipv6CidrBlockAssociationSet": [],
            "Tags": [
                {
                    "Key": "Name",
                    "Value": "test-PublicSegment"
                }
            ],
            "SubnetArn": "arn:aws:ec2:ap-northeast-1:403733593576:subnet/subnet-02558655ff2936296"
        }
    ]
}

# サブネットの作成
$ aws ec2 create-subnet --vpc-id vpc-07154996e6c851750 --cidr-block 10.0.2.0/24 --availability-zone ap-northeast-1c
{
    "Subnet": {
        "AvailabilityZone": "ap-northeast-1c",
        "AvailabilityZoneId": "apne1-az1",
        "AvailableIpAddressCount": 251,
        "CidrBlock": "10.0.2.0/24",
        "DefaultForAz": false,
        "MapPublicIpOnLaunch": false,
        "State": "pending",
        "SubnetId": "subnet-069512764e560f68e",
        "VpcId": "vpc-07154996e6c851750",
        "OwnerId": "403733593576",
        "AssignIpv6AddressOnCreation": false,
        "Ipv6CidrBlockAssociationSet": [],
        "SubnetArn": "arn:aws:ec2:ap-northeast-1:403733593576:subnet/subnet-069512764e560f68e"
    }
}

# 名前の設定
$ aws ec2 create-tags --resources subnet-069512764e560f68e --tags Key=Name,Value=test-PrivateSegment
```

### キーペアの作成
|項目|値|
|:--|:--|
|名前|test-db-key|
|秘密鍵のファイル名|test-db-key.pem|
```
# ディレクトリの移動
cd ~/.ssh

# キーペアの作成
$ aws ec2 create-key-pair --key-name test-db-key --query 'KeyMaterial' --output text > test-db-key.pem

# 権限の変更
$ chmod 600 test-db-key.pem

# SSHエージェントに秘密鍵を登録
$ ssh-add ~/.ssh/test-key.pem
```
### セキュリティグループの作成
|項目|値|
|:--|:--|
|グループ名|DB-Segment|
|説明|DB Server security group|
```
# セキュリティグループの作成
$ aws ec2 create-security-group --group-name DB-Segment --description "DB Server security group" --vpc-id vpc-07154996e6c851750
{
    "GroupId": "sg-0e8a4425f79c7e9ce"
}
```

####　ルールの追加
|タイプ|プロトコル|ポート範囲|ソース|
|:--|:--|:--|:--|
|SSH|TCP|22|0.0.0.0/0|
|MYSQL/Aurora|TCP|3306|0.0.0.0/0|

```
# SSHの有効化
$ aws ec2 authorize-security-group-ingress --group-id sg-0e8a4425f79c7e9ce --protocol tcp --port 22 --cidr 0.0.0.0/0

# MYSQL/Auroraの有効化
$ aws ec2 authorize-security-group-ingress --group-id sg-0e8a4425f79c7e9ce --protocol tcp --port 3306 --cidr 0.0.0.0/0
```

### EC2インスタンスの作成
DBサーバー用のEC2インスタンスを作成する。

|項目|値|
|:--|:--|
|AMI|Amazon Linux 2 AMI (HVM), SSD Volume Type|
|インスタンスタイプ|t2.micro|
|自動割り当てパブリックIP|無効化|
|プライベートIP|10.0.2.10|
|名前|DB-Server|

AMIのイメージIDは[ここ](https://ap-northeast-1.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-1#LaunchInstanceWizard:)で確認をする。

|項目|既定値|
|:--|:--|
|ストレージタイプ|gp2|
|ストレージサイズ|8G|
ストレージタイプやサイズなどは既定値で作成をする。

```
# EC2インスタンスの作成
$ aws ec2 run-instances --image-id ami-011facbea5ec0363b --count 1 --instance-type t2.micro --key-name test-db-key --security-group-ids sg-0e8a4425f79c7e9ce --subnet-id subnet-069512764e560f68e --private-ip-address 10.0.2.10
{
    "Groups": [],
    "Instances": [
        {
            "AmiLaunchIndex": 0,
            "ImageId": "ami-011facbea5ec0363b",
            "InstanceId": "i-08f568e483f5aa14f",
            "InstanceType": "t2.micro",
            "KeyName": "test-db-key",
            "LaunchTime": "2020-02-11T05:43:28.000Z",
            "Monitoring": {
                "State": "disabled"
            },
            "Placement": {
                "AvailabilityZone": "ap-northeast-1c",
                "GroupName": "",
                "Tenancy": "default"
            },
            "PrivateDnsName": "ip-10-0-2-10.ap-northeast-1.compute.internal",
            "PrivateIpAddress": "10.0.2.10",
            "ProductCodes": [],
            "PublicDnsName": "",
            "State": {
                "Code": 0,
                "Name": "pending"
            },
            "StateTransitionReason": "",
            "SubnetId": "subnet-069512764e560f68e",
            "VpcId": "vpc-07154996e6c851750",
            "Architecture": "x86_64",
            "BlockDeviceMappings": [],
            "ClientToken": "",
            "EbsOptimized": false,
            "Hypervisor": "xen",
            "NetworkInterfaces": [
                {
                    "Attachment": {
                        "AttachTime": "2020-02-11T05:43:28.000Z",
                        "AttachmentId": "eni-attach-015e62e441a1e9e2f",
                        "DeleteOnTermination": true,
                        "DeviceIndex": 0,
                        "Status": "attaching"
                    },
                    "Description": "",
                    "Groups": [
                        {
                            "GroupName": "DB-Segment",
                            "GroupId": "sg-0e8a4425f79c7e9ce"
                        }
                    ],
                    "Ipv6Addresses": [],
                    "MacAddress": "0a:12:3f:55:49:96",
                    "NetworkInterfaceId": "eni-028a866898abcebea",
                    "OwnerId": "403733593576",
                    "PrivateIpAddress": "10.0.2.10",
                    "PrivateIpAddresses": [
                        {
                            "Primary": true,
                            "PrivateIpAddress": "10.0.2.10"
                        }
                    ],
                    "SourceDestCheck": true,
                    "Status": "in-use",
                    "SubnetId": "subnet-069512764e560f68e",
                    "VpcId": "vpc-07154996e6c851750",
                    "InterfaceType": "interface"
                }
            ],
            "RootDeviceName": "/dev/xvda",
            "RootDeviceType": "ebs",
            "SecurityGroups": [
                {
                    "GroupName": "DB-Segment",
                    "GroupId": "sg-0e8a4425f79c7e9ce"
                }
            ],
            "SourceDestCheck": true,
            "StateReason": {
                "Code": "pending",
                "Message": "pending"
            },
            "VirtualizationType": "hvm",
            "CpuOptions": {
                "CoreCount": 1,
                "ThreadsPerCore": 1
            },
            "CapacityReservationSpecification": {
                "CapacityReservationPreference": "open"
            },
            "MetadataOptions": {
                "State": "pending",
                "HttpTokens": "optional",
                "HttpPutResponseHopLimit": 1,
                "HttpEndpoint": "enabled"
            }
        }
    ],
    "OwnerId": "403733593576",
    "ReservationId": "r-0260cad0308d0bbee"
}

# 名前の設定
$ aws ec2 create-tags --resources i-08f568e483f5aa14f --tags Key=Name,Value=DB-Server
```

### NATゲートウェイの作成

```
# ElasticIP新しいアドレスの割当
$ aws ec2 allocate-address --domain vpc
{
    "PublicIp": "18.177.56.100",
    "AllocationId": "eipalloc-04495c62f9ec8db78",
    "PublicIpv4Pool": "amazon",
    "NetworkBorderGroup": "ap-northeast-1",
    "Domain": "vpc"
}

# NATゲートウェイの作成
$ aws ec2 create-nat-gateway --subnet-id subnet-02558655ff2936296 --allocation-id eipalloc-04495c62f9ec8db78
{
    "NatGateway": {
        "CreateTime": "2020-02-11T05:55:55.000Z",
        "NatGatewayAddresses": [
            {
                "AllocationId": "eipalloc-04495c62f9ec8db78"
            }
        ],
        "NatGatewayId": "nat-08e449a89a50dd47b",
        "State": "pending",
        "SubnetId": "subnet-02558655ff2936296",
        "VpcId": "vpc-07154996e6c851750"
    }
}
```

#### メインのルートテーブルにNATゲートウェイのルートを追加

|項目|値|
|:--|:--|
|送信先|0.0.0.0/0|
|ターゲット|NATゲートウェイ|

```
# メインのルートテーブルを出力
$ aws ec2 describe-route-tables --filter Name="association.main",Values="true"
{
    "RouteTables": [
        {
            "Associations": [
                {
                    "Main": true,
                    "RouteTableAssociationId": "rtbassoc-0b25cde6f32c2e053",
                    "RouteTableId": "rtb-03a6ba4c68af0a710",
                    "AssociationState": {
                        "State": "associated"
                    }
                }
            ],
            "PropagatingVgws": [],
            "RouteTableId": "rtb-03a6ba4c68af0a710",
            "Routes": [
                {
                    "DestinationCidrBlock": "10.0.0.0/16",
                    "GatewayId": "local",
                    "Origin": "CreateRouteTable",
                    "State": "active"
                }
            ],
            "Tags": [],
            "VpcId": "vpc-07154996e6c851750",
            "OwnerId": "403733593576"
        }
    ]
}

# ルートの追加
$ aws ec2 create-route --destination-cidr-block 0.0.0.0/0 --route-table-id rtb-03a6ba4c68af0a710 --nat-gateway-id nat-08e449a89a50dd47b
{
    "Return": true
}
```

### MySQLのインストール
``` 10.0.2.10
# RPMファイルのインストール
$ sudo yum localinstall https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm -y

# MySQLのインストール
$ sudo yum -y install mysql-community-server

# MySQLサービスの起動
$ sudo systemctl start mysqld.service

# MySQLサービスのステータス確認
$ systemctl status mysqld.service
● mysqld.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: active (running) since 火 2020-02-11 06:38:54 UTC; 29s ago
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html
  Process: 32524 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
 Main PID: 32600 (mysqld)
   Status: "Server is operational"
   CGroup: /system.slice/mysqld.service
           └─32600 /usr/sbin/mysqld

 2月 11 06:38:47 ip-10-0-2-10.ap-northeast-1.compute.internal systemd[1]: St...
 2月 11 06:38:54 ip-10-0-2-10.ap-northeast-1.compute.internal systemd[1]: St...
Hint: Some lines were ellipsized, use -l to show in full.
```

#### MySQLの初期設定
``` 10.0.2.10
# 初期パスワードの出力
$ cat /var/log/mysqld.log | grep password

# 初期設定を行う 
$ mysql_secure_installation
```

#### WordPress用のデータベースの作成
``` 10.0.2.10
# MySQLに接続
$ mysql -u root -p

# データベースの作成
$ CREATE DATABASE wpdb　DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

# ユーザーの作成
$ create user 'wpadmin'@'localhost' identified by '■■■■■■■■■';
$ create user 'wpadmin'@'10.0.1.10' identified by '■■■■■■■■■';

# デーベースの操作権限を与える
$ grant all privileges on wpdb.* to 'wpadmin'@'localhost';
$ grant all privileges on wpdb.* to 'wpadmin'@'10.0.1.10';

# ユーザーの確認
$ select user,host from mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| wpadmin          | 10.0.1.10 |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
| wpadmin          | localhost |
+------------------+-----------+
6 rows in set (0.00 sec)
```

### WordPressのインストール

#### PHPのインストール

``` 10.0.1.10
# PHPのインストール
$ sudo amazon-linux-extras install php7.3 -y

# 拡張モジュールの出力
$ yum list php* | grep amzn2extra-php7.3

# 拡張モジュールのインストール
$ sudo yum -y install php-mysqlnd php-mbstring
```

#### MySQL Clientのインストール

``` 10.0.1.10
# RPMファイルのインストール
$ sudo yum localinstall https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm -y

# MySQLクライアントのインストール
$ sudo yum -y install mysql-community-client

# WebサーバーからMySQLの接続確認
$ mysql -h 10.0.2.10 -u wpadmin -p
```

#### WordPressのデプロイ

``` 10.0.1.10
# 作業用ディレクトリの作成
$ mkdir ~/work

# 作業用ディレクトリに移動
$ cd ~/work

# WordPressのダウンロード
$ wget https://ja.wordpress.org/latest-ja.tar.gz

# 展開
$ tar xzvf latest-ja.tar.gz

# 展開したwordpressディレクトリに移動
$ cd wordpress/

# ファイルをApacheのDocumentRootディレクトリ配下にコピー
$ sudo cp -r * /var/www/html/

# 所有者の変更
$ sudo chown apache:apache /var/www/html -R

# Apacheの再起動
$ sudo systemctl restart httpd
```

実際にアクセスして確認をする
http://54.249.79.116

## 参考
- [【Amazon3時間クッキング】材料費500円でAWSにWordPress環境を構築するレシピ ～part3～](https://qiita.com/blackriver/items/a0ff95098cf0949aef0b)
- [Amazon EC2 キーペアの作成、表示、削除](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-services-ec2-keypairs.html)
- [Amazon EC2 インスタンスの起動、一覧表示、および終了](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-services-ec2-instances.html)
- [allocate-address](https://docs.aws.amazon.com/ja_jp/cli/latest/reference/ec2/allocate-address.html?highlight=elastic)
- [create-nat-gateway](https://docs.aws.amazon.com/ja_jp/cli/latest/reference/ec2/create-nat-gateway.html?highlight=nat)
- [create-route](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-route.html#create-route)
- [WordPress推奨構成とデータベースの作成](https://www.adminweb.jp/wordpress/install/index1.html)
- [AmazonLinux2でNginx+PHP7.3をインストールする。ついでにOPcacheとAPCuも](https://qiita.com/kyo662211/items/0a23f634a26472ad12ab)
- [Amazon Linux2でLAMP環境を構築](https://qiita.com/RayDoe/items/fb3e0ef69b9b4132e7f7)