RailsをAWS上への構築におけるAWSの基礎についてまとめてみました

rails学習のため、herokuではなく、AWS上での構築を試みました。その際に、AWSの基本的なことへの理解を含めて、メモとしてここに残しておきます。

#AWSネットワークの概念
##リージョン
AWSサービスが提供されている地域のこと

##VPC
他ネットワークと分離する仮想ネットワーク環境を作成するためのサービス

##アベイラビリティゾーン
独立したデータセンターのこと。災害が発生して、一つのデータセンタがダメになっても、サービスが提供し続けるように一つのリージョンの中で最低二つのアベイラビリティゾーンが存在する		

##サブネット
VPCを細かく区切ったネットワーク。WEBサーバーを公開する、DBサーバーを公開しないなどの目的で使用

##VPC、リージョン、アベイラビリティゾーン、サブネットの関係性（ベストプラクティス）
リージョン→VPC→アベイラビリティゾーン→サブネット→AWSサービス(WEBサーバ)→サブネット→AWSサービス(DBサーバ)

アベイラビリティゾーン→サブネット→AWSサービス(WEBサーバ)→サブネット→AWSサービス(DBサーバ)			
※災害が発生して、一つのデータセンタがダメになっても、サービスが提供し続けるとの考え方　　　　　　

##IPアドレスの種類
パブリックIPアドレス：インターネット上に接続するための重複しないアドレスのこと
プライベートIPアドレス：	インターネットでは使用できず、社内LANや実験用で使用するアドレスのこと
	10.0.0.0~10.255.255.255
	172.16.0.0~172.31.255.255
	192.168.0.0~192.168.255.255

＃IPアドレスの範囲表記法
IPアドレス＝ネットワーク部＋ホスト部

例：
192.168.128.0
11000000.10101000.10000000.00000000

ネットワーク部：11000000.10101000.10000000
ホスト部：00000000
※ホスト部が8桁なので、256個のIPアドレスが使用できる

###CIDR表記
ネットワーク部の桁数を表記する
　→192.168.128.0/24
サブネット表記：ネットワーク部の桁を1で埋めて、１０進数で表記する
　→192.168.128.0/255.255.255.0

##VPCとサブネットのIPアドレスの設定例
VPCのネットワーク：10.0.0.0/16
サブネット（WEBサーバー）のネットワーク：10.0.10.0/24
サブネット（DBサーバー）のネットワーク：10.0.20.0/24
※サブネットのネットワークがVPCのIPアドレスに含まれる


##ルーティング
ルートテーブルはVPCやサブネット単位で設定可能
サブネットにルートテーブルをつけることで、暗黙的にサブネットとインターネットゲートウェイにルーターを設置することになる。	

VPCのデフォルトルートテーブル
送信先,ターゲット
10.0.0.0/16,local
　→0.0.0.0/16以外の送信先は破棄する

送信先,ターゲット
10.0.0.0/16,local
0.0.0.0,インターネットゲートウェイ	
　→10.0.0.0/16以外の送信先はインターネットゲートウェイに転送
　→インターネットゲートウェイとは、AWS上の擬似ルーターのこと

##VPC上でのネットワーク作成手順
VPCを新規作成
サブネットを新規作成（パブリックとプライベート）
インターネットゲートウェイを新規作成
新規作成されたインターネットゲートをVPCにアタッチ
ルートテーブルを新規作成
パブリックサブネットに関連づける
ルートテーブルを編集（0.0.0.0→インターネットゲートウェイのルーティング処理を追加）
　→ここでは、パブリックサブネットからインターネットへのアクセスが可能となる	

##AWSネットワークの設計ポイント	
####パブリックアドレスではなく、プライベートアドレスを使用した方が良い
####サブネットの分割：ルーティングポリシーやアベイラビリティゾーンでの観点で考える
　→インターネットのセキュリティを考えて、パブリックとプライベートサブネットを分ける
　→冗長性を考慮して、それぞれのアベイラビリティゾーンにサブネットを分けて設置する異なるシステムの場合は、アカウントを分けた方が良い
　→システムごとに経費の計算ができるため
　→異なるシステム担当者が自分担当以外のシステムの設定を変更できなくなるため
同じシステムで異なる環境（本番環境、ステージ環境）場合、VPCかリージョンで分けたようが良い
　→IAMユーザなどを別途作成しなくても済むため。PCで管理画面で煩雑になる場合、リージョンで分けた方が良いオンプレや他のVPCでプライベートIPアドレスを重複で設定しないようにする
　→社内オンプレからVPCへVPNなど接続する場合、プライベートIPアドレスが重複する可能性がある
####VPCのネットワーク範囲を大きめの16で設定するのがおすすめ
####サブネットのネットワーク範囲も大きめの24で設定するのがおすすめ
　→1IPアドレス/1インスタンスのため、アクセス数増に対して、インスタンスを増やせるようにするため。（スケーリング対応のため）

##EC2の概念
AWS上立てる仮想サーバーのこと
AMI：サーバーのテンプレートのこと
インスタンスタイプ：サーバーのスペックのこと
ストレージ：データの保存場所のこと
　EBS：永続データをおく。インスタンスを終了すると、データが消えない
　インスタンスストア：一時的なデータをおく。インスタンスを終了すると、データが消える

##EC2（WEBサーバー）の構築手順
・AMIを選択：基本的にamazon linuxを選択
・インスタンスタイプを選択
・インスタンスの詳細設定
　配置グループ：複数のインスタンス間の通信を早くするためのオプション　チェックなし
　スポットインスタンスのリクエスト：より安価で常時起動じゃないインスタンス作成のオプション　チェツクなし
・キャパシティの予約：アベイラビリティゾーンごとにリソース上限を超える場合、事前にリソースを確保してくれる機能（常時課金のため、チェックなし）	
・IAMロール：EC2が他のAWSサービスと連携時の権限設定　チェックなし
・削除保護の有効化：本番環境ですることが多い
・モニタリング：通常５分間隔の監視サービスを１分間隔に変更する　別途課金のため、チェックなし
・テナンシー：リソースを専用するか共有するかの設定　共有で選択
・Elastic Infrenece：機械学習でGPUを使用する場合で、コスト効率を高くする際に使用するため、チェックなし
・T2/T3無制限：T2/T3では、バーストモードとの落とし穴がある。無制限にすると、バーストモードを無制限にすることができる
・プライベートIPアドレス：10.0.10.10
・高度の詳細：インスタンス実行時のスクリプトを指定
・ストレージの追加　
　デバイスタイプ：OSが入っている場合、ルートがデフォルトで設定される
　　　　　　　　　AMIの設定でデフォルトがEBSとなる
　　　　　　　　　ボリューム追加時、EBSかインスタンスストアか指定できる
　デバイス：デバイスタイプがルートの場合、自動的に/dev/xvdaとなる
　　　　　　デバイスタイプがEBSかインスタンスストアの場合、選択できる
　ボリュームタイプ：通常では、汎用SSDが良いがDBサーバーなど高いIOが必要な場合、プロビジョンドIOPS SSDどの方が良いマグネティックは、低いIOで問題ない場合に選択
　IOPS：プロビジョンドIOPS SSDの場合のみ、選択可能。そのパフォーマンスを指定するためのもの
　スループット：一秒間のデータ転送速度
　合わせて削除：インスタンスを削除じ、EBSも削除するための設定
・タグの追加　
・セキュリティグループを作成する　
　SSHのアクセスできIPを指定。0.0.0.0で制限なしにする
・新しいキーペアの作成して、ローカルPCへ保存
　キーペアとは、インスタンスをSSHでログイン時の鍵情報

##EC2（WEBサーバー）へソフトウエアのインストール
pemファイル(秘密キー)の権限を変更する
　chmod 600 ファイル名　
sshでEC2（WEBサーバー）にログインする
　EC2のパブリクIPを取得してコピーする
　ssh -i pemファイル ec2-user@パブリクIPアドレス
exit

##ポート番号
ポート番号とは、プログラムのアドレスのこと
静的ポート番号：0~1023
動的ポート番号：サーバが決める
sudo lsof -i -n -p
 ->どんなプログラムがどんなポートで待ち受けているのかを表示する
   LISTEN：待ち受け中のポート
   ESTABLISHED：接続中のポート

##EC2にapacheをインストール
sshでEC2にログイン
yumツールをアップデート
　sudo yum update -y
apacheを構成する実行ファイルをインストール
 sudo yum -y install httpd 
apacheを起動する
 sudo systemctl start httpd.service
起動確認を行う 
 sudo systemctl status httpd.service
 ps -axu
apacheを自動起動するように設定
 sudo systemctl enable httpd.service

##ファイアウオールとセキュリティグループの概念
セキュリテイグループはファイアウオールのことで、通して良いポートを指定する
　インバウンド設定；通したいポートのみ設定
　　デフォルトでは、ポート番号22しか通していない
　アウトバンド設定；全てのポートを開放する設定が多い

##ファイアウオールの設定
セキュリティグループでインバウンドルールを編集
　http 80

##Elastic IP アドレスの概念
通常の動的IPでは、インスタンスが起動・停止するたびに、パブリックIPが変わるため
Elastic IP アドレスを利用することで、パブリックIPをEC2インスタンに固定させることができる
料金方式：EC2インスタンスに関連づける際には無料。それ以外は課金のため、開放するように注意が必要

##Elastic IP アドレスをEC2インスタンスへの関連付け
ElasticIpページで新しいアドレス割り当てを行う
アクションでアドレスの関連付けを行う
　インスタンスとプライベートIPを指定
アクションで関連付けの解除を行う　
　解除することで課金がなくなる

##ドメインを登録（Route53）
DNSの仕組み　
　ネームサーバ：ドメイン名でIPアドレスを返す
　フルリゾルバ：秘書
クライアント→フルリゾルバ→ネームサーバ
　（階層ごとに管理されている）
特徴
　高可用性　
　高速：エッジローケーションの中から一番近いローケーションから返答を返す
　フルマネージド：維持管理が不要
　AWSのその他サービスとの相性が良い（EC2,ロードバランサーなど）

##RDSの概念
RDSとは、AWSが運用管理してくれるリレーションなるデータベースのサービス
  OSのアップデータ、データベースのバックアップ、スケーリングもAWSが全部やってくれる
RDSの特徴
　高い可用性
　　簡単にマルチAZで対応可能
　　AZ1のRDS→AZ2のRDS（レプリケーションを実行）
　パフォマンスの向上
　　リードレプリカを簡単に構築
　　読み書きRDSと読み取り専用RDSを分けることでパフォマンス向上
　　読み書きRDS→読み取り専用RDS（レプリケーションを実行）
　運用負荷の軽減
　　自動的なバックアップ（1日1回で、バックアップしたスナップショットでDBインスタンスを作成できる）
　　自動的にソフトウエアアップデートしてくれる
　　監視間隔を60秒間隔での取得が可能

##RDSの作成手順
マルチAZ用のサブネットを新規作成（10.0.21.0/24）
EC2からのRDSのセキュリティグループ（ファイアウオール）を新規作成
　インバウンドルールを追加
　　タイプ：MYSQL/Aurora
　　ソース：以前設定したWEBサーバーのセキュリティグループ（カスタム）
RDSのダッシュボードに移動
サブネットグループを新規作成
　サブネットを追加（マルチAZのため、合計二つ　10.0.20.0/24 と 10.0.21.0/24）
  作成ボタン押下
パラメタグループを新規作成
　パラメタグループファミリ：mysql8.0
　値を編集したい場合、アクションで編集
オプショングループの新規作成
　エンジン：mysql 8.0
データベースの作成
　エンジンのタイプ：mysql 8.0.15(最新版)
  テンプレート：開発テスト（本来であれば、本番用）
 　DBインスタンスサイズ：バースト可能クラス（本番では、標準クラスの方が良い）　db.t2.micro
 　自動スケーリング：チェックなし
 　パブリックアクセス可能：チェックなし
 　バックアップ期間：30日

##RDSでWEBサービス用のデータベースを作成
sshでEC2にログイン
ECS2からRDSへmysqlコマンドで接続する

##TCP/IPの概念
アプリケーション層
　アプリケーション同士間の会話を実現する
トランスポート層
　役割：大きいな送信データを複数の小さなパケットに小分けして、データ通信の制御を行う
　　TCP：コネクションの制御、データの到達確認で、信頼性の必要な通信に向かう
　　UPP：コネクションの制御やデータの確認を行わないため、信頼性が必要なく即時性が必要な通信に向いている動画や電話など）
ネットワーク層　
　役割：IPアドレスの管理、経路選択
ネットワークインターフェース層
　役割：直接接続されている機器同士間の通信を行う

##インフラ設計のポイント
可用性：サービスが継続的に利用可能か。稼働率、目標復旧時間
拡張性：将来的に拡張しやすいか。
運用保守性：保守がしやすいか。運用にかかる時間など、運用の監視
セキュリティ：情報が安全に守られているのか。資産の公開範囲など
移行性：

##画像保存サーバをWEBサーバーではなく、S3にする理由
WEBサーバーのストレージがいっぱいなることを防げる
htmlへのアクセスと画像へのアクセスを分けることで、負荷を分散できる
サーバー台数を増やしやすい
　WEBサーバーに画像を置くと、スケーリングするたび、画像も同期しないといけないため
コンテンツ配信サービス（CloudFront）を利用すること、画像配信の高速化が実現可能

##S3の概念
バケット：ファイルの保存場所
オブジェクト：ファイルの本体
キー：オブジェクトの保存先URL

##S3の利用手順
S3ダッシュボードでバケットを作成
IAMユーザを追加
　アクセス許可：AmazonS3FullAccess

##稼働率を上げるポイント
要素単体の稼働率を高めること
要素を組み合わせることで、全体の稼働率を高める
　冗長化とは、システム構成要素を多重化することで、障害が発生しても処理を引き継げて稼働率を高めること
　単一障害点（SPOF Single Point Of Failure）をなくすこと
　冗長化の種類
　　active-active：冗長化の両方が利用可能
　　active-standby：冗長化の片方が利用不可
　　　hot-standby：普段起動してすぐ利用可能な状態
   　warm-standby：普段起動しているが、利用するには準備が必要
   　Cold-standby：普段停止している
 負荷を適切なプロビジョンリングで回避
 　プロビジョニングとは、アクセスを予測して、適切にリソースを準備すること
 　スケールアップ：要素の性能を高めること
 　　　　　　　　　ある程度の規模まではコスパ良いが、一定範囲を超えるとコスパが悪くなる
 　スケールアウト：要素の数を増やすこと
 　　　　　　　　　
##サーバ構成のベストプラクティス
パターン１：WEBサーバー1台とDBサーバー1台 　
パターン２：WEBサーバー2台とDBサーバー1台 　
		　WEBサーバーの性能が足りない時、WEBサーバーを複数台を使用する　
パターン3：WEBサーバー2台とDBサーバー２台
　　　　　　DBをマスタ→スレーブにすることで、DBの冗長化を行う 　


##ELBの概念
ロードバランサーとは、各WEBサーバーへアクセスを振り分け、負荷を分散するための装置
ELB(AWS上のロードバランサー)：複数のアベイラビリティゾーンの複数のEC2インスタンスの中の正常のインスタンスのみ振り分ける　（セルフチェック）	

##ELBの構築手順
パブリックサブネットを作成
既存のWEBサーバーEC2からAMIを作成
新規作成されたAMIで、もう一台のWEBサーバーのEC２インタンスを作成
　->EC2インスタンを複製するため
EC2ダッシュボードでロードバランサーを作成
　通常はALBを選択（NLB高いレスポンス要件を求める場合に選択）
　セキュリティグループを新規作成（httpアクセスをfulloopen）
ブラウザで、ELBのDNS名にアクセス確認
ROUTE53のドメイン設定の見直し
　EC2の独自ドメインへのアクセスが来た場合、ELBへのアクセスするように制御する
　ホストゾーンを編集して、エリアスを修正

##RDSのマスタスレーブ構成の作成手順
EDSのダッシュボードでマルチAZをONに変更して保存（すぐに適用）

##システム監視とCloudWatch
運用の保守性おける視点

#システムに負荷をかける方法
yes > /dev/null &&
　5回繰り返し
top
ps -aux 
  CPUの使用状況を確認
kill -9　プロセスID 
  プロセスを停止させる

##IAMの概念
インフラ設計観点：セキュリテイ
IAMとは、AWSリソース（各AWSサービス）の利用権限を管理するサービス
ポリシー：AWSサービス一つ一つに対して、アクセス許可の定義
ユーザ：個々のユーザアカウント
グループ：ユーザの集合。複数ユーザへアクセス権限の付与作業を簡潔
ロール：一時的にアクセス権限を許可するアカウント
関係：
　ポリシー→グループ→ユーザ
　ポリシー→ロール
　　例：EC2でS3のサービスを利用時、aws s3 ls 実行時ロールの設定が必要