【初心者向け】AWSは怖くない！これだけ読めばAWSのアーキテクチャ図がわかるようになる〜前編〜

どうも、プログラミングスクール受講中・実務未経験勢です。

AWSのアーキテクチャ図を見ても何も理解できなかった筆者が、最近勉強してわかったことをまとめます。

インフラ用語の説明もいれつつ、AWSの代表的なサービスを説明するので、同じような境遇の方の役に立てると嬉しいです。

※普段の使用のフレームワークがRuby on Railsなので、もしかしたらRubyやRails特有の言葉を使っているかもしれません。

ーーーーーーーーーーーーーーーーーーーー
後編はこちらからどうぞ。
[【初心者向け】AWSは怖くない！これだけ読めばAWSのアーキテクチャ図がわかるようになる〜後編〜](https://qiita.com/morihagi/items/5e72d87427e60d807408)
ーーーーーーーーーーーーーーーーーーーー

# 読んだら幸せになる人
- Webアプリのコードを書いてはいるが、インフラ周りがわからない人
- AWSのアーキテクチャ図を見ても何がなんだかわからない人

▼アーキテクチャ図はこういうやつ
<img width="500" src="//d1.awsstatic.com/Developer%20Marketing/jp/magazine/2022/img_way-to-draw-architecture_03.08e1366ebaecaf76a333002acbe1e2bd363acd4b.png" alt="AWS archtecture diagram">
[引用元「AWS のアーキテクチャ図を描きたい ! でもどうすれば良いの ?」](https://aws.amazon.com/jp/builders-flash/202204/way-to-draw-architecture/?awsf.filter-name=*all)[^1]

サービス名が英語で略されてるから、初見だとなんのこっちゃわからないのでは。このシリーズ記事を読むと、上の図がわかるようになります。あと、AWSはすごいぞ。怖くないよ。

先輩エンジニアの方々は誤りや誤解を招く表現があったら、ご指摘いただけると嬉しいです。また、この説明も必要では？といったご提案もいただけると喜びます。

# Webアプリを動かすためにはサーバーが必要
さて、Webアプリが完成したとします。しかし、それを動かすためにはサーバーを用意する必要があります。

:::note
`インフラ(インフラストラクチャー)`
・「Webアプリを動かすために必要なもの」の総称
・ハードウェアもソフトウェアも含む
:::

なぜサーバーが必要なのか？何のサーバーが必要なのか？どのように調達・設定・管理したらいいのか？このような導入の手間を限りなく減らし、簡単に必要なサーバーを使えるようにしたのがAWSです。

インフラ用語を理解しながら、アーキテクチャ図を読めるようになりましょう！

# 基本的にWebアプリは3層からなる
伝統的にWebアプリを3層に分離して説明する`3層アーキテクチャ`という概念（※）があり、各層にその働きに特化したサーバーがあるのが理想的。ちなみに[他の概念](https://qiita.com/os1ma/items/7a229585ebdd8b7d86c2#:~:text=%E3%81%95%E3%81%A6%E3%80%81%E3%81%93%E3%81%93%E3%81%BE%E3%81%A7,%E5%8F%82%E7%85%A7%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82)も存在します。[^2]

1. **プレゼンテーション層**には、**Webサーバー**
    - 固定のHTMLやCSS、JavaScriptを返す働きをする。
    - もしプログラムによる処理が必要だったら、APサーバーに「○○をやってください！」と依頼する。

2. **アプリケーション層**には、**AP（アプリケーション）サーバー**
    - 依頼を受けつけたらプログラムで、HTMLやJSONを生成してWebサーバーに返す働きをする。
    - データの新規作成や取得が必要だったらDBサーバーへのアクセスも行う。

3. **データ層**には、**DB（データベース）サーバー**
    - データを保管する働きをする。
![Alt 3-tiered Architecture](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3348836/654cfad3-79c8-cc14-2514-b09436378443.png)

# 念のためにサーバーを増やそう
上記の図には3種のサーバーが1台ずつ計3台あります。

しかし、1台のサーバーをWebサーバー兼APサーバーとして使ったり、APサーバー兼DBサーバーとして使えないのでしょうか？

技術的には可能なのですが、下記の理由からそれぞれの働きに特化したサーバーに分けて使った方がいいようです。

-  [なぜAPサーバーをWebサーバーとして利用しないのか](https://qiita.com/yCroma/items/e46476e2ac7c372bb2a3)[^3]
- DBサーバーは「高速なデータの処理」などのデータ管理に特化した機能や性能がある
- 後からサーバーの台数を増やしたり減らしたりするのが簡単というメリットがある
- その他のメリットもあります（割愛）

さらに、サーバーの台数を増やすと、災害時にメインのサーバーが壊れても、予備のサーバーでWebアプリを運用できるというメリットもあります。

:::note
`冗長化 / 冗長性`
・何かあった時の備えとして、サーバーの種類や台数を増やすこと
:::

![Alt Redundancy](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3348836/e1cc2163-b962-7f20-2fe5-8371e5b3b9f5.png)

# 3層アーキテクチャにMVCモデルを配置するとどうなる？
Webアプリを開発する中で、何度行き来したかわからないModelファイル・View（HTML・CSSファイル）・Controllerファイル。

:::note
`MVCモデル`
・上記のそれぞれのファイルに分割して開発すること
・Model、View、Controllerの頭文字でMVC
:::

`3層アーキテクチャ`に`MVCモデル`を配置するとこんなかんじ。[^4]
![Alt MVC Model](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3348836/ba85644c-2cd3-2d84-a29c-3bdd28c10e3e.png)

ちなみに、開発環境ではAPサーバーがWebサーバーも兼ねてくれます。しかし、本番環境では大量のアクセスが発生し、APサーバーだけではリクエストを処理しきれないため、Webサーバーが必要となります。

# Webアプリをリリースするにはサーバーを購入する必要がある？ いいえ、そこでAWS。
Webアプリをリリースするためには、Webサーバー・APサーバー・DBサーバーが必要です。

よし、サーバー買っちゃいますか？

:::note 
`オンプレ(オンプレミス)`
・サーバーなどのハードウェアを使用者の管理する施設で利用すること
:::

買うとなると、サーバーの比較・検討といった導入の手間、購入費用、サーバーの設定。もしサーバーが災害や事故で故障してしまったら？などと、いろいろと考えるポイントは枚挙にいとまがありません。

**しかし、AWSを使うと、インターネットを介してAmazonが提供するサーバーを使わせてくれるので、導入の手間が減ります！**

これが[AWS](https://aws.amazon.com/?nc2=h_lg)（の2023年7月2日時点で241種あるうちのサービスの一部）になります。サービスにより有料・無料とありますが、基本的に従量課金制です。

:::note 
`AWS`
・Amazon Web Servicesの略
:::
:::note 
`クラウド(クラウドサービス)`
・AWSのようなインターネットを通して使えるサービスのこと
:::
:::note 
`サーバーレス`
・自前でサーバーの管理をする必要がないこと
:::

# サーバーの代わりにAWSのサービスを使うと?
AWSのサービスを使うといままでの図がこうなります。
![Alt Servers and AWS](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3348836/54d94487-927e-32eb-fa8e-d468785ac821.png)

[`Amazon EC2`](https://aws.amazon.com/ec2/)は、AppサーバーとWebサーバーとしての働きをします。`仮想サーバー`（`インスタンス`）を提供し、Webアプリのコンピューティングをクラウド上で行うことが可能になるサービスです。

:::note 
`Amazon EC2`
・Amazon Elastic Compute Cloudの略
:::
:::note 
`仮想サーバー`
・物理的なハードウェア上において、分割された仮想的なサーバー環境のこと
・簡単に言うと「仮想サーバー」＝「AWS上に作った自分が自由に使えるクラウド上のサーバー」
:::
:::note 
`インスタンス`
・AWS上で稼働する`仮想サーバー`のことを、AWSでは`インスタンス`と呼んでいます。なんででしょうね？
:::

とすると、縦に並んだEC2は図の上ではまとめてしまいましょうか。
![Alt AWS EC2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3348836/6594bffc-3bb0-5c74-fa56-abeb24610792.png)

[`Amazon RDS`](https://aws.amazon.com/rds/)は、DBサーバーとしての働きをします。`マネージド` `リレーショナルデータベース`サービスで、クラウド上でデータベース（MySQL・PostgreSQLなど）を使用できます。

:::note 
`Amazon RDS`
・Amazon Relational Database Serviceの略
:::
:::note
`マネージド`
・「AWSがお客様に代わっていろいろ設定・管理・バックアップしておきますんで、お客様はあまりそのへん気にしなくて使ってもらっていいですよ！」を一言で言うとこうなる
:::
:::note
`リレーショナルデータベース`
・複数のテーブルを関連付けて使えるデータベースのこと
:::

# 最後に
今までの図は[こちら](https://drive.google.com/file/d/1-ArI1PfZwm4DRLy6cijsH7VSHCeQRN6H/view?usp=drive_link)から見れます。

では、次の記事からAWSのサービスをもっと見ていきましょう。

ーーーーーーーーーーーーーーーーーーーー
後編はこちらからどうぞ。
[【初心者向け】AWSは怖くない！これだけ読めばAWSのアーキテクチャ図がわかるようになる〜後編〜](https://qiita.com/morihagi/items/5e72d87427e60d807408)
ーーーーーーーーーーーーーーーーーーーー

[^1]: [AWS のアーキテクチャ図を描きたい ! でもどうすれば良いの ?](https://aws.amazon.com/jp/builders-flash/202204/way-to-draw-architecture/?awsf.filter-name=*all)

[^2]: [MVC、3 層アーキテクチャから設計を学び始めるための基礎知識](https://qiita.com/os1ma/items/7a229585ebdd8b7d86c2#:~:text=%E3%81%95%E3%81%A6%E3%80%81%E3%81%93%E3%81%93%E3%81%BE%E3%81%A7,%E5%8F%82%E7%85%A7%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82)

[^3]: [なぜAPサーバーをWebサーバーとして利用しないのか](https://qiita.com/yCroma/items/e46476e2ac7c372bb2a3)

[^4]: [イラスト図解式 この一冊で全部わかるWeb技術の基本](https://www.amazon.co.jp/%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88%E5%9B%B3%E8%A7%A3%E5%BC%8F-%E3%81%93%E3%81%AE%E4%B8%80%E5%86%8A%E3%81%A7%E5%85%A8%E9%83%A8%E3%82%8F%E3%81%8B%E3%82%8BWeb%E6%8A%80%E8%A1%93%E3%81%AE%E5%9F%BA%E6%9C%AC-%E5%B0%8F%E6%9E%97-%E6%81%AD%E5%B9%B3/dp/4797388811)