「AWSエンジニア入門講座」を読んで

こちらの記事は随時更新中

# AWS とは
三大クラウドサービスの一つ。他に「Azure」、「GCP」がある。
物理的に自社でサーバーを用意する必要のあるオンプレミスとは違い、インターネットを通じて利用できるサービス。
特徴は`従量課金方式`で使用した分だけお金の請求がされる。また設定の変更が柔軟で容易であるため、変化の速いビジネスチャンスにも即座に対応可能である。

## AWS 設計原則、考え方
下記5つの柱からなる原則を順守しなければいけないわけではないが高い安全性や障害体制、効率性を備えたAWSが提供するアプローチである。

### AWS Well-Architected フレームワーク
#### 1, 運用上の注意
運用手順の自動化。変更は小規模に。障害への対策を常に行う。

#### 2, セキュリティ
利用者ごとの権限は最低限にとどめる。OS、アプリケーション、コードなど全レイヤーにセキュリティの適用。設定履歴、アクセスログをモニタリング。

#### 3, 信頼性
復旧を自動化。リソースの増減に柔軟に対応する。単一障害点を防ぐ。復旧手順をテストする。

#### 4, パフォーマンス効率
最適なコンピューティングリソースを選択。リソースの使用率から最適なものを選択。

#### 5, コスト最適化
リソースは必要最低限にする。マネージドサービスを利用して運用コストを削減する。コスト管理サービスを利用して使用状況の把握。

## リージョン、AZ、エッジロケーション
#### リージョン
データセンターが集積した物理的な場所。世界に25か所存在。日本には大阪と東京。
どこかのリージョンで障害が発生しても他のリージョンは動くので継続してサービスが利用できる。耐障害性を実現。

#### AZ
アベイラビリティーゾーン。リージョンはこの複数のAZから構成されている。リージョンと同様に別のAZで災害が起きてもサービスの継続は可能。AZも物理的に離れている。
各AZは専用線でつながっている。複数のAZにアプリケーションを冗長化して高い可用性を実現する構成を「`マルチAZ`」という。(基本的なベストプラクティス)

#### エッジロケーション
AWSのサービスの一つである`CroudFront`はこのエッジロケーションを利用している。高速にコンテンツを届けるCDNサービスを提供する為の拠点。
※`CroudFront`とはコンテンツ(.html, .css, .js, イメージファイル等)の配信を高速化するサービス

# Amazon EC2
AWSが従量課金制なのは先にふれたがEC2も同様。使用した時間、EC2のスペックに比例して課金されていく。`Amazon EC2 Auto Scalling` と組み合わせることが多い。
`Amazon EC2 Auto Scalling`とはCPU使用率などのメトリクス(需要)に応じてサーバー台数を増減するサービスのこと。
インスタンスタイプというものが存在し、「汎用」「コンピューティング最適化」「メモリ最適化」「高速コンピューティング」「ストレージ最適化」の五種類からなる。
よく初心者用のサイトや参考書でみられる`t2.micro`は「汎用」タイプにあたりコンピューティング、メモリ、およびネットワーキングリソースをバランスよく備えており、広範囲のワークロードに使用できるとのこと。
作るシステム、サービスによって五種類のうちのタイプから選ぶのを推奨している模様。

# AMI
EC2を構築する際に必要となる設計書のようなもの。
独自に作成することもでき、OS情報の変更やソフトウェアのインストールがテンプレートとしてまとめてあり、この設計図を基にEC2インスタンスが構築される。

# ユーザーデータ
ユーザーデータとはEC2インスタンスの初期設定で使用されるテキストデータ。EC2インスタンス初回起動時にユーザーデータ内に記述されているShellscriptを実行してくれることで自動化が可能に。(OS情報の変更やソフトウェアのインストールが自動化できる)

### ゴールデンイメージ方式とユーザーデータ方式

#### ゴールデンイメージ方式
すべての設定が済んだAMIからEC2を起動する方法のこと。すでにソフトウェアのインストール等が済んでいる為、素早くインスタンスを用意することが可能。しかし管理が面倒くさくなる。EC2に新しい設定を反映させるたびに新しいAMIを取得する必要があり。将来、変更する必要性がないものはこちらの方式で作るとよい。

#### ユーザーデータ方式
空のインスタンスに対してユーザーデータを使用してEC2の設定を行っていく方法をユーザーデータ方式という。ユーザーデータで反映させた設定をいつでも確認できるため管理が楽。一方で逐一、起動時にユーザーデータに記述したスクリプトを実行するため、インスタンスが利用できる状態になるまで時間がかかる。頻繁に変更する可能性の高いものはこちらの方式で作成するとよい。


# EBS

EC2インスタンスにアタッチして使用されるブロックストレージサービス。
家庭用PCで使用されるHDD、物理ストレージに該当する。EBSには二つのタイプが存在する。

#### ・SSD
サイズの小さいI/O操作を比較的、高頻度で処理する場合に必要。主にデータベースやアプリケーションで使用される。

#### ・HDD
サイズの大きいI/O操作を行うときに使用する。主にデータサイズの大きいログ処理やビッグデータ向けのデータストアなどで使用される。

## RAID
複数のSSD/HDDを一つのストレージとして見せる技術。これにより可用性や処理の高速化を実現できる。
RAIDには下記のようにいくつかの種類がある。

#### ・RAID 0
データをブロック単位に分割し、複数台のドライブに分散して保管。(ストライピング)

#### ・RAID 1
データをブロック単位に分割し、複数台のドライブにコピーして保管。(ミラーリング)

#### ・RAID 5
ストライピング + パリティコードを各ドライブに配置。パリティコードとはエラー修復用のコード。

#### ・RAID 6
RAID 5 とほぼ変わらないがパリティコードを各ドライブに複数設置。


## スナップショット
データのバックアップ。バックアップの取得方法には下記の3種類が存在する。

#### ・フルバックバックアップ
すべてのデータをバックアップ取得するたびに完全に複製する方法。時間がかかるが、一か所にバックアップの全データが保管されているので復旧が簡単。

#### ・差分バックアップ
フルバック以降、変更されたすべての部分を完全に複製する。複数バージョンを作るとデータ容量を圧迫しがちだが最新の変更分と最初のフルバックアップで復旧が可能に。

#### ・増分バックアップ
変更した分だけ複製する方法。複数の変更履歴が存在するとき、すべての変更履歴を参照して復旧する。

## クラスタリング
複数台のサーバーを連結し一つの大きなサーバーに見せること。冗長化を高めて障害に備える。クラスタを構成する各サーバーのことをノードと呼ぶ。
可用性を高めることを目的にしたクラスタリングで「フェイルオーバークラスタ」と「負荷分散クラスタ」が存在する。

#### フェイルオーバークラスタ
稼働中のサーバーが停止した場合、他のサーバーに処理を引き継がせる(フェイルオーバー)

#### 負荷分散クラスタ
ロードバランサーがクライアントからのリクエストをどのサーバーに任せるか決定しリクエストを振り分ける。アクセスによる過負荷を回避。

## ストレージの種類
#### ブロックストレージ
ストレージをボリュームという単位に分割、さらに最終的にブロックという単位に分割してデータを管理する。大容量のデータを高速に転送できる。主に低遅延を求められるデータベースシステムや業務システムに用いられる。

#### ファイルストレージ
ファイル形式でデータを管理する方式。ディレクトリを用いて階層的にデータを管理できる。ブロックストレージに比べて処理速度は遅い。

#### オブジェクトストレージ
ドキュメントや画像、音声データなどの非構造化データをオブジェクトとして扱うストレージ。HTTPプロトコルを基にしたAPIを利用してオブジェクトにアクセスする。データのアクセス速度は最も遅い。しかし容量の拡張性に優れている。ファイルストレージと違って階層化されえいないので。主にアプリケーションログや更新頻度の北緯大容量データの保管場所として用いられる。
 

## キーペア
AWSで使用される認証形式。第三者から解読不可能な文字列に置き換える暗号化や暗号化された文字列を基に戻すために複合化を行う。AWSでは公開鍵暗号方式が採用されている。

#### 公開鍵暗号方式
公開鍵を秘密鍵を利用してデータの暗号化、複合化を行っていく。公開鍵は情報の送信者が持つ鍵のことで送信者はこのカギを使用して情報を暗号化していく。一方秘密鍵は、情報の受信者のみしか持つことを許されないカギで受け取った情報を秘密鍵を使って複合化していく。
ちなみに公開鍵で暗号化した情報は公開鍵で複合化することはできいので複合化して情報を解読できるのは秘密鍵を持っている受信者のみとなる。
設定方法としては受信者が公開鍵と秘密鍵をローカルで作成し、公開鍵のみを送信者に与える。

## Amazon S3
ストレージサービス。画像など静的なコンテンツを保管するのに使用される。Webサーバーのように利用することも可能。

#### inteligent-tiering
アクセス頻度に応じてどのストレージ階層にコンテンツを配置するのか振り分けられる。コスト効率化に役立つ。例えば、30日間アクセスがないオブジェクトを低頻度階層に移動させるなど。

#### バケットポリシー
データが格納されているバケットに対してアクセスするための制約を設定できる。

#### Transfer Acceleration
通常、インターネットを通してS3バケットにデータを転送するがロケーションによっては大幅に時間が掛かってしまう。そこでエッジロケーションを使用して転送の高速化を実現。

# Amazon VPC
仮想ネットワークサービス。通常、この空間をさらにサブネットという空間に切り分ける(IPアドレスの範囲で指定)。VPCの中に複数AZが存在し、AZにそれぞれサブネット環境を用意。
サブネットにはインターネットに接続されているものをパブリックサブネット、接続されていないものをプライベートサブネットと呼ぶ。

#### ルートテーブル
分割したサブネットごとにルートテーブルというものが存在し、他のネットワークへ接続する際のルート情報がまとめられている。

#### インターネットゲートウェイ
インターネットへの接続口。インターネットに接続されたサブネットのことをパブリックサブネットと呼ぶ。

#### NATゲートウェイ
通常自身のIPアドレスを通信の際に相手に渡すことでやり取りが可能となる。なので通信相手がまるわかり状態。自身のIPアドレスを他のIPアドレスに見せかける技術のことをNATと呼ぶ。この技術を利用してプライベートサブネットからインターネットに通信できるようにする。しかしこれはアウトバンドトラフィック(プライベートサブネットからインターネットへの通信)の時のみ可能であり、インバンドトラフィック(インターネットからプライベートサブネットへの通信)は行えない。

#### セキュリティグループ
インバウンド、アウトバウンドトラフィックを制御するファイアウォール。EC2毎に設定されステートフル。

#### ネットワークACL
セキュリティグループと同様にトラフィックを制御する。サブネットごとに設定されステートレスなため、インバウンドとアウトバウンドトラフィック、どちらに対しても設定を施す必要があり。セキュリティグループよりこちらの設定のほうが優先される。


#### VPCエンドポイント
VPCの内側に存在するインスタンスからVPCの外側に存在するサービス(例：S3)に通信する場合、通常はインターネットを通して通信する必要があるがVPC上にエンドポイントを設置することで、インターネットを通す必要がなくなる。インターネット通信を通すことは安定性に欠けるため、避けるべき。



## Route53
AWSが提供するDNS(Domain Name System)。AWSには権威DNSサーバーとしても、フルサービスリゾルバとしての機能も持つ。
※自身でIPアドレスとドメインを管理するのが権威サーバー。自身では管理せず、他のDNSサーバーに問い合わせて解決を図るのがフルサービスリゾルバ。

#### ヘルスチェック
サーバーやアプリケーション、そのほかのリソース等の正常性をモニタリングする。ELBで行われるヘルスチェックと併用して行うことで素早いシステム障害の見地につながる。
ヘルスチェックの方法としては対象のリソースに実際にリクエストを飛ばす方法や他のヘルスチェック機能を監視する方法、cloudwatchアラームをモニタリングする方法が挙げられる。

## CloudFront
AWSのCDNサービス。Webサイトに必要なコンテンツを高速に配信するサービス。エッジローケーションを使用して実現している。コンテンツを保管しているサーバーを`オリジン`といい、エッジロケーションに保管されているコピーされたコンテンツを`キャッシュ`という。

#### Behavior
エッジロケーションに存在するキャッシュの`TTL`(time to live: 生存期間)を設定するための機能。
CloudFrontにリクエストが飛んできた際にエッジロケーションのキャッシュを配信することで高速化を実現していたが常にオリジンにあるコンテンツとエッジロケーションに存在するキャッシュは常に同じであることはないのでTTLを使用して定期的にオリジンのコンテンツにリクエストを飛ばせるようにする。

#### キャッシュポリシー
キャッシュの設定を毎回行うのは大変なのでユースケースごとに管理できるのがキャッシュポリシー。これにより複数のBehaviorで同じキャッシュポリシーを設定することが可能になる。よく使用されるキャッシュポリシーはデフォルトとしてすでに用意されている。

## ELB
受け取った通信を複数のターゲットグループに振り分ける機能。負荷分散の役を担っており耐障害性の向上を実現。単一障害性の回避。

#### スティッキーセッション
アプリケーションによってはログインしたユーザーの情報をセッション情報としてEC2に保管した場合、ELBで振り分けると別のEC2インスタンに通信が振り分けられることもあるため、認証処理ができなくなる。スティッキーセッションでは特定のユーザーからのリクエストは同じターゲットグループに処理を振り分ける機能を実現し、サーバー側にセッションが保管される前提のアプリでも問題なくなる。

・期間ベース
> スティッキーセッションの仕組みの一つ。ELB(ALB)がcookieを生成し、クライアントへ返す。以降、クライアントから送られたCookieを複合し、振り分ける先のターゲットグループを選定する。

・アプリケーションベース
> ELBが最初に割り振った先のアプリケーションがcookieを生成してクライアントにELBを通じて返す。この時、ELBはcookieを暗号化しクライアントに渡す。以降は期間ベースと同じ。


#### ヘルスチェック
ELBにもRoute53と同様にヘルスチェック機能を搭載。基本的にターゲットの応答を鑑みて通信を行うか決めているがELBの場合、Auto Scalingグループと連携ができるのでヘルスチェックの結果によって異常なインスタンスの停止や追加インスタンスの起動が可能。
※Route53はELBに対してもヘルスチェックが可能

## IAM
AWSへの認証、サービスへの認可(操作権限)を制御する。

#### IAMユーザー
名前と様々な認証情報でログインが可能に。IAMユーザーの使いまわしはアンチパターン。一方、ルートユーザーはAWSアカウント発行時に最初に作成されるアカウントですべてのリソースへの操作権限が含まれている。
IAMユーザーグループといって複数のIAMユーザーの集合を作ることができ、設定したIAMポリシーをIAMユーザーグループに一括で付与することも可能。

## CloudWatch
システム状態をリアルタイムで監視し、指定した条件に当てはまっているか否かで障害を検知する。検知した際には管理者への通知機能やサーバー台数の増減などアクションを実行することも可能。
どの箇所で障害が発生しているかは名前空間とメトリクスとディメンションから特定することが可能。(EC2で障害が発生しててもインスタンスが複数台ある場合、上記の情報がないとどのインスタンスで障害が起きているのか不明)

## AWS Lambda
サーバレスを実現する。サーバーやミドルウェアの管理はAWSが行ってくれる。実行環境を用意せずに各サービス(API Gateway, Route53, S3など)との連携や実行したい関数を定義しておけばよい。

※全然わからん。。。

## Amazon RDS
クラウド上で提供されるフルマネージド型のRDBMSサービス。スナップショットをS3に保存可能。

#### リードレプリカ
読み取り専用のデータベースを複製することで読み取り能力の向上を実現。読み取り専用と書き込み専用のデータベースを作成することで負荷分散ができる。

## CloudFormation
IaCツールのうちの一つ。Iacを利用することによって手作業によるミスの削減、管理の容易化、バージョン管理が可能になる。CloudFprmationで設定するために使うのは設定条件をコードに落としたYAMLファイル形式かJSON形式。