クラウド構造の復習

## 初めに
先日、クラウドを何となく使っているなと思い色々調べてみました。
こんな感じなんか、と思ったところを備忘録的に以下にまとめましたのでどなたかの参考になれば幸いです。

## 目次
1. [クラウドのインフラ](#1-クラウドのインフラ)
2. [仮想化とVM](#2-仮想化とVM)
3. [VMの種類](#3-VMの種類)
4. [ベアメタルサーバー](#4-ベアメタルサーバー)
5. [ネットワーキング](#5-ネットワーキング)
6. [コンテナ](#6-コンテナ)
7. [まとめ](#7-まとめ)


# 1. クラウドのインフラ
### クラウドには物理的なリソースがあるぞ！
初学の時は、深く物を考えなかったのでクラウド自体が本当に実態の無いものと考えがちです。
クラウドはもちろん、ガチガチ大きな**物理的なリソース**の上で成り立っています。
オンプレミス（自分の所）に物理的リソースがないので、イメージしずらかったりしますよね。

物理的リソースは、サーバーやストレージデバイス、ネットワーク機器などのことを指します。
普通のコンピュータのことですね。

### 物理的リソースは各地に点在している！
この物理的リソースは、オンプレミス（自分の所）に無い代わりに様々な場所に点在しています。
場所のことを、以下大きく3つの段階で表します。
* **クラウドリージョン**
    * 物理的なリソースが配置されている特定の地理的なエリアを指します。
    * 例: アジア太平洋地域、北アメリカ東部など。
* **ゾーン（AZ: Availability Zones）**
    * クラウドリージョン内に複数存在するデータセンターのこと。
    * 例: リージョン「北アメリカ東部」内に「ゾーン1」「ゾーン2」といった具体的なデータセンターが存在する。
* **データセンター**
    * 物理的な建物や施設のこと。中には物理的リソースが収められています。
    * 例: 大きな倉庫のような建物の中に、多数のサーバーラックや冷却装置、電源供給装置などが配置されている。


### クラウドは物理リソース上で、仮想化されたコンピュータのことだ！
えぇ。誤解を生みそうな表現です。もちろん例外もあります。
しかし、基本的に皆さんが使用するクラウドは、**物理リソース上で仮想化されたコンピュータのこと**です。
このクラウドも物理リソースと同じでコンピューティングリソース（サーバー）、ストレージ、ネットワークサービスで構成されています。

いや、それならわざわざコンピュータ（物理リソース）の上に、仮想化されたコンピュータを立てなくても、コンピュータ（物理リソース）をみんなで使えばいいじゃん。

と思いますが、それはNG。
やろうとしていることは、**自分の持ってるPCを他人と一緒に使用しているようなもの**です。
勝手にデータ消された・・・、知らない画像が増えてる・・・・なんて怖すぎる。プライバシーのかけらもない！

そこで、仮想化という技術が大事になってきます。


# 2. 仮想化とVM
### 仮想化でPCの中にPCを作る！
仮想化とは、物理的なハードウェア資源（例：サーバー、ストレージ、ネットワークデバイス）を直接使用する代わりに、**ソフトウェアを使用して、ハードウェア資源の「仮想的な」バージョンを作成する技術**のことを言います。

簡単に言えば、PCの中にPCを作ることができるのです。
ちなみに、このように作られた**Virtual Machine（仮想的なコンピュータ）をVMと呼びます。**

### 仮想的なPCは何個でも作れる！
仮想化を利用すると、**1台の物理的なコンピュータ上で複数のVMを動作させることができます**。
これにより、1台のマシンで複数の異なるタスクやアプリケーションを同時に動作させることが可能になります。

### ハイパーバイザーでVMを分断！
仮想化を実現するための中心的な要素は「ハイパーバイザー」と呼ばれるソフトウェアです。
ハイパーバイザは**物理的なサーバ上で動作し、物理的なリソースを仮想マシンに割り当てる役割**を持っています。

ちなみに細かいことを言うと、ハイパーバイザーのインストール方法は以下２タイプあります。
* ベアメタルハイパーバイザ
    * 物理サーバ上にインストールする場合
    * 直接インストールされるため、間に余計な層がなく、パフォーマンスが高い
* ホスト型ハイパーバイザ
    * 物理サーバ上の既存のOSにインストール
    * 既存のオペレーティングシステムの上にインストールされるため、そのオペレーティングシステムとハイパーバイザの間には一定のオーバーヘッドが発生する

# 3. VMのタイプ
### VMは色々な呼ばれ方があるぞ！
VMは、クラウドプロバイダーによって色々と呼ばれ方があり、「仮想サーバー」、「仮想インスタンス」、あるいは単に「インスタンス」とも呼ばれています。
ちなみに有名なプロバイダーだと、以下のような感じです。
* AWS :
    * 「EC2インスタンス」または単に「インスタンス」
* Microsoft Azure:
    * 「Azure Virtual Machines」や単に「VM」
* IBM Cloud:
    * 「Virtual Servers」や「インスタンス」
* GCP（Google Cloud Platform）:
    * 「Compute Engineインスタンス」または単に「インスタンス」

### VMデプロイ時に、オプションを指定できるぞ！
異なるユースケースに対応するため、基本的にVM提供時には、様々な構成やデプロイオプションを選べるようになっています。
例えば、クラウドで仮想サーバーを作成するときは以下を指定します。
* サーバーが配置されるリージョンやゾーン、データセンター
* OS（オペレーテンングシステム）
* 共有（マルチテナント）VM or 専用（シングルテナント）VM
* その他：課金の頻度やストレージ、ネットワークオプション

### 好みのVMタイプを選べ！
異なるニーズやワークロードに応じてクラウド上のVMは使い分けることができます。
一般的にVMは以下のようなタイプに分かれます。
* 共有 (パブリッククラウド) VM:
  * 正式名称：Public VMs または Shared VMs
  * マルチテナント（他のユーザーと物理サーバーを共有すること）。
  * 事前に定義されたサイズで提供され、料金は時間あたりや秒単位。
  * 例: 軽い作業や一時的なタスクに適します。
* トランジェント (スポット) VM:
  * 正式名称：Transient VMs または Spot VMs
  * 未使用のデータセンター容量を割引価格で利用。
  * しかし、容量が減少した場合にはいつでも停止するリスクがある。
  * 例: テスト、開発、一時的な大量データ処理など、ここだけって時に適しています。
* 予約 VM:
  * 正式名称：Reserved Virtual Server Instances
  * 未来の利用のために特定の容量を予約。
  * 期間を選択（1年、3年など）して、その間はリソースが保証される。
  * 例: 長期間、一定の容量が必要なプロジェクトに適しています。
* 専用ホスト:
  * 正式名称：Dedicated Hosts
  * 特定のホスト上でのみ、VMを実行できます。
  * 他のユーザーとリソースを共有しない。
  * 例: 高いセキュリティや特定のライセンス要件を満たす必要がある場合に適しています。

# 4. ベアメタルサーバー
上記で話した、VMと毛色の違う話をします。
聞いたこともある、ベアメタルサーバーです！
### ベアメタルサーバーは、顧客先でホストしてない物理サーバーのこと！
ベアメタルサーバーは、**専用の物理サーバー**のことです。
単一の顧客に専用で提供されており、データセンターのラックに接続されています。
ハードウェアやラック接続に問題が発生した場合、クラウドプロバイダーが修正または交換し、サーバーを再起動します。
ハード周辺の管理以外は、顧客がサーバー上の他のすべてを管理するようになっています。

でも、目に見えないのでクラウドの一種ということです。

### 専用VMと混同しないでね、ハードウェアを占有できるんです
両者ともに単一の顧客のための専用の物理サーバーを提供しますが、使用方法や目的が異なります。
専有ホストは仮想マシンの実行を目的としているのに対し、**ベアメタルサーバーは直接ハードウェア上での高性能な実行を目的としています。**

### 専用の物理サーバーにもメリットがたくさん！
基本的には、物理サーバーのホストと理由は似ています。
ただ、VMと比較すると以下のような点がメリットになります。（諸説あり）
* 性能: 
  * ベアメタルサーバーでは、仮想化のオーバーヘッドがないため、ハードウェアのリソースを最大限に活用できます。
  * これは、高い計算能力やI/O性能を必要とするアプリケーションにとって重要です。
* 予測可能な性能: 
  * ベアメタルサーバーは、他のテナントとリソースを共有しないため、性能の変動が少なく、一貫した実行が期待できます。
* カスタマイズと柔軟性: 
  * 顧客は、ハードウェアの構成（CPU、メモリ、ストレージなど）や使用するOS、ハイパーバイザーを自由に選択できます。
  * これにより、特定の要件を持つアプリケーションやワークロードに最適な環境を構築できます。
* セキュリティとコンプライアンス: 
  * 物理サーバーが単一の顧客に専用で提供されるため、データの隔離やセキュリティを強化できます。
  * これは、厳格な規制やコンプライアンス要件を満たす必要がある企業や業界にとって重要です。
* ライセンスと互換性: 
  * 顧客は独自のオペレーティングシステムやアプリケーションをインストールできるため、特定のソフトウェアライセンスや互換性の問題に対応しやすいです。
* 移行の容易さ: 
  * 既存のオンプレミス環境をクラウドに移行する際、ベアメタルサーバーは物理的な環境と非常に類似しているため、移行作業がスムーズに進行しやすいです。

# 5. ネットワーキング
さて、ここまでクラウド構成でもコンピューティングリソースについて話してきました。
次にとっても重要なネットワーキングの話をしていきましょう！

### クラウドネットワークはもちろんインスタンス（VM）で構成するぞ！
クラウドとVMは密接な関わりである話をしてきました。
その実、クラウドネットワークの構築に、オンプレミスのデータセンターでのネットワークのデプロイと大差ありません。
しかし、主な違いはクラウドでは物理デバイスの代わりにネットワーク要素の論理インスタンス（VM）を使用することになります。

<details><summary>ネットワークのデプロイってなんやねんって人はOPEN</summary><div>
上で、「クラウドネットワークの構築に、オンプレミスのデータセンターでのネットワークのデプロイと大差ありません。」といってますが、それは、クラウド上でのネットワークの設計や構築のプロセスが、オンプレミス環境でのネットワーク設計や構築のプロセスと基本的には同じであることを指しています。

つまり、どちらの環境でも、同じネットワーキングの原則が適用されるということです。

* **オンプレミスのデータセンターでのネットワーク**
  * 物理的なハードウェア: 
    * オンプレミスのネットワークでは、スイッチ、ルーター、サーバー、ストレージ、ファイアウォールなどの物理的なハードウェアがデータセンター内に設置されます。
  * ネットワークの設計: 
    * IPアドレスの範囲、サブネット、VLAN（Virtual Local Area Network）などを定義し、ネットワークトポロジーを設計します。
  * セキュリティ: 
    * ファイアウォール、ACL（Access Control List）、VPN（Virtual Private Network）などを使用して、ネットワークのセキュリティを確保します。
  * 接続: 
    * インターネットや他の拠点との接続を確立します。
* **クラウドネットワーク**
  * 仮想的なハードウェア: 
    * クラウドでは、物理的なハードウェアの代わりに仮想的なネットワークコンポーネント（vNIC、仮想スイッチ、仮想ルーターなど）が使用されます。
  * ネットワークの設計: 
    * クラウドでも、IPアドレスの範囲、サブネット、VPC（Virtual Private Cloud）などを定義し、ネットワークトポロジーを設計します。
  * セキュリティ: 
    * クラウドでも、ファイアウォール、ACL、VPNなどを使用して、ネットワークのセキュリティを確保します。
  * 接続: 
    * インターネットやオンプレミスの拠点との接続を確立します。

</div></details>

### クラウドネットワークは、VPCの中に作れ！
**VPC（Virtual Private Cloud）とは、論理的に分割されたネットワーク空間です**。
この中にクラウドネットワークを作ります。

VPCを作成する際に、主に必要な要素は、IPアドレス範囲、サブネット、ルートテーブル、セキュリティ設定です。
これらを設定することで、論理的に分断した空間を作成します。

### VPCの中のリソースは、サブネットがたくさん！
VPCの中には、異なる用途のために複数のサブネットが存在します。
例えば、ウェブサーバー用、アプリケーションサーバー用、データベースサーバー用のサブネットがあります。
各サブネットにはセキュリティ要素があり、サブネットレベルのファイアウォールとして機能するアクセス制御リスト（ACL）によって保護されています。

また、セキュリティグループを作成して、インスタンス（VM）レベルでのセキュリティを提供することもできます。
そして各サブネットには、異なる種類の仮想マシン（VMs）または仮想サーバーインスタンス（VSIs）がデプロイされています。

### イメージはこんな感じかな
VPCを大きな箱と考えると、サブネットは小さな箱、セキュリティグループ、ACLsが箱の入り口にあるガードやフィルタ、VMs,VSIsが箱の中にあるアイテムと言えますね。

### 作るとこんな感じ
* VPC (Virtual Private Cloud)
  * サブネット 1: ウェブサーバー用
    * セキュリティグループ: ウェブサーバーのセキュリティ設定
    * ACLs: サブネットレベルのアクセス制御
    * VSIs (Virtual Server Instances): ウェブサーバー
  * サブネット 2: アプリケーションサーバー用
    * セキュリティグループ: アプリケーションサーバーのセキュリティ設定
    * ACLs: サブネットレベルのアクセス制御
    * VSIs (Virtual Server Instances): アプリケーションサーバー
  * サブネット 3: データベースサーバー用
    * セキュリティグループ: データベースサーバーのセキュリティ設定
    * ACLs: サブネットレベルのアクセス制御
    * VSIs (Virtual Server Instances): データベースサーバー
  * Public Gateway: インターネットからのアクセスを可能にする
  * VPN/Direct Link: オンプレミス環境との安全な接続
  * Load Balancers: 複数のワークロードの負荷分散

# 6.コンテナ
みなさん、ご存知コンテナ。
簡単に言うと、アプリケーションとその動作に必要な環境をパッケージ化したものです。
デスクトップからクラウドまで、どこでも同じように実行できるのが便利ですね。

### コンテナと仮想マシンの違い
コンテナは、仮想マシンと比較しても小さく、起動が早く、移植性に優れています。
仮想マシンとの大きな違いは、ゲストOSを必要としないことです。
コンテナはホストOSの機能を利用して、アプリケーションを実行します。これにより、リソースの消費を抑えつつ、効率的にアプリケーションを運用できます。

### コンテナとVMの違い
では、コンテナとVMの違いをもう少し掘り下げてみましょう。例えば、Node.jsアプリケーションを開発していて、本番環境にデプロイしたいとします。VMを使う場合、まずLinux VMを設定し、ゲストOS、バイナリ、ライブラリなどを含める必要があります。これが意外とリソースを食います。しかし、コンテナを使えば、アプリケーションと必要なライブラリだけをパッケージ化し、ホストOSの上で直接実行できます。これにより、リソースの使用量を減らし、効率的な運用が可能になるわけです。

### コンテナのスケーラビリティ
コンテナのもう一つの大きな利点は、スケーラビリティ。同じアプリケーションでも、簡単に複数のインスタンスを展開し、拡張や縮小が容易です。VMと違い、ゲストOSを何度もデプロイする必要がないため、リソースをより効率的に活用できるんです。

### コンテナとDevOps
最後に、コンテナはアジャイル開発やDevOpsにも貢献しています。開発環境と本番環境での一貫性を保ちやすく、継続的インテグレーションや継続的デリバリーをスムーズに進めることができるのです。コンテナを使用することで、アプリケーションの開発からデプロイメントまでがより迅速かつ効率的になります。

# まとめ
以上・・・つらつら書きましたが、
どなたかの支援になれば幸いです。

ではでは