[AWS #4]クラウドアーキテクチャの設計原理

## はじめに
こんにちは
今回は **「クラウドアーキテクチャの設計原理」** についてご紹介いたします。
簡単に言うと<font color=red>**「クラウドのメリットを活かした設計をしましょう！」**</font>ということです。

AWSクラウドコンピューティングの6つのメリットを活かしたシステム設計を行うには
**オンプレミスとは異なる設計原則**があります。

---
今回は大きく**4つ**に分類して取り上げたいと思います。
[**1.故障に備えた設計**](#1故障に備えた設計)
[**2.コンポーネントの分離**](#2コンポーネントの分離)
[**3.弾力性の実装**](#3弾力性の実装)
[**4.並列化を考慮する**](#4並列化を考慮する)

### 「AWS #2の復習」AWSクラウドコンピューティング：6つのメリット
その前にAWSクラウドコンピューティングのメリットについて簡単に復習したいと思います。

1.固定費から柔軟な変動費へ
2.コストの最適化
3.キャパシティ予測が不要に
4.スケールによる大きなコストメリット
5.スピードと俊敏性の向上
6.わずか数分で世界中にデプロイ
## 1.故障に備えた設計
結論として<font color=red>**「故障に備えた設計」**</font>という考え方をアーキテクトに取り入れることが重要です。**(Design for Failure)**

形あるものは全て壊れてしまうものです。一例として、オンプレミスシステムではハードディスクの故障はよくあることです。万が一のために**冗長化**をとることがあります。

「故障に備えた設計」を実現するためには、**単一障害点(Simple Point Failure → SPOF)をなくす**という考え方が大切になります。

「具体例」
**1.1つのデーセンターセンターのみで運用しない**
**2.1つのハードウェアのみで構成しない**

## 2.コンポーネントの分離
クラウドはサービス指向アーキテクチャの設計原則に従います。つまり、システムのコンポーネントを**疎結合**にします。

**「疎結合」**
システム間の結び付けや関係性が弱く、**個々のシステムの独立性が高い**ことを言います。

一例として図を作成しました。
![AWS04_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806875/31530ebc-3bac-fb81-11ab-bcabaf0fbdd9.png)
上図のように「EC2」2台の前に「ELB」を置くことで、システムを疎結合にすることができます。

![AWS04_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806875/8c5c73ec-e5e5-1585-3cca-eaf857a60bf2.png)
こちらの図の構成ではアクセス元から「ELB」に接続することで「EC2」にアクセスすることができます。

![AWS04_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806875/c0819391-98d7-1839-5ff3-7187b1dce501.png)
このように疎結合にすることで、たとえ**EC2が1台故障してもシステムを止めることなく稼働させることができます。**

AWSではシステムを疎結合にできるサービスとして「ELB」「SOS」「SNS」「Lambda」などがあります。

:::note info
これらのサービスを利用できないか検討してみましょう
:::
---
さらにコンポーネントの分離を実現するためにはフルマネージドの「キューサービス」を利用して、それぞれのコンポーネント間のやり取りを管理することがポイントになります。
**「Amazon SQS」… Simple Queue Service**

:::note info
SQSを利用して、**非同期かつ疎結合な構成をとる**
:::
## 3.弾力性の実装
クラウドはインフラストラクチャに**弾力性(Elastic)** をもたらします。
弾力性、または伸縮性とは、**スケールアウト（増やす）またはスケールイン（減らす）する**ことを意味します。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806875/1d4ab625-4fe6-1bad-7e1f-c6eb1aa039d4.png)
![scaleout-in.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806875/344dcba8-3544-1dda-f0c6-186f14cdef7e.png)

:::note info
固定されたリソースでなく、クラウドの利点である弾力性（伸縮性）を使用して動的にスケーリングを行う
:::
## 4.並列化を考慮する
クラウドでは並列化を容易に行うことができます。
![AWS04_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806875/ae2a9949-d016-c5ae-88a1-15ad739a26e0.png)
クラウドで同じ設定のサーバーなどを容易に複製ができます。
そのため可能であれば**並列化したシステムを構築する**ことが推奨されています。

---
「並列化したシステムの例」
![AWS04_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806875/3e3a9c2a-cb42-71a8-c638-3fbab3091211.png)
この図では **[ALB(Application Load Balancer)](https://x.gd/hK0hW)** を使用して、複数のEC2に受信リクエストを分散させます。

このように処理を分散させることで、**処理速度、耐障害性の向上が見込まれる**ため並列化したシステムを構成することが推奨されています。

:::note info
**ロードバランサーを組み合わせて、並列処理を行う**
:::
:::note info
**高負荷時はスケールアウト**、**低負荷時にはスケールイン**を行う（弾力性を組み合わせる）
:::
## おわりに
大きく4つの分類（故障に備えた設計、コンポーネントの分離、弾力性の実装、並列化）について紹介させていただきました。
#5~ではAWSのセキュリティに関しての基本的な考え方などを紹介いたします。

最後までお読みいただきありがとうございました！

>日頃より活用している参考書です。
>> **「参考書」**
[AWS認定クラウドプラクティショナー改定第3版](https://x.gd/19i6N)

> **「AWS公式サイト」**
[弾力性と拡張性(スケーラビリティ)の違い](https://x.gd/UQKa9)

> **「Youtube」**
> [クラウドアーキテクチャの設計原理](https://x.gd/eXQ2w)
> [【AWSクラウドプラクティショナー②】AWSクラウドの概念](https://x.gd/MFxe9)