【AWS】AWSの勉強

勉強した事をつらつらと書いています。

# AWSのネットワークについて

## リージョンという考え方

AWSの各サービスが提供されている地域の事

## アベーラビリティーゾーン
独立したデータセンターの事
東京リージョンでは、100Kmほど離れた場所にデータセンターがある。

## VPCとは
Virtual Private Cloud
AWS上に仮想ネットワークを作成できるサービス

VPCはリージョンを跨いで構築することはできない

## サブネット
VPCを細かく区切ったネットワーク
ネットワークを区切りたい時に利用する。
複数のアベイラビリティーゾーンを利用し、冗長性を確保することがベストプラクティスとして紹介されている。

# ネットワークのIPアドレスについて

## IPアドレスとは
ネットワーク上の機器を識別するためのインターネット上の住所
### 特徴
- ネットワーク上で重複しない番号
- 32ビットの整数値
- 読みにくいので、8ビットずつ4つの組みに分け、ピリオドを入れて10進数で表現する
- 0.0.0.0〜255.255.255.255 まで

## パブリックIPアドレス
インターネットに接続する際に使用するIPアドレス
重複すると正しく通信できなくなるのでICANNという団体が管理している
プロバイダーやサービス事業者から貸し出される(AWS上では、AWSから借りる)

## プライベートIPアドレス
インターネットで使用されないIPアドレス
下記の範囲内でアドレスを自由に使用することができる

| 利用できるIPアドレスの範囲       |
|:-----------------:|
| 10.0.0.0 〜10.255.255.255 |
| 172.16.0.0 〜172.31.255.255 |
| 192.168.0.0 〜192.168.255.255 |

社内LANの構築やネットワークの実験時はプライベートIPアドレスを使用する

## ネットワーク部とホスト部について
IPアドレスのは「ネットワーク部」と「ホスト部」がある
ネットワーク部とホスト部を表現するための表記方法

### CIDR表記(サイダー表記)
IPアドレスの後ろに「/」を書き、その後ろにネットワーク部が先頭から何ビット目までなのか記載する
例）
192.168.128.0/24

### サブネットマスク表記
IPアドレスの後ろに「/」を書き、ネットワーク部を表すビットと同じ部分を1に、ホスト部を表すビットを0にする
例）
192.168.128.0/255.255.255.0

# VPCの作成

## 流れ
1. VPCを作成
2. サブネットを作成する
3. ルーティングを設定する

## VPCの作成
AWSはデフォルトで1つ作成済みだが、基本的には、新しく作成して利用する
`10.0.0.0/16`を指定し、作成する

## サブネットの作成
IPアドレスの範囲を分割して使いやすくする
▪️特徴
- アベイラビリティーゾーン別でサブネットを構築し、物理的に離すことで対障害性を確保できる
- あるサーバのみインターネットに配置したくない場合に、利用できる

パブリックサブネット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/707da24b-0fb5-e535-5678-a85d196ebf0d.png)

プライベートサブネットは上記と同様に作成する
名前 `aws-and-infra-private-subnet-1a`
CIDR表記 `10.0.20.0/24`

## ルーティングの説明
インターネットでは、ルーターがIPアドレスの行き先を管理しているため、ネットワークとネットワークがIPアドレスを通じて接続することができる。
ルートテーブルとは、「宛先のIPアドレス」と「次のルーター(AWSでは「ターゲット」という)」という形式で設定する。

▪️ 初期のルーティングテーブルについて

| 送信先 | ターゲット |
|:-----------------:|:-----------------:|
| 10.0.0.0/16 | local |

▪️作成するルーティングテーブル

| 送信先 | ターゲット |
|:-----------------:|:-----------------:|
| 10.0.0.0/16 | local |
| 0.0.0.0/0 | インターネットゲートウェイ |

インターネットに向けるために10.0.0.0/16以外の通信は、インターネットゲートウェイに対応させる

## インターネットゲートウェイの設定
名前 `aws-and-infra-igw`
でインターネットゲートウェイを作成する

作成後、まだVPCにアタッチされていない状態なので、作成したインターネットゲートウェイを選択し、アクションから、VPCにアタッチを選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/32ce36b3-d0ac-c9f3-0f1b-9842f76ee49e.png)
先ほど作成したVPCを設定する。

## ルートテーブルの設定

## VPC設計のポイント
- 作成後は変更できないので、大きめに設定しておいた方が良い（大きさは/16を推奨）
- オンプレミスや他のVPCのレンジと重複しないように気をつける（相互接続する可能性がある場合は、重複厳禁）

## VPCを分割するか？アカウントを分けるか？
- 異なるシステムの場合は、アカウントを分ける
- 同一システムの各環境は、VPCとアカウントのどちらを分けるか？
- 環境が違う場合は同一の物を使用するのはダメ
- アカウントをわけると、他の環境のリソースが見えず、作業しやすい。環境ごとにIAMの設定が必要
- VPCをわけると、IAMの設定が一度で良い。各環境のリソースが見えてしまい事故に繋がる。

## サブネットのポイント
サブネットの分割はアベーラビリティーゾーンを基準に行う
- サブネットに割り当てられるルートテーブルは1つ
- インターネットアクセスの有無、拠点アクセスの有無などのルーティングポリシーに応じて分割する
- 高可用性のために、2つ以上のアベイラビリティーゾーンを利用する

# EC2を構築する
パブリックサブネットにサーバーを設置し、Apacheをインストールする。

## EC2インスタンスを設置しよう
EC2はElastic Compute Cloudの略
### 特徴
- 数分で起動し、1時間または秒数で従量課金
- サーバーの追加・削除、マシンスペックの変更も数分で可能
- OSより上のレイヤについては自由に設定できる

### 作成手順
1. AMIの設定
2. インスタンスタイプの設定
3. ストレージの追加
4. セキュリティーグループの設定
5. SSHキーペアの設定

### AMIとは
Amazon Machine Imageの略
OSのイメージ。サーバーのテンプレートのような物

### インスタンスタイプについて
サーバーのスペックを定義したもの
例）
m5.xlarge
「m」：インスタンスファミリー
「5」：インスタンス世代
「xlarge」：インスタンスサイズ

### ストレージとは
サーバーにくっつけるデータの保存場所
EC2のストレージは2種類ある
- EBS （Elastic Block Store)
 高い可用性と耐用性を持つストレージ
 Snapshotを取得し、S3に保存可能
 別途料金が発生
- インスタンスストア
 インスタンス上に保存する方法
 Stopするとデータが消える

## EC2インスタンスの設定
1. EC2インスタンスを設置
2. Apacheをインストール
3. ファイアウォールを設定

### SSHとは
サーバーと自分のパソコンをセキュアにつなぐサービスの事

### 公開鍵認証
サーバーに本人だけがログインできるようにする物
EC2ではSSHログイン時に公開鍵認証を行っている

公開鍵で暗号化して、秘密鍵で復号化する

1. 自分⇨サーバー：自分のコンピュータにログインさせて
2. サーバー⇨自分：適当なデータを公開鍵で暗号化して送る
3. 自分⇨サーバー：秘密鍵で復号化したデータを送る
4. サーバー⇨自分：元のデータと合っていたからログインしていいよ

## ポート番号とは
プログラムのアドレス
同一コンピュータ内で通信を行うプログラムを識別するために利用する

### ポート番号の決め方
- 標準で決めれらている番号
 ウェルノウンポート番号（0〜1023まで）
- 動的に決まる番号
 動的に割り当てる番号は49142〜65535までのいずれかの整数値をとる

## ファイアウォール
AWSでは、セキュリティーグループがファイアウォールの役割を担っている
インターネットからサーバーに入ってくる通信 ⇨ インバウンド
サーバーから出て行く通信 ⇨ アウトバウンド

## Elastic IPアドレス
EC2インスタンスのパブリックIPは、起動・停止すると別のIPアドレスが割り当てられる。
EC2インスタンスが起動している場合は、無料
EC2インスタンスを停止している場合は、有料

## 後片付け
Elastic IPの関連付けの解除及び解放
EC2インスタンスを停止させる

# ドメインを登録(Route53)
注意点（実際にドメインを購入するため、お金がかかる)
## ドメインとは
IPアドレスは数字の列なので、人にとっては覚えづらい。
ドメイン名を用いてWebサイトにアクセスするようにする

www.example.co.jp
「www」：第4レベルドメイン
「example」：第3レベルドメイン
「co」：第2レベルドメイン
「jp」：トップレベルドメイン

ICANN ： ドメイン全体を管理
⬇︎
レジストリ ： トップレベルドメインを管理し、レジストラに卸す
⬇︎
レジストラ ： 一般消費者に販売しつつ、リセラに卸す
⬇︎
リセラ ： 一般消費者に販売

## DNSとは
ドメインとサーバー(IPアドレス)をDNSで紐付ける必要がある
Domain Name System

- ネームサーバー  
　ドメインメ名とそれと紐付くIPアドレスが登録されているサーバー  
　ドメインの階層ごとにネームサーバーが配置され、そのネームサーバーが配置された階層のドメインに関する情報を管理する
- フルリゾルバ  
　色々なネームサーバーに聞いてIPアドレスを調べて教えてくれるサーバー

## リソースレコード
DNSは様々な情報を管理している。
「ドメイン名とIPアドレスの紐付け」1つ1つの事をリソースレコードと呼ぶ

Aレコード：ドメインに紐付くIPアドレス
NSレコード：ドメインのゾーンを管理するネームサーバー
MXレコード：ドメインに紐付くメール受信サーバー
CNAME：ドメインの別名でリソースのレコード参照先
SOA：ドメインのゾーンの管理情報

# Route 53
AWSのDNSサービス。ネームサーバーの役割を果たす
## 特徴
高可用性。SLA 100％
高速
フルマネージドサービス。DNSサーバーの設計・構築・維持管理が不要

## 重要な概念
- ホストゾーン  
DNSのリソースレコードの集合
- レコードセット  
リソースレコードのこと
- ルーティングポリシー  
Route 53がRoute Setに対してどのようにルーティングを行うか決める
- ヘルスチェック  
サーバーの稼働状況をチェック

## ルーティングポリシー
- シンプル
- 加重  
 ABテスト時に使用する
- レイテンシー
- 位置情報  
 地域限定配信時に使用できる
- フェイルオーバー

## コマンドでネームサーバー等を確認する
`dig ドメイン名 NS +short`

# 【RDS】DBサーバーを構築しよう
EC2を借りてDBを構築することも可能だが、今回は、RDSを利用する

複数のアベイラビリティーゾーンに作れるように、プライベートサブネットを２つ作る必要がある。

## RDSとは
フルマネージドなリレーショナルデータベースのサービス
- 構築の手間の軽減
- 運用の手間の軽減
- AWSエンジニアによるデータベース設計のベストプラクティスを適用
　⇒コア機能の開発に注力できる

### 各種設定グループ
- DBパラメータグループ：DB設定値を制御
- DBオプショングループ：RDSへの機能追加を制御
- DBサブネットグループ：RDSを起動させるサブネットを制御

### RDSの特徴
■可用性の向上
　⇒マルチAZ（アベイラビリティーゾーン）を簡単に構築
■パフォーマンスの向上
　⇒リードレプリカを簡単に構築
■運用負荷の軽減
　⇒自動的なバックアップ
　⇒自動的なソフトウェアメンテナンス
　⇒監視

## プライベートサブネットの追加作成
RDSを作成する際に、マルチAZに対応できるように複数のAZにプライベートサブネットを構築する必要がある

## RDSの作成準備
以下の手順で作成を行っていく

1. セキュリティーグループの作成（EC2）
1. DBサブネットグループの作成
1. DBパラメータグループの作成
1. DBオプショングループの作成

RDSのセキュリティーグループもEC2の設定を使う

今回は、「MySQL」を利用する。

### セキュリティーグループの作成
今回は、`aws-and-infra-subnet-group`のセキュリティーグループを作成する。
パブリックサブネット上のEC2のIPアドレスで指定することも可能だが、AWSのセキュリティーグループも指定可能なので、今回は、AWSセキュリティーグループを指定する。

### DBサブネットグループの作成
Amazon RDSのサービスページに移動し、「サブネットグループ」を作成するページに移動する
RDSを構築する前にマルチAZを構成するために、サブネットグループを作成する必要があります。
今回は、1aと1cのプライベートサブネットを指定します。

### DBパラメータグループ
DBの設定を行うパラメータ
数がとても多いため、今回は、ポイントになるパラメータのみ確認を行う
### オプショングループ
プラグインを使いたい等の設定が可能
オプショングループを作成すると、デフォルトの物も作成されるが、今回は、自身で作成したグループを利用していく。

## RDSの作成
以下の手順で作成を行っていく
1. DBエンジン
2. 本番環境
3. DB詳細の指定
4. [詳細設定]の設定

### RDSの構築
今回は、MySQLの`8.0.15`を選択する。
テンプレートという項目は、`無料`を選択する。


RDSの停止は注意が必要
RDSの起動時にリソースが余っていないと停止できない事が有る。

### WebサーバーからRDSへ接続
MySQLのインストールを行う
`sudo yum -y install mysql`を実行する

`mysql -h エンドポイント -u ユーザー名 -p`コマンドを打ち、パスワードを入力する。

# WordPressの構築について

## WordPress用のデータベースの作成

1. データベースの作成
2. ユーザー作成
3. ユーザーに権限付与

`CREATE DATABASE aws_and_infra DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;`

`CREATE USER 'XXXXXXXX'@'%' IDENTIFIED BY 'XXXXXXXXX';`
%で接続元はどこでもOKとしている。

`GRANT ALL ON aws_and_infra.* TO 'XXXXXXXX'@'%';`

変更内容を更新
`FLUSH PRIVILEGES;`

ユーザーの登録内容を確認
下記のコマンドでユーザーが正しく追加されているかを確認する。
`SELECT user , host FROM mysql.user;`
hostの部分は%となり、どこからでも接続できるようになっている。

MysqlやEC2はコマンドの誤操作が発生すると困るため、接続はすぐに解除するようにする。


## WordPressのインストール
1. ライブラリのインストール
2. WordPressのダウンロード
3. WordPressの解凍
4. WordPressのプログラムをApacheから見える場所に配置
5. WordPressファイルの所有者・グループを変更
6. Apacheの再起動

WordPressを動作させる為に、phpの最新版を取得する。
yumでinstallすると、最新バージョンを手に入れられないので、下記のコマンドでインストールする。
`sudo amazon-linux-extras install -y php7.3`
amazon-linux-extrasは、パッケージが集まっている場所

下記のコマンドでインストールされているphpにあった依存関係等を構築してくれる。
`sudo yum install -y php php-mbstring`

`cd ~`でルートディレクトリに移動する。
下記のコマンドでWordPressの最新版をダウンロードする
`wget https://ja.wordpress.org/latest-ja.tar.gz`
ダウンロードしたファイルは圧縮されているので、解凍する必要が有る。
`tar xzvf latest-ja.tar.gz`

解凍が完了したら、Apacheから見える所にファイルを配置する必要が有る為、
`cd wordpress/`でWordPressのディレクトリに移動する。
その後、下記のコマンドでファイルを移動する。
`sudo cp -r * /var/www/html/`
「/var/www/html/」はApacheが参照しているディレクトリ！
外部からアクセスされたら、ここのフォルダのデータが表示される。

下記のコマンドで、ファイルのアクセス権を変更する。
`sudo chown apache:apache /var/www/html/ -R`
すべてのファイルの権限をApacheにした。

下記のコマンドでApacheの実行状況を確認する。
`sudo systemctl status httpd.service`
現在、「実行中」なので、一旦再起動を行う。

もしも、起動していない場合は、下記のコマンドで起動する。
`sudo systemctl start httpd.service`

実行中だった場合は、下記のコマンドで再起動する。
`sudo systemctl restart httpd.service`

## WordPressの設定
1. ドメイン名にアクセス
2. WordPressの設定

### 設定
wp-config.php ファイルを作成していく。
Webページで作成する。

## TCP/IPプロトコルについて
### プロトコルとは？
コンピュータ同士がネットワークを利用して通信するために決められた約束事
### TCP/IPとは
インターネットを構築する上で必要なプロトコル群の総称
例）
アプリケーションプロトコル：HTTP,SMTP,FTP
トランスポートプロトコル：TCP,UDP
経路制御プロトコル：RIP,OSPF,BGP
インターネットプロトコル：IP,ICMP,ARP

### TCP/IPの階層モデル

| 階層 | 役割 | プロトコル例 |
|:-----------------: |:-----------------:|:-----------------:|
|アプリケーション層 | アプリケーション同士が会話する | HTTP, DNS, SSH, SMTP |
| トランスポート層 | データの転送を制御する | TCP, UDP |
| ネットワーク層 | IPアドレスを管理し、経路選択する | IP, ICMA, ARP |
| ネットワークインターフェイス層 | 直接接続された機器同士で通信する | Ethernet, PPP |

## HTTPについて
HyperText Transfer Protocol
インターネットでHTMLなどのコンテンツの送受信に用いられる通信の約束事
◼️クライアントがHTTPレスポンスを送り、
サーバーがHTTPレスポンスを返す。
### HTTPリクエストの中身
- リクエストライン
- ヘッダー
- ボディー
から構成される

### HTTPレスポンス
- ステータスライン
- ヘッダー
- ボディー
から構成される

### Chromeで確認してみる
見たいページで右クリックし、検証ページを開く
「Network」タブで見ると通信の中身が分かる

## TCPとUDPについて
トランスポート層とは
アプリケーショん間のコネクション確立や切断を担う
### TCP
Transmission Contorol Protocol
信頼性を保つために、送信するパケットの順序制御や再送制御を行う
信頼性のある通信を実現する必要が有る場合に使用する
◼️データの到達確認
送信したデータが届いたかを確認する
届いていれば再送する
確認応答とシーケンス番号を使用することで、再送制御などを行う
◼️コネクション管理
通信相手との間で通信を始める準備をしてから通信を行う。

### UDP
User Datagram Protocol
信頼性のない通信
高速性やリアルタイム性を重視する通信で使用する

コネクションレスな通信サービス

◼️特徴
アプリケーションから送信要求のあったデータをそのままネットワークに流す
コネクションレスなのでいつでもデータを送信できる
プロトコルの処理も簡単なので高速
◼️向いている用途
動画や電話など即時性が必要な通信
総パケット数が少ない通信(DNS)
特定ネットワークに限定したアプリケーションの通信

## IPについて
ネットワーク層の役割は、最終的な宛先のコンピュータに届けること

- ルーティング
　終点コンピュータまでのパケット配送
- パケットの分割
- 再構築処理

IPヘッダーに、送信元IPアドレスと宛先IPアドレスが含まれる


# 画像を配信する
## インフラ設計における重要なポイント

| 観点 | 内容 | 具体的指標 |
|:-------:|:-------:|:-------:|
| 可用性 | サービスを継続的に利用できるか | 稼働率・目標復旧時間・災害対策 |
| 性能・拡張性 | システムの性能が充分で、将来においても拡張しやすいか | 性能目標・拡張性 |
| 運用・保守 | 運用と保守がしやすいか | 運用時間・バックアップ・運用監視・メンテナンス |
| セキュリティー | 情報が安全に守られているか | 資産の公開範囲・ガイドライン・情報漏えい対策 |
| 移行性 | 現行システムの他のシステムに移行しやすくなっているか | 移行方式の規定・設備やデータ・移行スケジュール |

可用性が重要！

## 画像の保存場所をWebサーバーではなくS3にする理由
Webサーバーのストレージの画像で一杯になるのを防ぐ
HTMLへのアクセスと画像へのアクセスを分けることで負荷分散する
サーバーの台数を増やしやすくする
- 画像の保存場所は分離されていたほうがWebサーバーの台数を簡単に増やす事ができる。
コンテンツ配信サービスから配信することで、画像配信を高速化できる

## S3について
■特徴
安価で耐久性の高いAWSクラウドストレージサービス
0.023USD/GB・月 ⇒ 1GB約3円/月
容量無制限。1ファイル最大5TBまで

■重要概念
バケット
- オブジェクトの保存場所。名前はグローバルなユニークである必要が有る
オブジェクト
- データ本体。URLが付与される
- バケット内オブジェクトは無制限
キー
- オブジェクトの格納URLパス

## S3の良く有る利用シーン
- 静的コンテンツの配信
- バッチ連携用のファイル置き場
- ログなどの出力先
- 静的ウェブホスティング

## S3バケットの作成
パブリックアクセスをブロックしないを選択する。
⇒オブジェクトは公開可能となっているかを確認

IAMの追加を行う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/b28b7f25-127c-ec62-8c1d-2d12040429f2.png)

最後の確認画面のcsvは重要なので必ず保存する。

## WordPressの設定
以下の手順で進めます
1. プラグインのインストール
2. 必要なライブラリをEC2にインストール
3. プラグインの設定

WordPressの管理画面でプラグインの新規追加を行う
「WP Offload Media Lite for Amazon S3, DigitalOcean Spaces, and Google Cloud Storage」を選択する。

上記のプラグインを動作させるためのライブラリをEC2にインストールする。

`sudo yum install -y php-xml`
でライブラリをインストールする。
`sudo systemctl restart httpd.service`
でサービスを再起動し、ライブラリを読み込むようにする。

WordPressの設定画面で、「Offload Media」という物を選択し、S3へのアクセス設定例をコピーして、「wp-config.php」ファイルに追記する。

アクセスキーやシークレットキーは前述の手順でダウンロードしたcsvファイルの内容を利用する。
設定が完了し、再読み込みをするとWordPressの設定「Offload Media」のページが変更されている。

今回は、サーバーにファイルを残したくないので、「ADVANCED OPTIONS」の「Remove Files From Server」を有効にする。

## CloudFrontによる高速化について

### CloudFrontとはどういう物なのか？
高速にコンテンツを配信するサービス（CDNのサービス）

■ 概要
- CDN：Contents Delivery Network
- オリジンサーバー上にあるコンテンツを、世界中に100箇所以上有るエッジロケーションから配信
■ 特徴
- 高速：ユーザーから最も近いエッジサーバーから画像を配信する
- 効率的：オリジンサーバーに付加をかけずに配信できる

CloudFrontが有ることで、高速化され、S3の負荷が軽減される。

## CloudFrontから配信する
以下の順序で作業を行います。
1. ディストリビューションの作成

「Origin Domain Name」にS3のバケット名を記載する
「Origin Path」はバケット内のフォルダ等を指定する項目だが、今回は、指定しない。
CloudFrontからのみアクセスしたい場合は「Restrict Bucket Access」にチェックを入れる。
（今回は、S3との違いを比較する為に、Noのままを入れない）

Locationsは「Use All Edge Locations」にする。


## 独自ドメインから配信する
以下の順序で作業を行います。
1. Certificate ManagerでSSLサーバー証明書の発行
2. CloudFrontのディストリビューションに独自ドメインを登録
3. Route 53で独自ドメインとClooudFrontドメインのCNAMEレコードを作成する
4. Officed Mediaで独自ドメインを登録する


### SSL証明書を取得する
作成したCloudFrontのIDを選択し、Editボタンをクリックする。
「Request or Import a Certificate with ACM」をクリックして証明書を発行する。
ドメイン名の部分に「*.starbucksblog.tokyo」と指定し、全てのサブドメインに証明書を発行する。
「starbucksblog.tokyo」も下に追加します。（追加しないと、ドメイン本体に証明書が発行されない。）

続行をクリックすると、検証ページに移行し、DNSの設定を行う必要がある。
2つのドメイン共に一緒の値になっているはずなので、片方の設定を行う。

Route 53での設定ボタンを押す
続行を押す
AWSが検証を完了させるまで、待機します。

### CloudFrontの独自ドメイン 設定
作成したCloudFrontのIDを選択し、Editボタンをクリックする。
そこの「Alternate Domain Names」に配信したいドメイン名を記載する。
今回は、「static.starbucks.tokyo」を指定する。

SSL Certificateを「Custom SSL Certificate」を選択し、発行したSSL証明書を選択する。

その他はそのままで作成をクリックする。

### Route 53でCloud Frontのドメイン名を登録する
レコードの作成を選択し、作成する。
名前：「static.starbucksblog.tokyo.」
タイプ：「CNAME」
ルーティングポリシー：「シンプル」

### Offload Mediaの設定を行う
Word Pressの設定でOffload Mediaの設定画面を開く
下の方に「Custom Domain (CNAME)」という項目が存在するので、ONに変更し、「static.starbucksblog.tokyo」を入力し、設定を保存する。


# Webレイヤを冗長化しよう
Webサーバーを2台にしてELBを用いて冗長化する。

## 稼働率を上げる方法
■稼働率とは
障害発生間隔と平均復旧時間で構成されている。

稼働率を上げるためには、
- 障害発生間隔を長くする
- 平均復旧時間を短くする

そのための手法として、「冗長化」する必要がある。
単一障害点（SPOF）を無くす

SPOF：Single Point Of Failure

### 要素を組み合わせて全体の稼働率を高くする
◼️冗長化構成
Active-Active：冗長化した両方が利用可能
Active-Standby：冗長化した片方は利用可能
- Hot Standby：スタンバイ側は普段起動しすぐに利用可能
- Warm Standby：スタンバイ側は普段起動しているが、利用するのに準備が必要
- Cold Standby：スタンバイ側は普段停止している

### 負荷を適切なプロビジョニングで回避する
アクセス数などを予測し、適切にリソースを準備（プロビジョニング）ことで、負荷を捌けるようにする
- スケールアップ  
個々の要素の性能を向上させる  
ある程度の規模まではスケールアップがコストパフォーマンス的に良いが、一定範囲を超えると悪くなる
- スケールアウト  
個々の要素の数を増やす  
ある程度の規模を超えそうであれば、スケールアウトで対応する
最低限用意しておくべきなのがN +1構成、安全なのはN +2構成

## ロードバランサとは何か？
各サーバーにアクセスを振り分ける

### ELB（Elastic Load Balancing）とは何か？
ELBは、AWSクラウド上のロードバランサー

◼️特徴
- スケーラブル：ELB自体にも負荷に応じて自動でスケールアウト・スケールインする。
- アベイラビリティゾーンをまたがる構成：ELBを利用する場合、一つのリージョンを選び、そのリージョン内のアベイラビリティゾーンにまたがるように構成できる
- 名前解決：ELBにはDNS名が割り当てられる。ELBへの接続ポイントへのアクセスにはDNSを使用する（IPアドレスを使用すると自動でスケールできなくなる）
- 安価な従量課金：従量課金で利用可能
- マネージドサービス：運用が楽


#AMIからEC2を作成
以下の手順で行います
1. パブリックサブネットの作成
2. AMIの作成
3. AMIからEC2を作成

## パブリックサブネットの作成
VPCのサブネットの作成からパブリックサブネットの作成を行う
名前：aws-and-infra-public-subnet-1c
CIDR：10.0.11.0/24
サブネットの作成を行ったら、作成したサブネットを選択し、「ルートテーブル」のタブで「ルートテーブル関連付け」を選択

「aws-and-infra-public-route」を選択する。

## AMIの作成
EC2のページの「アクション」から、「イメージの作成」を選択する
名前を指定して、イメージの保存を行う。

AMIの作成が完成したら、「起動」ボタンを押す
インスタンスタイプは「t2.micro」を選択する。
その後、「次の手順」ボタンを押し、更に設定を行う。

ネットワーク：「aws-and-infra-vpc」
サブネット：「aws-and-infra-public-1c」
自動割り当てパブリックIP：「有効」
キャパシティーの予約：「なし」
プライマリIP：「10.0.11.10」
「次のステップ」へ
ストレージの設定はそのままで大丈夫

セキュリティグループの設定へ
「既存のセキュリティグループの利用」をチェックし、「aws-and-infra-web」を選択する。

「起動」ボタンを押下すると、セキュリティキーの設定が必要なため、「既存のキーペアの選択」を選択し、以前発行したsshキーを指定する。

## ELBで負荷を分散しよう
EC2のロードバランサーから作成する。
今回は、「Application Load Balancer」を選択する。
名前：「aws-and-infra-alb」
スキーム：「インターネット向け」

■アベイラビリティーゾーン
VPC：aws-and-infra-vpc
アベイラビリティーゾーン：1aと1cのそれぞれのPublicサブネットを指定する

セキュリティーグループの設定は以下の設定にする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/5543dc82-e683-0481-2ef8-c55e3272586e.png)

次のルーティングの設定を下記の設定にする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/57504c08-cfd9-8bb9-1abd-9f95cbc109c9.png)

ターゲットの登録に、起動中の２台を指定する。

## 独自ドメインにアクセスが来た場合にELBへアクセスするように変更する
Route53の設定を変更する。

Route53のコンソールにアクセスし、ホットゾーンの設定に行く
今はAレコードにEC2のパブリックIPが選択されている。
Aレコードの内容を編集していく
エイリアスを「はい」に変更する
指定する欄でalbを指定する。

変更を行う

## ELBを運用する際のポイント
- サーバーをアベイラビリティゾーンにまたがって配置する
- Webサーバーをステートレスに構築する  
　状態を持たないように構築する

# 【RDS】DBレイヤの冗長化
可用性の部分をここで扱う
DBサーバーをマスタースレーブ方式にする事で、DBの冗長化を行う

マスタースレーブの入れ替わりが発生した場合も、同じエンドポイントで接続できる為、操作を行う必要は無い。

RDSの設定を変更するだけで、変更が可能になる
2台分のRDSの料金が発生する。


# 【Cloud Watch】システムを監視しよう
「運用・保守性」の部分
監視して、通知しなければならない。

EC2のCPU使用率が60％を超えた場合、CloudWatchでアラームを出し、SNSで通知する構成を作る。

## システム監視について
システムを正常な状態に保てるように、稼働状況やリソースを監視すること

■ 目的
- すぐに障害発生を確認できるようにする
- 復旧にすぐに取りかかれるようにする
■ 中身
1. 「正常な状態」を監視項目＋正常な結果の形で定義する
2. 「正常な状態」でなくなった際の対応方法を監視項目ごとに定義する
3. 「正常な状態」であることを継続的に確認する
4. 「正常な状態」でなくなった場合には通知が来るようにし、すぐ「正常な状態」に復旧させる

■ 監視の種類
- 死活監視  
　正常にシステムが動作しているかを確認
- メトリクス監視  
　パフォーマンスを定量的に確認  
　指標を決め、指標が閾値以上・以下となっているかを把握

■ 監視のポイント
1. システムや利用状況は変わるので、足りない監視を都度足していく
2. 最初は基本的な要素でOK
※注意点：CloudWatchだとメモリの監視ができない

## CloudWatchについて
AWSサービスの監視モニタリングができるサービス

■ 概要
AWSサービスのメトリクス（リソースの状況）を監視する
メトリクスに対して閾値を登録し、その条件を満たしたら通知する

## CloudWatchの設定
以下の流れで設定します。
1. CloudWatchのアラームを作成
2. アラートを確認

# IAMについて
セキュリティーの部分

AWSのサービスを利用するユーザー権限を管理するサービス
■ 概要
- AWSリソースをセキュアに操作するために、認証・認可の仕組みを提供する
- 各AWSリソースに対して別々のアクセス権限をユーザー毎に付与できる
- AWS IAMの利用料は無料

■ 用語
- ポリシー  
 アクセス許可の定義
- ユーザー  
 個々のアカウントのユーザー
- グループ  
 IAMユーザーの集合体。  
 複数のユーザーにアクセス許可を付与する作業を簡素化
- ロール  
 一時的にアクセス許可したアカウントを発行できる。  
 EC2やLambdaなどのAWSリソースに権限を付与する為に使用 → AWSのサービスに権限を付与するときに利用する


# IAMのベストプラクティス
- 個々人にIAMユーザーを作成する
- ユーザーをグループに所属させ、グループ権限を割り当てる
- 権限は最小限にする  
　必要に応じて足していく
- EC2インスタンスから実行するアプリケーションには、ロールを使用する
- 定期的に不要な認証情報を削除する

# 今後に向けて