AWS基礎　サーバー構成入門

# ネットワークとサーバーの構築
用語は必要になったらその都度説明してあります。
前提として、AWSアカウントを作ってあることが必要です。
間違っていることありましたら、ご指摘お願いします！

## 用語1
### クラウドコンピューティング
インフラストラクチャをハードウェアがとして考えるのをやめて、ソフトウェアとして考える。柔軟性が非常に高いので、オンプレよりも、運用効率は長期的にも強い。

### グローバルインフラストラクチャ
AWSのデータセンターはアベイラビリティゾーンがそれと同義で使用され、リージョンはアベイラビリティゾーンが置かれた地域とエッジロケーション。

### アンマネージド型
スケーリング、耐障害性などの管理はユーザーに投げる

### マネージド型
スケーリング、対象外性などの管理は提供側が保障する

## AWSの冗長化は、EC２に対してELBを設定したり、複数のEC2で対応する。

　サーバー用のOSをインストールして、そこにソフトウェアを落とすことで、用途別のサーバーを物理的に立てられるようになる。
　そして、構築したサーバーをネットワークに接続する必要があり、そのためにTCP/IPと呼ばれるプロトコルを使用する。
　レンタルサーバーとの違いは、レンタルサーバーはサーバー領域のみを借りられるため、細かい設置はネットワーク管理者に依存しているが、AWSは全て設定する。
　AWSのメリットは、負荷分散処理をオートで行うことや、実機の仮想テストといった機能がある。
　しかし、ここで大きな問題となるのが、物理的なサーバーや、回線、ハブ、ルーターを用意すること。なので、仮想的にネットワーク環境とサーバーを構築できるようにしたのが、AWSである。
　AWSは仮想ネットワーク用のVPCと、仮想サーバー用のEC2を提供しているので、これを使っていく。
　VPCを作成すると、ここをまたさらに分割し、サブネットと呼ばれる部分を作る。
　次に、ここにEC2を使ってインスタンス(仮想サーバー)を作る。

## 用語2

### リージョン
地域を東京に設定する。Amazonは世界中に点在する。リソース構築に選択できる地域の事。

### VPC
固定のローカルIPを使い、サブネット、ホスト単位でのセキュリティ設定ができる。

### マネージメントコンソール
ログインした時のホーム画面を指す。

### サブネット
VPCに割り当てるネットワーク空間のこと。IPv4とIPv6のどちらにも対応をしている。AZに属している必要があり、インターネットのアクセスを許可するかどうかで、パブリックサブネットとプライベートサブネットの二つを使い分けることが出来る。

サブネットマスクとは、同じAZの中で、一つ一つ用途毎のサーバーを作ったりする時に、区切るために用いる。

### プライベートサブネット
後述

### パブリックサブネット
後述

### アベイラビリティゾーン(AZ)
VPCの配下にありVPCのリソース空間を設定する。使用するサブネットマスクの中をさらに細分化して、攻撃の担保とする領域。これは互いに影響を受けないように場所やネットワークが分離しており、これらが専用の高速回線で相互接続されている。サブネットを複数作成してそれぞれが別のAZを使用する設定を行うことで一つのAZがダウンしてもサービスの継続性には問題が生じない設計にすることができる。
￼

### IAM
AWSにおけるユーザアクセスと暗号キーの管理をするサービス

### ルートアカウント
利用開始時につくられる全ての操作が可能
　
### 別ユーザー
割り当てられた役割のユーザー
　
### ポリシー
ユーザーに割り当てる権限の事。既存ポリシーと独自ポリシーの二つを使う。既存ポリシーは、元々存在するサービスとして利用可能なポリシーで、既存で解決出来ないものは独自ポリシーをポリシーエディタでJSON形式で記述する。

### グループ
ユーザーにポリシーを分割する際には、ユーザーを増やす場合、再設定が居るので、作業効率が落ちるその為、同じ権限を持つユーザーを増やす場合には、グループにポリシーを割り当てて、そこにユーザーを追加する。

## ロールの作成
サーバー設定の権限。ロールを割り当てたサーバーへのアクセスにはユーザー認証の必要無しに無条件アクセスが可能になる。マネジメントコンソールから、IAMを選び、ロールの作成を押し、EC２に割り当てるロールのため、Amazon EC2を選択する。次にポリシーのアタッチを行なう。今回はフルアクセスを行った。これは後ほどEC2を作る際に設定の中で行う。

##IAMを使って、サーバー管理の態勢を整える。
マネジメントコンソールから、IAMを選択して、ユーザーを選ぶ。
今回は、全権限もちのマスターユーザーと、デベロッパー向けのEC2アクセスとデータベースであるRDSへのアクセス権限をもつグループを作り、そこにユーザーを二つ置く形で設計する

プログラムによるアクセスと、AWSのマネジメントコンソールへのアクセスを可能にするために、チェックボックスにチェックをつけ、パスワードは自動生成する様にする。
次のステップでは、アクセス権限を設定できるようになる。既存のポリシーをアタッチするのをクリックすると、既存ポリシーが表示される。今回は、PowerUserAccessを割り当てて、次のステップに行く。
これでユーザーを作成する。
ここで大事なのは、ユーザーでCSVファイルを作成する際に、これは一度しか作れないので、AWScliを使う時にここで生成されるIDなどを使う事になるので、必ずメモをしておくこと。

この時に、ラグが生まれて一度だけ、アカウントを強制的に離脱させられるので、気にしない。

CSVファイルで手に入るURLでログインして、作ったユーザーの名前と、パスワードで侵入し、そのあとパスワードを変更して、ルートユーザーが入れない様にすることで、脆弱性を減らす。


ID xxxxxxxxxxxx  Master-user パスワード

次にグループの作成を行う。
名前を決めて、このグループに対してポリシーを決める。
EBSとEC2のフルアクセス権原を与える。

そして、このグループに入るユーザーをふたつ作る。

ID xxxxxxxxxxxx developer1  パスワード

ID xxxxxxxxxxxx developer2 　パスワード

ID xxxxxxxxxxxx developer3 

User name,developer3
Password,xxxxxxxx
Access key ID,xxxxxxxxxxx
Secret access key,xxxxxxxxxxxxxxxxx
Console login link,https://xxxxxxxxxxxxxx.signin.aws.amazon.com/console

## 用語３

## AWS-cli
AWSの操作にはWebコンソールか、プログラム（APIを叩く）
このふたつがあるが、今回はプログラムを使って行う。コマンドラインツールや、SDKを使うが、AWSのコマンドラインツールがあるので、そいつを使う。
オペレーションの簡略化や、定型作業の自動化ができる。
AWScliは、Pythonを使う為、pipコマンドを用いて、インストールする。
MACには2系のPythonが常備で入っているので、其奴を使用する。

```
$ pip install awscli
```

インストールしたら、awscliを初期化する。
```
$ aws
```
この時に、awsのID云々を聞かれる事があるが、無闇に権限の強いユーザーがコマンドラインツールを利用できるのはまずいので、developerなどの権限の低ユーザーに使わせるのが妥当。と言うわけで、今回は、developer3のAccessKeyID、SecretKey、defaultregionname(リージョン名)、default output format(今回設定無し)、で行なう。
そうすると、ホームの所の.awsディレクトリの中に、今の所作を記録したconfigとcredentialsというファイルが出来ている。
以上で初期設定が完了する。
後は、awsコマンドを使用して、自動化したくなったときに活かしていこう。
　
## 用語４

### セキュリティグループの作成
インスタンスの送受信を規制するルールを付加するためのグループ。
インバウンドとアウトバウンドが有り、それぞれが受信と送信を担当している。詳しくは後述。

### インバウンドルール
そのセキュリティグループに関連付けられたインスタンスにアクセスできるトラフィックを規制するルール

### アウトバウンドルール
そのセキュリティグループに関連付けられたインスタンスからどの送信先にトラフィックを送信できるか（トラフィックの送信先と送信先ポート）を制御するルール

### EIP
EC2インスタンスで使える、パブリックIPアドレス（グローバルIPアドレス）の固定IPアドレス。EC2のタブから、作成することができ、簡単に割当を行うことができる。

### CIDR
IPアドレスが、「ネットワーク部」と「ホスト部」から成っていて、ネットワーク部が短いほどにそして、ホスト部が長いほど大きなネットワークの構築が可能になる。またネットワーク部とホスト部の構成には規格（クラス）が存在する。
それらはクラスA、10.0.0.0/8 = 10（ネットワーク部）+ 0.0.0（ホスト部）で、これは、大型のネットワークを作る場合に、最大で16,777,216個のアドレスを作り出すことができる。次に、クラスB。これは、172.16.0.0/16 = 172.16（ネットワーク部）+ 0.0（ホスト部）で、中型のネットワークを作る場合、65,536個のアドレスを作り出すことができる。最後にクラスC。これは、192.168.1.0/24 = 192.168.1（ネットワーク部）+ 0（ホスト部）で、小型のネットワークを作る場合、256個のアドレスを作り出すことができる。
上記クラスのIPアドレスのお尻に着く「/8」「/16」「/24」はCIDR表記と呼ばれ、ネットワーク部の長さを示す値で、IPアドレスを２進数表記にした場合の先頭から桁数になる。
　Classless Inter-Domain Routing略。つまりクラスレスであるので、前述した規格に当てはめることなく自由なサイズのネットワークの構築を可能とするようになる。仮に、257個のアドレスが必要なネットワークを構築したい場合、「クラスフル」だとクラスB、CIDR表記で「/16」のネットワークサイズ（最大65,536個のアドレス）を選択することになり、無駄が多くなる。一方「クラスレス」だと、CIDR表記で「/23」のネットワークサイズ（最大512個のアドレス）を選択できるので無駄の少ないネットワークサイズ構築が可能になる。
上記のような、自由なサイズのネットワークの構築をする仕組みをCIDRと呼ぶ。


## AWSでのサーバー環境構築について
　AWS上でネットワークを構築する時は、最低限、一つのVPC、一つのAZ、一つのサブネットを作成する必要がある。
但し、どんな環境を構築するかどうかは、その開発の規模に依存する。
EC2のタブからEIPを選択して、割当を行っておく。

## まずVPCを作成する
VPCウィザードの開始ボタンをクリック
どんなサービスを展開するかによって、どのくらいのネットワークを組もうとするかを考える。
中くらいから、大きいくらいのネットワーク構築なら、パブリックサブネットとプライベートサブネットをふたつずつ持たせる構成などがある。
今回は「パブリックとプライベートサブネットを持つ VPC」を選択し、マルチアベイラビリティゾーンを持つVPC空間を作成する。
　なので、今回は、マルチアベイラビリティゾーンを横断する環境を作るので、パブリックサブネットとプライベートサブネットをそれぞれふたつずつ作る。
　VPCは、まずCIDR形式でVPCのサイズを測ることが出来る。これで、作成出来るアドレス範囲が決定する。ここは、一度決めれば直せないので、コンテンツの規模によってどうするかを考える事が重要。
　IP CIDRブロックを設定する。ここでは「/16」の中くらいのやつを選択する。
　ネットワークにデータを流す際には、ルートテーブルが必要になる。TCP/IPには、データをパケットという単位で通信を行う。パケットの中身は、ヘッダー情報と、送りたいデータそのものの二つが含まれている。このヘッダー情報の中の宛先IPアドレスをルートテーブルと参照して、目的のネットワークへと接続する。
　パブリックサブネットは、ルートテーブルがインターネットゲートウェイに直接つなげられているもので、ルートテーブルのターゲットが、igwとなっていれば、それはパブリックサブネットである。
VPC作成の段階で設定したブリックサブネットは、ルートテーブルが直接紐付けられている。プライベートサブネットはナットサーバーへと接続されていて、eni-というのがルートテーブルに付いていたら、それがプライベートサブネットという事になる。
　注意すべきは、VPC作成時に設定段階で作ったパブリックサブネットには、ルートテーブルがインターネットゲートウェイに自動で設定がなされているが、その後で作成したサブネットは全てデフォルトのルートテーブルがナットサーバーへのルートテーブルなので、パブリックサブネットを追加した時は変更を忘れないこと。
　サブネットを設定する。実際のネットワークでは、割り当てられたCIDRブロックを更に小さなCIDRブロックで分割して利用するのがほとんどで、この更に細分化したCIDRブロックのことをサブネットと呼ぶ。サブネットで分割すると、その部分でネットワークを分けることができる。分ける主な理由は、二つ。一つは、物理的な隔離のため。どちらかのサブネットに障害が起きても、影響が出にくくなる。二つ目は、セキュリティのため。用途ごとに使用するサーバーを隔離しておけるから。
　VPC作成時のルートテーブルはデフォルトでローカルでのパケット送信と、「 0.0.0.0/0、つまり全てのIPアドレス範囲において宛先のパケットをインターネットゲートウェイに転送する」というデフォルトゲートウェイの二つができている。

　ここまでで、VPC領域の作成が完成。VPCの領域の中には、パブリックサブネットというサブネットが一つあり、そこのルートテーブルは、ローカルとの通信と、インターネットへの接続の二つが可能になっている。

## 仮想サーバー構築
AWSでは、仮想サーバをEC2を用いて、作成する。今回は、3tier Systmと呼ばれる、Webサーバーから、APIサーバーを経由して、データベースサーバーへと接続出来るデザインを構築する。これをAWS上で行う為に、WebサーバーとAPIサーバーをEC2として、データベースさーバーをAmazonRDSとして運用する。
　具体的な設計プランは、WebサーバーとAPIサーバーに各3つのEC2インスタンスを配置し、どこかがダウンしても大丈夫なように設計をした。
増やしたサーバーにアクセスがいき届くようにELB(ロードバランサ)をこの二つの間にはさむ。そして、データベースにもレプリカインスタンスを用意して、データベースが片方壊れても大丈夫なようにしておく。
サーバーメンテナンス様のEC2も用意しておく。
￼
　EC2を用いて作成された仮想サーバをインスタンスと呼ぶ。そして、このインスタンスにも、ローカルとの通信用のプライベートIPアドレスと、インターネットへの接続用のパブリックIPアドレスの二つが出来るようになっている。
　最初にキーペアを作成する。これは、インスタンスにSSH接続する際に必要になる。キーペアは、公開鍵を、AWSサーバー上にアップしておき、秘密鍵は、リモートで保管をしておく。秘密鍵の漏洩対策として、パスフレーズ付きの物を作成する。ここでは、fox-keyとする。

```
$ ssh-keygen -t rsa -b 4096 -C “ec2-user” -f fox
```
Rsa方式で、鍵調は、4096ビット　コメントがEC2-user ファイル名がfox-keyとなるようにしている。
このコマンドをうつと、パスフレーズを要求される。
　拡張子のついていないものが、秘密鍵となるので、pemの拡張子を付けておく。
　そして、パーミッションを自分だけが読めるようにしておく。

```
$ chmod 600 fox-key.pem
```

```
$ cat fox-key.pub
```
で中身を確認できる。コメントにはec2-userとあるのが分かる。
そして、この鍵をawsにインポートする。
マネージメントコンソールのEC2から、ペアキーのインポートを行う。秘密鍵をここでインポートしないように注意。ファイルを選択すれば自動でやってくれる。
　
　インスタンスを作成するウィザードを展開すると、まず、AMI(Amazon Machine Image)を選択する。このイメージは、OSのインストールされ、初期アカウントの設定までが完了しているものになる。インスタンスタイプ（CPU、メモリなどの機能を持つ）は、無料利用枠のt2.microを選択する。ロンチするインスタンスの詳細設定を行う。立ち上げのインスタンスが一つ、使用するVPC・サブネットがさっき作ったやつであることを確認。そして、ログインサーバーを作る為、パブリックIPを有効にする。
また、プライベートIPアドレスを設定する。プライマリIPの部分に、VPC作成の際にサブネットを10.0.1.0/24で分割しているので、その範囲である10.0.1.0~10.0.255の範囲でIPアドレスを割り当てることができる。ここでは、10.0.1.10とする。
　
　次にEBSを設定する。ここではデフォルトを使用。EBSはオンプレのハードウェアと道義のもの
　
　インスタンスにタグをつける今回は「login-server」とする。同様の方法で、webサーバーも作る。

　次に　SG(Security Group)を設定する。これは許可ルールを設定して、設定した分だけ、穴を開ける仕組み(ファイアーウォール)になっている。
もっともポピュラーなファイーアーウォールは、パケットフィルタリングである。流れるパケットを見て、パケットに付随するIPアドレスやポート番号で通過の可否を決める。
　ここでは、SSH接続には、このMACでしかできないように、カスタムではなくて、My IPによる設定を行った。（勉強したものでは0.0.0.0/0だった。フルアクセスは万一キーペアの流出があった場合、SSHの脆弱性を突かれる可能性があるので、必要最小限の端末からのアクセスに留めておく配慮を行った。）

　AMIは複製することができるので、同じ性能を持ったEC2をいくつも立てることが出来る。これで、作成コストが大幅に減らすことができる。
　複製するには、まず、複製したいAMIを持つEC2を停止させて、アクションのボタンをクリックすると、複製したいAMIの名前を書くことができるので、英数字で記入する。日本語で記入するとInvalidと文句を言われる。
　そうして作ったコピーAMIから作製を行なうと、すぐにインスタンスを作る画面に遷移する。2つのパブリックサブネットを以前に作っているので、今回はpublic-subnet-1cを使って新しいアベイラビリティゾーンにEC2を立てた。

## Route53(DNSサービス)
　自分でDNSサーバーをセットアップする事なく、WebブラウザからDNSレコードが管理でき、AWSサービスをエイリアスとして設定することができる。
　DNSの種類は大きく分けて、インターネット向けDNSとVPC向けDNSの二つが存在する。
DNSは階層的に名前解決していく。
Route53を選択し、始めるからのホストゾーンの作成を選び、インターネット向けのDNSを作るので、パブリックホストゾーンを選択する。そして、お名前.comの方にRoute53のNSレコードに記載されている最後のピリオド抜きのドメイン部分を、お名前.comのネームサーバー枠に順次登録していく。VPC向けのDNSは、ドメインを任意で決め、プライベートホストゾーンアマゾンVPC用を選択し、VPCは使いたい作ったVPCを選択する。
　サーバーの代数が多いシステムの場合、VPC内部でもホスト名を用いた通信を行いたい場合が出てきたり、EC2のように頻繁にサーバーの代数が変わる場合、サーバーのIPアドレスではなく、ホスト名を使って管理を効率化することもある。

設定したDNSをホストに登録する。
Route53のホストゾーンからパブリックホストを選択し、レコードセットを作成するのを選択し、ホスト名を書き、IPv４を使うのでタイプAを選択。EC2のパブリックIPをValueに入力したら作成を行う。
これによって、レコードが作成される。同様の方法で、プライベート
これで、ターミナルからパブリックとプライベートホスト名を用いてもEC2にアクセスすることができるようになる。

## SSH接続を試みる
　まず、インターネット側からアクセスするのにパブリックIPアドレスを用いる。
　
ここから、ターミナルを使って、接続する。

```
$ cd /desktop/aws
$ chmod 600 [ダウンロードしたキーファイルのパス]
$ ssh -i [ダウンロードしたキーファイルのパス] ec2-user@[IPアドレス]
```

ec2-userという形で入るという意味を持つ。ここで、sshd.confのPermitRootLoginの

```sshd.conf
PubkeyAuthentication yes
PasswordAuthentication yes
PermitEmptyPasswords yes
```
をコメントアウトになっていたので、修正。
これで、Permission denied(publickey)の警告も消えて、接続が可能になる。sshdはsshを可能にするソフトウェアの名称である。

補足
Operation timed outになった場合は、セキュリティグループのインバウンドルールのソースをmyIDへと変更する。

## Apache or nginxを設定する
　さっき作成したAMIからEC2インスタンスを作成する。インスタンスタイプは無料枠を使う。
ここで、プライマリIPは以前作成したパブリックサブネットの10.0.1.0/24での設定をしているので、最後の桁を使用していないアドレスの範囲で任意使用する。前回作ったものを10.0.1.10としたので、10.0.1.11とした。
ここからターミナル上で、nginxを入れていく。
Linuxがイメージファイルなのでyumコマンドでやっていく。
lempの開発環境を構築していく。

ミドルウェアのアップデート
```
$ sudo yum update
```

webtatic-testingリポジトリの追加
```
$ sudo rpm -Uvh https://mirror.webtatic.com/yum/el6/latest.rpm
```
ここからの内容は、こちらが素晴らしかったので、そのままでやりました。

https://qiita.com/NobuyukiMorii/items/9811c2273ed8b7fa1bc2

下記を参考にして作業した時につまったところのメモです。

```
/etc/nginx/nginx.conf

/etc/php-fpm.d/www.conf
```
この両者のファイルの中身は、php7.0バージョン場合、sockファイルを使用すると動作しない。
ゆえに、

```nginx.conf
fastcgi_pass   127.0.0.1:9000;
```
であり、

```www.conf
listen = 127.0.0.1:9000
```

である。

自動起動設定

```
$ sudo chkconfig nginx on
$ sudo chkconfig php-fpm on
```
## mysqlの導入
こちらを参照させていただきました。
https://qiita.com/toshihirock/items/c5933d3628c7d4e81ffa

## ここまでで、プライベートサブネットを構築する。
セキュリティの向上を図るため、データベースサーバーなどは、インターネットから隔離された場所におく必要がある。
そこで、インターネットからは直接接続できないサブネットを用意する。
これをプライベートサブネットと呼び、　データベースを含むバックエンドシステムを置く場所となる。
プライベートサブネットは、サブネットの作成から、パブリックサブネットを作成した時と同じアベイラビリティゾーンを選択し,サイダーブロックをパブリックサブネットの次になるように10.0.2.0/24と設定して作成する。
この時に、ルートテーブルも作成し、プライベートサブネットに適応させるだけのテーブルを用意する。この段階で、パブリックルートと、プライベートルートの2つが完成している。ただし、プライベートルートに関しては、送信先が、インターネット接続不要のため、localだけが設定されているようにすること。

次にこのプライベートサブネットの中にインスタンスを設置する。設置する際にプライベートサブネットを指定し、ネットワークインターフェースに10.2.0.10を設定しておく。この状態でインスタンスを作る。

次にセキュリティグループを作成する。これは、インバウンドルールの中に、SSHとMySQLを任意の場所から入れるように設定した。これを先ほど立ち上げたデータベースサーバーに対してアタッチする。これによって、Webサーバーを経由して、データベースサーバーへのアクセスが可能になる。
　接続する際には、プライベートIPアドレスである10.2.0.10を使用して接続を行う。

## AWSその他機能について

### ELB
　ロードバランサーとは、複数のEC2でインターネットのアクセスを受ける時の割振りをするしくみのことをさす。クロスゾーン負荷分散をオートでおこなってくれる。SSLアクセラレータ・・・暗号HTTPを復号する事ができるので、EC2の処理を軽減することができる。
AWSには、クラシックタイプとアプリケーションタイプの2種があり、アプリタイプは、高度な設定が可能で、グループを用いて、サーバーをまとめて管理することが出来る。
　ターゲットグループを設定することで、まとめてEC2を管理することができる。

### AutoScaleについて
　自動で予め設定しておいたAMIを使ってサーバーを追加してくれる機能である。

### RDS
　RDSは勝手に冗長構成をオートでやってくれるリレーショナルデータベースサービス。

### S3
　マネージドのクラウドストレージ。ファイルの更新には結果整合性が採用されている代わりに保存されたら確実に保存されているかわりに保障がある。オブジェクトストレージとブロックストレージ

### ネットワークACL
 VPC全体にセキュリティグループを設定することができる。不正アクセスのIPアドレスの締め出しなどを行う事ができる

補足
ルートデバイスタイプ: ebs 仮想化タイプ: hvm
Pvという古い仮想化タイプがあるので、気を付ける。
古いタイプは特定の条件下で、ブートローダが突然死することがあり、amazonから提供されるバッチを当てることで修正可能だが、hvmで環境を構築した方が良い。