【実践編：第２回】EC2 Linux で Web サーバを構築してみよう

#【手順】

- Step 1. EC2 Linux インスタンスを作成する
- Step 2. Web サーバを準備する
- Step 3. Web サーバをテストする
- Step 4. ALB を作成して、Multi AZ 構成にしてみる

#【学習の目的】
 以下の項目を学習する

- EC2 とは
- ALB とは
    - ALB との類似サービス、とその違い
- Multi-AZ とは

#【EC2 とは】
[Amazon Elastic Compute Cloud (Amazon EC2)](https://aws.amazon.com/jp/ec2/)

>EC2とはAWSが提供する「仮想サーバ」です。
>LinuxやWindows 、Red Hat等様々なOSの仮想サーバをすぐに実行できる環境が用意することができます。
>
>EC2は、インスタンス　という単位で構築することができます。
>インスタンスは複数のタイプが用意されていて、例えば、smallタイプのインスタンスであれば、CPU1、メモリ1GBのようにCPUとメモリが固定されています。
>CPUだけ追加とか、メモリだけ追加とかはできず、スペックを上げたい場合はインスタンスのタイプを変更する必要があります。(small→mediumのように)

#【ALB とは】
> ALB（Application Load Balancer）とは、Amazon.comが提供するAWS（Amazon Web Services）と呼ばれるシステムの一部で、Webサービスに発生する負荷を分散するロードバランシングサービスです。

## ALBとELBの違い
> ELBとは「Elastic Load Balancing」の略称で、元々はこのELBがAWSにおけるロードバランシングサービスでした。
> しかしのちにALBが追加オプションとして開発された際に、ELBはその名称を「Classic Load Balancer（CLB）」に変えることになります。
> そしてALBとCLBのサービスをまとめた総称として、ELBが使われるようになったのです。
	
## ALBの特徴
	
> - レイヤー7(アプリケーションレイヤー)での動作
> - 新たにWebSocket とHTTP/2をサポート
> - 最新のアプリケーションアーキテクチャを対象
> - ターゲットグループにルーティングが行える
> - 複数のアベイラビリティーゾーンの利用

> ALBはCLBと比べるとさまざまな面で特徴的な部分があり、ALBならではの魅力といったものが備わっています。

#【Multi-AZ とは】
前提：AvailabilityZone とは
> 各リージョン（TokyoやOregon、Frankfurt等）内で、物理的に離れた箇所にあるデータセンターの事を言う。
> Tokyoリージョンには
>
> - ap-northeast-1a
> - ap-northeast-1b
> - ap-northeast-1c
>
> の3つのAvailabilityZoneが存在する。
> また、必ずしもユーザーAのリージョンとユーザーBのリージョンが同じになるとは限らないようだ

Multi-AZとは
> 一つのAZに対してアプリケーションを構築する（EC2やRDS等）Single-AZ に対して、
> 複数のAZに対して構築することをMulti-AZと呼ぶことが多い。


# Step 1. EC2 Linux インスタンスを作成する

## 1. キーペア作成を作成する
### キーペアとは
パブリックキーとプライベートキーを、キーペアと呼びます。
Amazon EC2 はパブリックキー暗号を使⽤して、ログイン情報の暗号化と復号を⾏います。パブリックキー暗号はパブリックキーを使⽤してデータを暗号化し、受取⼈はプライベートキーを使⽤してデータを復号します。
Amazon EC2 はパブリックキーのみを保存し、ユーザはプライベートキーを保存します。ユーザはインスタンスにssh 接続する時には、プライベートキーを指定する必要があります。

![step1_1_KeyPair.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231057/77c14902-db78-fb27-4f73-c8be9db5716f.png)


## 2. セキュリティグループを作成し、インバウンドルールを追加する

### a. セキュリティグループを作成する

インバウンドルールにTCP/80, TCP/22 を追加	

- TCP/80: HTTP 通信を許可するルール（Source: 「0.0.0.0/0」 を設定）
- TCP/22: ssh 接続を許可するルール(Source: 「My IP」 を設定)。現在アクセスしている IP ア
ドレスが⾃動設定される

### b. EC2 マネージメントコンソールを表⽰する
### c. AMI を選択する
	
1. 左ペインの「インスタンス」を選択し、「インスタンスの作成」
2. 「ステップ1: Amazon マシンイメージ（AMI） 」にて、Amazon Linux 2AMI を選択

![step1_2_3_chooseAMI.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231057/f3039d27-05c5-2dda-d6d6-cd77da67a33d.png)

### d. インスタンスタイプを選択する
インスタンスタイプ t2.micro を選択

### e. インスタンスの詳細設定を⾏う
デフォルト VPC とデフォルト Subnet 、⾃動割り当てパブリック IP を有効に選択

1. ネットワーク：vpc-xxxx| Default（デフォルト）
2. サブネット： subnet-YYYY｜default in ap-northeast-1a
3. ⾃動割り当てパブリックIP：有効
			
### f. ストレージの追加とタグ設定を⾏う
特に変更点なし
		
### g. セキュリティグループを設定する
	
予め作成したセキュリティグループを選択
		
### h. インスタンスを起動する
### i. キーペアを指定する
キーペアを選択するポップアップにて、「既存のキーペアの選択」、作成しておいたキーペア名を選択
	
### j. 作成中のインスタンスを確認する
左ペインの「インスタンス」を選択し、作成中のインスタンスのステータスを確認

## 3. Amazon Linux インスタンスを作成し、ssh 接続できることを確認する
### a. 接続に必要なインスタンス情報を確認する

ssh 接続するため、パブリック DNS（IPv4）を控える
例.） ec2-18-183-224-68.ap-northeast-1.compute.amazonaws.com

![checkPublicDNS(IPv4).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231057/4381948c-378c-d8c2-2853-e4cf2dfcb643.jpeg)

### b. ssh 接続する（Teraterm の使用）
	
# Step 2. Web サーバを準備する

## 1. Apache 及び PHP をインストールする
SSH接続した TeraTerm 上で以下のコードを打つ

	$ sudo yum -y update
	$ sudo amazon-linux-extras install -y php7.2
	$ sudo yum install -y httpd
	$ sudo systemctl start httpd
	$ sudo systemctl enable httpd

## 2. "http\://EC2インスタンスのパブリックDNS" にアクセスし、Apache テストページが表⽰されることを確認する
例.） ec2-52-193-98-49.ap-northeast-1.compute.amazonaws.com

![step2_2_CheckApacheTestPage.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231057/08c9f1e1-0bb7-7b27-cc52-73d1e86883bc.png)

## 3. Apache の設定を確認する
Apache 設定ファイル/etc/httpd/conf/httpd.conf より、ドキュメントルートとポートを確認する

- ドキュメントルート：　DocumentRoot "/var/www/html"

- Listen しているポート：　Listen 80


# Step 3. Web サーバをテストする

## 1. ec2-user ユーザの権限を設定する

### a. Apache ドキュメントルート配下のファイル編集する権限を付与するため、ec2-user を apache グループに追加
### b. ログインし直して、ユーザが apache グループに属しているか確認
### c. /var/www/htmlとそのコンテンツのグループ所有権を apache グループに変更

## 2. PHP をテストする
### a. 下記コマンドでPHPテスト⽤ファイルを作成する。

	$ echo "<?php phpinfo(); ?>" > /var/www/html/phpinfo.php

### b. 作成したページへアクセス "http\://EC2インスタンスのパブリックDNS名/phpinfo.php" にして、表⽰されるか確認します。
例.）http://ec2-52-193-98-49.ap-northeast-1.compute.amazonaws.com/phpinfo.php 
### c. テスト⽤のページを削除

	$ rm /var/www/html/phpinfo.php

## 3. テストページを作成する
### a. ドキュメントルートに PHP ファイルを作成する
### b. 現在時刻を指定した形式で表⽰する、 /var/www/html/index.php

	<html>
		<head>
			<title>EC2 Linux で Web サーバを構築してみよう</title>
		</head>
		<body>
			<h1>Hello World! </h1><br/>
			<?php
			echo date('Y-m-d H:i:s');
			?>
		</body>
	</html>

## 4. テストページを確認する
"http\://EC2インスタンスのパブリックDNS" にアクセスし、index.php が表⽰されることを確認する。
例.）http://ec2-52-193-98-49.ap-northeast-1.compute.amazonaws.com 
ブラウザの更新ボタンを押すと、表⽰される時間が現在時刻に変更されることを確認する。


# Step 4. ALB を作成して、Multi AZ 構成にしてみる
概要
![step4_MultiAZSummary.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231057/6222bbae-f287-6019-bc1a-21d087d876b5.png)

## 1. 2 つのアベイラビリティーゾーン(AZ)を指定して ALB を作成し、EC2 インスタンスをターゲット追加する
### a. EC2 マネージメントコンソール > ターゲットグループより、ターゲットグループを作成する

#### ターゲットグループとは
	
> ターゲットグループは、1 つ以上の登録されているターゲットにリクエストをルーティングするために使⽤されます。
> 各リスナーのルールを作成するときに、ターゲットグループと条件を指定します。
> ルールの条件が満たされると、トラフィックが該当するターゲットグループに転送されます。
	
### b. ターゲットにインスタンスを登録する
### c. EC2 マネージメントコンソール > ロードバランサーより ALB を作成する
### d. ロードバランサー/セキュリティグループ/ルーティングを設定する
	
## 2. "http\://ALBのDNS名" にアクセスし、index.php が表⽰されることを確認する
	例）http://webalb-781715948.ap-northeast-1.elb.amazonaws.com
	
## 3. WEB サーバ構築済み EC2 インスタンスの AMI を作成する
## 4. AMI より新たにインスタンスを作成し、異なる AZ にインスタンスを作成後、ELB のターゲットに追加する
## 5. "http\://ALBのDNS名" に繰り返しアクセスし、２台の EC2 インスタンスにアクセスが分散されることを確認する
例）
[インスタンスA]
[ec2-user@ip-10-0-0-155 ~]$ sudo tail -f /var/log/httpd/access_log
10.0.2.106 - - [16/Apr/2020:04:06:03 +0000] "GET / HTTP/1.1" 200 168 "-" "curl/7.54.0"

[インスタンスB]
[ec2-user@ip-10-0-2-254 ~] $ sudo tail -f /var/log/httpd/access_log
10.0.2.106 - - [16/Apr/2020:04:06:05 +0000] "GET / HTTP/1.1" 200 168 "-" "curl/7.54.0"

# おまけ
けっこう無料枠を超える勢いでストレージが圧迫されていたので、スケジュール起動を活用しました。

[EC2インスタンスのスケジュール起動がお手軽に実現できるようになっていた！](https://qiita.com/t-toyota/items/5d7455568f1856fd2f4e)

#【次回課題検討事項】
- Visual Studio 越しにEC2上のファイルを編集できる開発環境の作成

[VSCodeを使ってAWS EC2のソースコードを編集する](https://qiita.com/takao-takass/items/9f81d5095924280966ae)

- AWS Lambda とコスト管理方法はもう少し調べていきたいかも

#【参考文献】
## EC2 とは

- [AWS Black Belt Online Seminar Amazon EC2](https://www.slideshare.net/AmazonWebServicesJapan/20190305-aws-black-belt-online-seminar-amazon-ec2)
- [５分でわかるEC2](https://recipe.kc-cloud.jp/archives/7413)

## ALB とは

- [Application Load Balancer](https://www.slideshare.net/AmazonWebServicesJapan/application-load-balancer)
- [【ALBってなに？】](https://www.wafcharm.com/blog/alb-for-beginners/)
- [【ALBとELBの違い】](https://www.wafcharm.com/blog/difference-between-alb-and-elb/#:~:text=ALB%EF%BC%88Application%20Load%20Balancer%EF%BC%89%E3%81%A8,%E3%81%99%E3%82%8B%E3%83%AD%E3%83%BC%E3%83%89%E3%83%90%E3%83%A9%E3%83%B3%E3%82%B7%E3%83%B3%E3%82%B0%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%A7%E3%81%99%E3%80%82)

## Multi-AZ とは

- [AWSのMultiAZについて調べたので残しておく](http://natural-hokke.hateblo.jp/entry/2014/10/24/133205)
- [Multi-AZって何？](https://www.skyarch.net/blog/?p=7648)

## Step1. EC2 Linux インスタンスを作成する

- [Amazon EC2 のキーペア](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-key-pairs.html)
- [Linux インスタンスの Amazon EC2 セキュリティグループ](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-security-groups.html)
- [Amazon EC2にSSH接続する](https://dev.classmethod.jp/articles/aws-beginner-ec2-ssh/)
	
## Step2. Web サーバを準備する
- [Apache HTTP サーバ - DocumentRoot ディレクティブ](https://httpd.apache.org/docs/2.4/ja/urlmapping.html#documentroot)
- [Apache HTTP サーバ - Listen ディレクティブ](https://httpd.apache.org/docs/2.4/ja/bind.html)
	
## Step3. Web サーバをテストする
- [PHP: date - Manual](https://www.php.net/manual/ja/function.date.php)
- [Linux のユーザーとグループ](https://www.atmarkit.co.jp/ait/articles/1706/02/news014.html)

## Step4. ALB を作成して、Multi AZ 構成にしてみる
- [Amazon EC2 インスタンスからの AMI の作成](https://docs.aws.amazon.com/ja_jp/toolkit-for-visual-studio/latest/user-guide/tkv-create-ami-from-instance.html)
- [ターゲットグループの作成](https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/create-target-group.html)
- [ターゲットグループへのターゲットの登録](https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/target-group-register-targets.html)
- [Application Load Balancer の作成](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/create-application-load-balancer.html)