EC2でブログシステムを構築してみる

# はじめに
本投稿は、ハンズオン学習をした内容のアウトプットになります。
Amazon Linux2023にwordpressを導入してブログシステムを構築します。

# 使用した教材
[Amazon Web Services基礎からのネットワーク＆サーバー構築改訂４版](https://amzn.asia/d/gDetzXp)

# 作成する環境の構成
いたってシンプルな構成です。
パブリックサブネット　：WEBサーバ、NATゲートウェイ
プライベートサブネット：DBサーバ

![スクリーンショット 2024-09-02 195822.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/5ddd079e-97d1-a2f7-9db8-faabcf387cdd.png)


# 実際に構築してみる
### ①VPCの作成
まずはVPCを作成します。
CIDRブロックはプライベートサブネットとパブリックサブネットが分けられれば適当でOKです。
今回は、教材に従い、「10.0.0.0/16」としておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/c4dd8019-4e25-c8c6-607e-f168a0bbede9.png)

### ②サブネットの作成
サブネットの作成を行います。
サブネットとは、VPC内の独立したネットワークグループのようなイメージです。
セグメントという言葉で聞いたことがある人もいるかもしれませんね。

AWSではインターネットゲートウェイがアタッチされるサブネットをパブリックサブネット、
アタッチされていないサブネットをプライベートサブネットと呼びます。

今回は、パブリックサブネットと、プライベートサブネットの2つを作成します。
パブリックサブネットのCIDRブロックは「10.0.1.0/24」
プライベートサブネットのCIDRブロックは「10.0.2.0/24」としておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/41c3d961-6af1-3b3c-7af0-03b68219abd6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/5607ddef-f9ba-131d-02e5-e7028a55ab12.png)

### ③インターネットゲートウェイをアタッチする
次にインターネットゲートウェイを作成します。
作成したインターネットゲートウェイを今回作成したVPCにアタッチします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/e5130f14-8d63-0938-e332-71e9c09c9a97.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/6abc7bd6-66f9-e024-1c30-5f417abcce5c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/f84912f5-fb93-3313-bcec-babfcd3d7498.png)

### ④ルートテーブルを作成する
先ほどはVPCに対し、インターネットゲートウェイをアタッチしました。
アタッチしただけではインターネットに通信できませんので、
インターネットと通信するための通り道(ルートテーブル)を作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/d1c2d742-d961-b9f3-461c-166a528d9202.png)

ルートテーブルが作成できたら、作成したルートテーブルを編集して、
インターネットとの通信を行うルーティングを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/a6a8c907-ddde-fa3e-fba6-429201abfd17.png)

ルーティング追加後、サブネットを関連付けることで、関連付けされたサブネットに配置されたリソースからインターネットへ通信が行えるようになります。
ここではインターネット通信を行いたいサブネットだけを関連付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/3ec07964-3810-1581-406a-284df0ba12aa.png)

### ⑤EC2インスタンスを起動する
細かい設定は割愛しますが、インスタンス起動設定の中で、セキュリティグループを作成します。
WEBサーバで利用するインスタンスはインターネットゲートウェイを経由した通信が行えるので、SSHを自分のIPから許可するように設定しておきます。
後程インスタンスにApacheをインストールするので、ここでポート80を0.0.0.0/0から許可しておいてもOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/e37d13fc-ea27-6687-59ab-87295af8bec1.png)

また、高度なネットワーク設定からプライマリIPアドレスを設定することで、
ローカルで利用する際のIPアドレスを固定化することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/a0f95a33-f20b-9f2a-b269-fc9e897d8a49.png)

続いて、DBサーバ用のインスタンスを作成します。
DBサーバについても同じタイミングでセキュリティグループを作成します。

先ほどのWEBサーバはSSHを自分のIPからできるように設定しましたが、
それはインターネットゲートウェイを経由した通信の場合です。
DBサーバはプライベートサブネットに配置するため、インターネットゲートウェイを経由した通信は行えません。
なので今回は、WEBサーバを踏み台としてDBサーバにSSHする設定を行います。
ここでは先ほど高度なネットワーク設定で設定したプライマリIPアドレスを指定してみました。
DB接続に利用する通信も同じように設定しておきましょう。(ここでは0.0.0.0/0にしていますが・・・)

複数のサーバが今回利用するサブネットへ通信できる場合は通信できるサーバのIPアドレスを指定して最小のアクセス権を設定するようにしましょう。

※取り忘れたので編集画面です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/7243065e-d9b8-f8de-fa8b-1c47b06f3f88.png)

### ⑥DBサーバで利用するNATゲートウェイを作成する
DBサーバは現時点ではプライベートサブネットに配置されており、パブリックIPアドレスを持っていないため、インターネットに接続できず、dnfコマンドを利用したパッケージのインストールができません。

ここで使用するのがNATゲートウェイです。
NATゲートウェイを経由することで、インターネットゲートウェイへの経路がないサーバから安全にインターネットへの片道通信を行うことができます。
NATゲートウェイは　サーバ→NATゲートウェイ→インターネットゲートウェイ　という通信を行い、逆方向の通信は許可しません。(戻りの通信は行えます)
なので、外部へ通信を行う必要があるが、外部から内部への通信は許可しないという要件がある場合に利用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/69cdd236-ea6b-93f2-29e5-7010efdf147b.png)

作成できたらプライベートサブネットのルートテーブルにインターネット向け通信を追加します。
ターゲットは先ほど作成したNATゲートウェイを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/b96d4004-0a9e-04d5-a8f5-ec95e9b1ffae.png)

NATゲートウェイは無料利用枠ではないため、起動している時間だけ課金されます。
用事が済んだら早々に削除しましょう。
NATゲートウェイを削除したらルートテーブルに設定した内容も削除しておきましょう。

### ⑦必要なパッケージをダウンロードして起動する
細かいコマンドは省きますが、dnfコマンドを利用して以下の通りパッケージをインストールします。
■WEBサーバ
 ・Apache
 ・php
 ・MariaDB

■DBサーバ
 ・MariaDB

ダウンロードが完了したら、WEBサーバでApache、DBサーバでMariaDBを起動して設定を行います。
wordpressはdnfコマンドではインストールできないので、wgetコマンドを利用してwordpressのホームページからダウンロードします。

wordpressの初期設定をする際に
「お使いのサーバーの PHP では WordPress に必要な MySQL 拡張を利用できないようです。」
というエラーが表示されました。
調べてみるとインストールするパッケージが足りないことがわかりました。
追加で、php-mysqlndをインストールしました。

すべてのパッケージのインストール、設定、起動が完了したら、
WEBブラウザで、構築した以下のURLに接続します。
`http://WEBサーバのグローバルIPアドレス:80/wp-admin`

グローバルIPアドレスは、EC2の画面で確認できます。
勉強などで利用する場合は、グローバルIPが流出しないように心がけましょう！
グローバルIPはインスタンスを再起動したりすると変わります。
もし固定化したい場合は、Elastic IPを利用することでグローバルIPアドレスを固定化することができます。
Elastic IPはアタッチしていない場合、料金が発生するので、アタッチしたリソースを停止したり削除する場合などは気を付けましょう。

無事wordpressにアクセスすることができました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/a579ef81-ece8-16be-e97d-bedf889b2e78.png)

wordpress用に作成したデータベースの接続情報を入力しセットアップを進めていきます。
wordpressへのログインもOKでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/b5e8b086-c8ad-05ac-53ce-83a96ba18de5.png)


# おわりに
AWSでブログシステムを構築することができました。
シンプルな構成なので、短時間で作成できました。
(不要な課金を避けるために学習が終わったらリソースはすべて削除しました)

次はIaCでインフラ構築ができればいいなと思います。