基本的なシステム構成図を理解するためのAWS基礎をまとめてみた

# はじめに
最近、AWSのシステム構成図を見ることが多くなり、AWS上で動いているシステムのシステム構成図を理解できるようになるために個人的に知っておきたいと思ったAWSの用語・サービスをまとめてみました。
私自身も勉強がてら作成したので、わかりづらい部分も多くあると思いますが、AWSのサービス全くわからん→なんとなく雰囲気把握した、となっていただけたらと思います。
2018年10月に新しくなった[AWSアーキテクチャアイコン](https://aws.amazon.com/jp/architecture/icons/)を使用しています。

サーバ・クライアントなどの説明についてはここではしていませんが、以下の記事でとてもわかりやすくまとめてくださっています！
[超絶初心者のためのサーバとクライアントの話](https://qiita.com/shuntaro_tamura/items/ae55b99deb9e2a170754)

# 知っておきたい用語
## リージョン
- AWSがサービスを提供している拠点（国と地域）
- リージョン同士はそれぞれ地理的に離れている（例えば日本とオレゴンとか）
- 日本はap-northeast-1（リージョン名はアジアパシフィック（東京））

## アベイラビリティゾーン
- リージョン内のさらに細かい拠点
- 1つのアベイラビリティゾーンは複数のデータセンターから構成されている
- ap-northeast-1には3つのアベイラビリティゾーンがある（a,c,d なぜかbが無い）
- ごく稀にアベイラビリティゾーン全体で障害が発生することがあり、その時にリソースが1つのアベイラビリティゾーンに固まっているとサービスが停止してしまうため、アベイラビリティゾーンをまたがってインスタンスを配置する設計にする必要がある

## リージョンとアベイラビリティゾーンの関係性
![リージョンとアベイラビリティゾーン.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251142/9f512219-da34-b5e5-de23-779bbe587ae3.jpeg)

# 主なサービス
## VPC
- Virtual Private Cloudの略
- AWSの中のプライベートゾーンのようなもの
- VPCを使うことで、AWS内にプライベートなネットワークを作成できる
- 自由にIPアドレス（CIDRブロック）を割り当てることができる
![VPC.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251142/d9b17172-360d-6f22-a05f-f142d1be0297.jpeg)


### サブネット
- VPCのさらに内側につくる、EC2インスタンス（※後述）などを起動するための領域
- VPCに設定したCIDRブロックに収まるCIDRブロックを割り当てる
- サブネット作成時にアベイラビリティゾーンを指定する
- パブリックサブネットとプライベートサブネットがあり、それらの違いはインターネットゲートウェイ（※後述）から直接アクセスできるかできないかである（アクセスできるのがパブリックで、アクセスできないのがプライベート）
![subnet.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251142/4ae52c65-ad49-9600-5f7d-dd99e0a1338e.jpeg)


### ルートテーブル
- サブネット内のインスタンスの通信先のルール（サブネットがどこと通信するか）を定めた表のようなもの
- 個々のサブネットに1つずつ設定する
- 各サブネットをルートテーブルに関連付ける必要がある（指定しない場合はデフォルトのルートテーブルになる）
- ルートテーブルで、サブネットの通信先にインターネットゲートウェイを指定することで、サブネットがインターネットに接続できる
![ルートテーブル.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251142/7be38cb6-57e6-a804-441f-815fa77edffa.jpeg)


### ゲートウェイ
- VPCの内部と外部との通信をやり取りする出入り口

#### インターネットゲートウェイ
- VPCとインターネットを接続するためのゲートウェイ
- 各VPCに1つだけ取り付けられる

#### NATゲートウェイ
- プライベートIPしか持っていないEC2インスタンスがインターネットと通信できるようにするためのもの
- プライベートIPをNATゲートウェイが持つグローバルIPに変換し、外部と通信する

#### ゲートウェイエンドポイント(VPCエンドポイント)
- S3やDynamoDBといったVPCの中に入れられないサービスに、VPC内から接続する際に利用する

![ゲートウェイ.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251142/853daaf6-0177-a39b-4419-1ae102b16d58.jpeg)

## EC2
- Amazon Elastic Compute Cloudの略でAWSの基幹サービス
- 仮想サーバを提供する
- 仮想サーバの1つ1つの実体は「インスタンス」と呼ばれる
- EC2インスタンス≒サーバ という感覚
- ボタンワンクリックでインスタンスをつくることができるので便利
- クライアントからのリクエスト数が増えたらインスタンスの数を増やしたり（スケールアウト）、インスタンスの性能を上げたり（スケールアップ）も簡単にできるため、サーバ調達のための時間やコストを削減できる
![EC2.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251142/ecc1aac2-817d-92a9-a1fa-6d4dc56e8f23.jpeg)
![スケールアップとスケールアウト.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251142/a15aaf46-deb1-90c8-ac57-6f61ab9b07ac.jpeg)


## ELB
- Elastic Load Balancingの略
- その名の通りロードバランサーのマネージドサービス（管理とかを一括して請け負ってくれるサービス）
- ロードバランサー→サーバへの負荷を分散させるやつ
- EC2インスタンスがスケールアウトされて複数ある場合、ELBがクライアントからリクエストを受け取り、それを各インスタンスに分散させる
- ELB自体もスケーリングができ、負荷に応じてスケールする設計になっている

### ELBの種類
- Classic Load Balancer（CLB）
    - L4/L7レイヤーで負荷分散を行う。現在はあまり使わない。
- Application Load Balancer（ALB）
    - L7レイヤーでの負荷分散を行う。CLBより後に登場。
- Network Load Balancer（NLB）
    - L4レイヤーでの負荷分散を行う。HTTP以外のプロトコル通信の負荷分散をしたい時に利用する。
![ALB.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251142/740fe771-9174-3815-c289-9df6fb51a316.jpeg)

## RDS
- RDB（リレーショナルデータベース、関係データベース）と呼ばれる、SQL文でデータを操作するデータベースのマネージドサービス
- Amazon Aurora、MySQL、MariaDB、PostgresSQL、Oracleなどのデータベースエンジンから好きなものを選べる
- データ保存用ストレージはEBS（Elastic Block Store）を使用している
- インターネットからの接続はデフォルトでオフになっている（多分セキュリティを保つため）ため、EC2などの他のAWSサービスから通信することが多い
![RDS.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251142/bfcacbdf-d531-c91e-c0f1-fdeef38d8046.jpeg)

### マルチAZ構成
- 1つのリージョン内の2つのアベイラビリティゾーンにDBインスタンス（データベースの実体）をそれぞれ配置する構成
- 1つのアベイラビリティゾーンで障害が発生しても、もう一つのアベイラビリティゾーンが生きていればシステムのダウンタイムを短くすることができる
- DBインスタンス作成時にマルチAZ構成を選択したら、あとはAWSが勝手に冗長化してくれて便利

## S3
- Simple Storage Serviceの略
- 容量無制限のストレージ（補助記憶）サービス
- なんかめっちゃ色々なものが大量に入る箱のようなもの
- 保存するファイルにメタデータを追加し、「オブジェクト」として管理する
- S3に保存されている各オブジェクトには、RESTやSOAPといったWeb APIでアクセスする
- データのバックアップや、静的コンテンツ（HTMLファイルなど）のホスティング（置き場）としても利用される
- VPCの中には入れられないため、ゲートウェイエンドポイントを通じてVPC内のEC2インスタンスと通信する
![S3.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251142/ab6fd1e0-1339-a2d1-1e69-fa073de1476d.jpeg)

#### バケット
- オブジェクトを保存するための領域
- バケット名はAWS内（全世界）で一意にしなければならない

#### オブジェクト
- S3に格納されるデータそのもの
- 各オブジェクトには必ず一意になるURLが作成される

## Route53
- DNSのサービス
- ドメイン管理機能と権威DNS機能を持つ
    - 権威DNSとは、ドメイン名とIPアドレスの変更情報を保持しているDNS
- DNSのポート番号が53であることからこの名前が付いている

## CloudFront
- 静的コンテンツをキャッシュして配信するサービス
- ロードバランサーの前段に配置し、元のサーバにあるデータをキャッシュしておく（記憶しておく）ことで、次回に同じリクエストが来たらキャッシュしたものを返す
    - サーバの負荷を軽減できる
    - 利用者から最も近いロケーションからコンテンツを高速に配信することができる
- キャッシュの期間は拡張子やURLごとに設定することができる
    - 頻繁にアップデートされるコンテンツはキャッシュを短くし、あまり更新されないコンテンツは長くするなど
![CDN.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251142/07c7d3ea-239b-2345-f724-2d02bb211a4a.jpeg)
![CloudFront.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251142/a9c89522-9c74-1459-97b8-af70ea1e8714.jpeg)

# オーソドックスなアーキテクチャ
- 簡易的なブログのシステム構成図を想定
- S3にはエラーページなどの静的コンテンツを配置
![システム構成図.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251142/e7e6bf0f-f70c-1387-64ce-42cf98f9d12c.jpeg)

# 参考資料
以下を参考にさせていただきました。ありがとうございました。

- [AWSドキュメント](https://docs.aws.amazon.com/index.html)
- [AWS認定資格試験テキスト AWS認定 ソリューションアーキテクト-アソシエイト](https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-AWS%E8%AA%8D%E5%AE%9A-%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88-%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88-NRI%E3%83%8D%E3%83%83%E3%83%88%E3%82%B3%E3%83%A0%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE/dp/479739739X/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=2TJ91KIVGFV3S&keywords=aws%E8%AA%8D%E5%AE%9A%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88&qid=1562596228&s=gateway&sprefix=aws%E8%AA%8D%E5%AE%9A%2Caps%2C122&sr=8-1)
- [手を動かしながら２週間で学ぶAWS基本から応用まで](https://www.udemy.com/draft/1706378/learn/lecture/11382414?start=225#overview)