AWS EC2でWebサーバーを立てる

#この記事でできるようになること
この記事ではAWS上でWEBサーバーを構築し、「静的なホームページ/Webサイト」を構築するための手順を解説します。
（今は亡きジオシティーズやinfoseekといった無料レンタルサーバー程度の用途を想定。）
主な作業手順は以下の内容です。

* AWSのアカウントを作る
* EC2のインスタンスを作る
* インスタンスにSSH接続できる環境を作る
* インスタンス上にWebサーバを構築し、http接続ができる環境を作る
* インスタンス上にFTPサーバーを構築し、httpサーバーへファイルをアップロードできる環境を作る

何番煎じの記事かもわかりませんが、自身の備忘もかねて。
一般的なLinuxコマンドも含めて操作した内容は一通り記載しておきます。

#環境
私が使用している端末の環境は以下の通りです。
異なるSSHクライアント、FTPクライアントを使用している場合は適宜読み替えをお願いします。

* マシン：Windows 10
* SSHクライアント：Teraterm
* FTPクライアント：Filezilla

# 1.AWSアカウントの開設
筆者は既にアカウント開設済みのため、改めてスクショ等を取ることができません。
説明は割愛させていただきます。
公式の手順書は以下リンク先を参照。
[AWS アカウント作成の流れ | AWS](https://aws.amazon.com/jp/register-flow/)


# 2.EC2のインスタンス作成
AWSのアカウントを開設し、ログインをすると「AWSマネジメントコンソール」に遷移します。
ここからEC2の管理画面へ移動します。

▼2-1：[サービス]を選択
![FireShot Capture 003 - AWS マネジメントコンソール - us-east-2.console.aws.amazon.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256612/5d79eb33-e6c6-f438-7107-42bfad6157eb.png)

▼2-2:[EC2]を選択
![FireShot Capture 004 - AWS マネジメントコンソール - us-east-2.console.aws.amazon.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256612/4a176935-22a2-4c62-409c-a06e0bc3e0a2.png)

EC2のコンソール画面に遷移しました。

▼2-3:[インスタンス]を選択
![FireShot Capture 006 - EC2 Management Console - ap-northeast-1.console.aws.amazon.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256612/47c012ea-10e9-c0c6-571f-fe26e2c89af2.png)

▼2-4:[インスタンスの作成]を選択
![FireShot Capture 007 - インスタンス - EC2 Management Console - ap-northeast-1.console.aws.amazon.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256612/615997cf-d6c1-cb57-b290-3328f1256fab.png)

構築するサーバーのイメージを選択します。
いろいろ種類がありますが今回は[Amazon Linux 2 AMI (HVM), SSD Volume Type]を選択。

▼2-5:構築するAMIを選択。ちなみに2-3から[インスタンスを起動]を選択した場合、一気にここまで遷移します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256612/8291aa62-b2ed-3242-3a8c-228294a9eef4.png)

続いてCPU他のカスタマイズを行います。今回は無料枠対象のタイプ[t2.micro]を選びます。

▼2-6:今回は無料枠を使用するので何も考えずに[t2.micro]を選択し、[確認と作成]を押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256612/c9d0794a-27bb-5b9e-3bc8-4faa854e4be5.png)

▼2-7:インスタンスの内容を確認していざ、起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256612/f6ac2f2b-4c9e-44e8-5bb2-84d9b5bfba7c.png)

起動をしようとするとssh接続時に使用する秘密鍵の作成を促す画面が出てきます。
今回は新しいキーペアを作成します。

▼2-8:キーペア名を入力し、[キーペアのダウンロード]で秘密鍵をローカルに保存し、[インスタンスの作成]を押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256612/37270ad8-b8e8-a8bc-619a-10577854bd9c.png)

▼2-9:インスタンスを作成中であることを示す画面に遷移したら[インスタンスの表示]を押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256612/f5f09218-bf27-6c33-13a0-50b49789d552.png)

2-4の画面に戻ります。[更新]ボタンを何度か押してステータスが[2/2のチェック...]になればOK
▼2-10:インスタンスの作成が完了しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256612/c1a12628-adf1-2175-d8df-9e1f8fce5745.png)

# 3.Teraterm(SSHクライアント)からSSH接続をする
インスタンスの作成が完了したので早速SSHクライアントから接続をしたいと思います。
AWS公式の手順は以下を参照。
[SSH を使用した Linux インスタンスへの接続 | Amazon Elastic Compute Cloud]
(https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/AccessingInstancesLinux.html)

まず初めに接続先を確認します。

▼3-1:パブリックDNSが接続先のホストになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256612/47340b55-9e66-f3cb-008d-57cf40641972.png)

続いてクライアントより接続。

▼3-2:ホストを設定しTera Termで接続
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256612/3167fdd9-2414-e708-7a16-7e74db99eac7.png)

▼3-3:ユーザー名はAmazon Linux 2の場合[ec2-user][^1]、認証方式は秘密鍵を選択し、2-8で保存した秘密鍵を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256612/09a96ccf-4d41-2013-6197-4cd35964d6b2.png)

▼3-4:接続完了。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256612/50c566aa-70b1-c47d-9891-5d686acb726b.png)

これで接続が完了しました。
以下のコマンドでパッケージを最新化しておきましょう。

```:コマンド
# パッケージの最新化
sudo yum update
```

引き続きssh接続をした状態で作業を進めるのでクライアントは起動したままで。

▼3-5:アップデート完了。いろいろ降ってきました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256612/91c6b5f3-463d-62a2-cad9-3f0606ccee76.png)

# 4.Apache(Webサーバー)の構築
続いてWebサーバーを構築します。
流れとしてはApacheインストール→httpアクセスを行うためのポート設定の順になります。

まずはApacheの導入。

```:コマンド
# 念のためインストールするパッケージの情報を確認
yum info httpd

# インストール
sudo yum install httpd
# 途中の確認を省略する場合は以下のコマンド
# sudo yum -y install httpd

# サービスの起動
sudo service httpd start
```

▼4-1:いきなりインストールコマンドを打ってもよいのだけれど、折角だから何を入れるのか事前に確認してみる。Apacheのバージョンは[2.4.41]だった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256612/32e28617-0122-5a53-361d-a1908c4b8131.png)

▼4-2：インストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256612/648ef523-b851-1eb8-4c23-9517896b56cf.png)

▼4-3:インストールが終わったらapacheを起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256612/b7e1dcfa-6c9e-c177-a88d-e5761803d17b.png)

続いてポートの設定。
ブラウザ上での操作にいったん戻ります。

▼4-4:インスタンスの管理画面からインスタンスのセキュリティーグループを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256612/9836f454-d189-f4a3-a207-9e84c4e31037.png)

▼4-5:[セキュリティグループ]の管理画面に遷移をしたら[インバウンド]→[編集]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256612/dd73b9eb-e03d-977f-2058-55005030cf00.png)

▼4-6:[ルールの追加]を押下して
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256612/c8a09828-b516-ed6f-72c4-7712290a9cb6.png)

▼4-7:タイプ[http]→[保存]を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256612/e06c5bea-954d-c6aa-d002-6f19d87103ed.png)

これでポートの設定が完了しました。
3-1で確認したパブリックDNSへアクセスしてみましょう。

▼4-8:以下の画面が出ていれば設定完了です。(Apacheのバージョンが違う場合若干表示に差異があります。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256612/f92f769a-2ec2-2366-38a3-b5b13b1d1885.png)

# 5.FTPサーバーの構築
続いてFTPサーバーを構築します。
vsftpdのインストール→ftp接続ユーザーの追加→ポートの設定の順に進めます。

まずはインストール

```:コマンド
# インストール
sudo yum install -y vsftpd
```

▼5-1:インストールコマンドを実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256612/706427f7-ddea-8251-e5e8-3e96645928f6.png)


続いて空きポートの確認

```:コマンド
# 空きポートの確認
cat /proc/sys/net/ipv4/ip_local_port_range
```

▼5-2:空きポートを確認。32768～60999が割り振られている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256612/644478b5-c2d1-43ed-f017-fcc99b85bf0b.png)

続いてvsftpdの設定ファイルを編集

```:コマンド
# 念のためオリジナルファイルをバックアップ
sudo cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf_org

# viエディタで設定ファイルを編集
sudo vi /etc/vsftpd/vsftpd.conf
```

今回変更した内容は以下。
最低限の設定なので必要があればほかの設定も追加してください。

```:/etc/vsftpd/vsftpd.conf
# 以下は既存の設定を修正
tcp_wrappers=NO

# 以下は追記
pasv_enable=YES
pasv_address=(IPv4 パブリック IP)
pasv_min_port=60001
pasv_max_port=60010
force_dot_files=YES
use_localtime=YES
```

続いてFTP接続を行う際のユーザーを追加し、サービスを起動

```:コマンド
# ユーザーを追加
sudo useradd ftp-user
sudo passwd ftp-user
(任意のパスワード)

# 権限を付与
sudo chown ftp-user /var/www/html
sudo chmod 755 /var/www/html

# 起動
sudo service vsftpd start
```

最後にブラウザ上からポートの設定。
▼5-3:4-5あたりと同じようにインバウンドのルールを設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256612/de394e21-3f70-c883-cb20-fcf7f0f49e91.png)

試しにFTPでファイルをアップロードしてみましょう。
▼5-4:ホストはパブリック DNS、ユーザー名・パスワードは先ほど設定したもの。index.htmlをサーバに転送
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256612/ba0a205c-81e7-b664-38bd-b88d13e5bf27.png)

▼5-5:apacheのサーバーに反映されました。お疲れ様です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256612/58fd6751-5ba6-95a8-1b8b-a1c370f2506d.png)

# 6.やり残したこと
独自ドメインの設定、ssl化etc。
今度作業したらまた整理します。



# 追記1.独自ドメインの設定
FC2ドメインでDNSレコードを以下のように設定した。
他も大体同じだと思う。

ホスト名|レコードタイプ|IPアドレス
---|---|---
*|A|(IPアドレス)
www|CNAME|(ドメイン名)

# 追記2.SSL化
Let's Encryptを使用してSSL化をする。

手順は

* インスタンスのポート設定
* Let's Encryptのインストール
* 証明書の生成
* Apacheへの設定

まずポート設定。おなじみインバウンドのルールでhttpsを追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256612/b98dbf57-fa70-0ec9-0000-3de55660cb34.png)


続いてはLet's Encryptをインストールして権限付与

```:コマンド
# certbotインストール
sudo curl https://dl.eff.org/certbot-auto -o /usr/bin/certbot-auto
sudo chmod 700 /usr/bin/certbot-auto
```

▼追2-1:certbotをインストールした状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256612/ce31c4f3-9f34-fe6c-6030-0fa5e3e34cbb.png)

次に証明書の取得をする、、、がここでハマった。
「certbot」を実行しようとするとエラーになる。
同様にハマった先人がいたので記事へのリンクを
[Amazon Linux2でLet's Encrypt使おうとしたらコケた話 - Qiita]
(https://qiita.com/MysteriousMonkey/items/f26316447c1ff390ce21)

上記を参考にしながら進めていく
まずはcertbot-autoの編集

```:コマンド
# バックアップを取る
sudo cp /usr/bin/certbot-auto /usr/bin/certbot-auto.bak

# さっき作ったFTP用ユーザーでローカルに落としたいのでいったん権限を変更
sudo chmod 777 /usr/bin/certbot-auto

#(FTPでいったん落としてローカルで編集する、編集後再アップロード）

# 編集が終わったら元に戻す
sudo chmod 700 /usr/bin/certbot-auto
```

変更内容は以下の通り


```:certbot-auto(変更前)
elif [ -f /etc/issue ] && grep -iq "Amazon Linux" /etc/issue ; then
  Bootstrap() {
    ExperimentalBootstrap "Amazon Linux" BootstrapRpmCommon
  }
  BOOTSTRAP_VERSION="BootstrapRpmCommon $BOOTSTRAP_RPM_COMMON_VERSION"
```

```:certbot-auto(変更後)
 elif grep -i "Amazon Linux" /etc/issue > /dev/null 2>&1 || \
   grep 'cpe:.*:amazon_linux:2' /etc/os-release > /dev/null 2>&1; then
  Bootstrap() {
    ExperimentalBootstrap "Amazon Linux" BootstrapRpmCommon
  }
  BOOTSTRAP_VERSION="BootstrapRpmCommon $BOOTSTRAP_RPM_COMMON_VERSION"
```

certbot-autoの編集が終わったら以下のコマンドで証明書を取得する。

```:コマンド
# 証明書を取得
sudo certbot-auto certonly --webroot -w /var/www/html -d hogehoge.net -d www.hogehoge.net --email hogehoge@hogehoge.co.jp -n --agree-tos --debug
```

▼追2-2:コマンドを実行して以下のようになればOK。赤枠は有効期限
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256612/9f3ce5cf-6630-3eaf-a9cc-de807c6924ce.png)


続いて取得した証明書をApacheへ適用させる。
mod_sslをインストールし、設定ファイルを編集する。
編集後にApacheを再起動。

追記1.で設定したドメインにhttpsでアクセスして問題なければOKです。

```:コマンド
# mod_sslをインストール
sudo yum install mod_ssl

# viエディタで設定ファイルを編集
vi /etc/httpd/conf.d/ssl.conf

# Apache再起動
service httpd restart
```

▼追2-3:mod_sslのインストール後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256612/2d9ad395-d35c-ac65-e080-0d5dc570d364.png)

ssl.confの変更内容は以下の通り

```:ssl.conf(変更前)
SSLCertificateFile /etc/pki/tls/certs/localhost.crt
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
#SSLCertificateChainFile /etc/pki/tls/certs/server-chain.crt
```

```:ssl.conf(変更後)
SSLCertificateFile /etc/letsencrypt/live/hogehoge.net/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/hogehoge.net/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/hogehoge.net/chain.pem
```


# 7.参考にした記事
実際に自分で構築をした際には以下の記事を参考にさせていただきました。
[AWS EC2でWebサーバーを構築してみる - Qiita](https://qiita.com/arashida/items/629aaed33401b8f2265c)
[EC2にFTP接続する環境構築手順 - Qiita]
(https://qiita.com/sakuraya/items/b7e513a6add1dfc198b5)
[EC2にvsftpをセッティングする際のハマリポイント - Qiita]
(https://qiita.com/dogyear/items/289b314db9af42e15cfa)
[Let's Encryptを使ってEC2にSSL証明書の発行から自動更新まで行う - Qiita](https://qiita.com/sayama0402/items/011644191dfdbde9c646)
[Amazon Linux2でLet's Encrypt使おうとしたらコケた話 - Qiita]
(https://qiita.com/MysteriousMonkey/items/f26316447c1ff390ce21)
[apacheでhttpへのアクセスをhttpsへ自動リダイレクトする - Qiita](https://qiita.com/sue71/items/100004b704b9ff129b09)

[^1]: Amazon Linux 2以外のAMIを選択した場合のユーザー名は以下を参照[PuTTY を使用した Windows から Linux インスタンスへの接続 | Amazon Elastic Compute Cloud](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/putty.html)