クラウドネイティブについて調べてみた

###背景
クラウドネイティブについて、色々調べていたところ、**[廣石氏](https://qiita.com/HiroishiMasaya)** の記事が非常に分かりやすかったので、それを、さらに自分用に整理しました（そのため、クラウドネイティブに対する、自身の考などは含まれていません）。

###１．クラウドネイティブとは何か

廣石氏の記事⇒[『クラウドネイティブのススメ』](https://qiita.com/HiroishiMasaya/items/f2e589ea2ed72dc604b3)によれば、**1）アプリケーションの作法に着目したクラウドネイティブ**(*Pivotal/Cloud Foundry/Twelve Factor-App*)と、**2）技術に着目したクラウドネイティブ**(*Kubernetes/The Cloud Native Computing Foundation*)があるとのこと。

ということで、以下に、これら2つについて、整理しました。

#### 2．アプリケーションの作法に着目したクラウドネイティブ(Pivotal/Cloud Foundry/Twelve Factor-App)

上記記事では、**アプリケーションの作法に着目した**クラウドネイティブの側面に関して、以下のように挙げられています。

- クラウドネイティブとは、一般的に「クラウドを前提としたアプリケーション・システムのこと」と説明されることが多い
- ただし、クラウドを前提とするとは何なのかよく分からないと思われる
- **クラウドの利点を最大限に生かしたアプリケーション・システムのこと**、と考えている
- クラウドの利点とは、「**アジリティ**」と「**スケーラブル**」である
    - アジリティと表現しているが、いわゆるスピードのこと。
        - インフラリソースを共有するクラウドでは、クラウド提供元にインフラ構築・運用を任せることができるため、すぐにシステム構築に着手することができ、素早くシステム構築することができる
    - スケーラブルと表現しているが、いわゆる拡張性のこと
        - 共有されたインフラリソースを利用するクラウドでは、必要な時に必要な分のリソースをすぐに利用できる
        - このため、最初は最小限のリソースでスタート（**スモールスタート**）し、必要に応じて柔軟に使用するリソースを拡大もしくは縮小することができる
    - しかし、クラウドを利用してアジリティの向上を目指しても、The Twelve Factorsでの「**Ⅰ. コードベース**」に示すようなソースのバージョン管理が行われていなければ、アプリケーションを素早く開発することができない
    - また、スケーラブルを目指しても、「**Ⅵ. プロセス**」に示すような状態を保持するステートフルなアプリケーションではスケーラブルなシステムを構築することができない 
- （まとめると）クラウドネイティブは、**「クラウドのアジリティとスケーラブルという利点を最大限に生かしたアプリケーション・システム」**のことである


#### 3．技術に着目したクラウドネイティブ(Kubernetes/The Cloud Native Computing Foundation)

上記記事では、さらに、「**CNCF Cloud Native Definition v1.0**」https://github.com/cncf/toc/blob/master/DEFINITION.md を整理されていたので、それを、以下に、抜粋させていただきました。

- CNCF（Cloud Native Computing Foundation）では、「CNCF Cloud Native Definition v1.0」https://github.com/cncf/toc/blob/master/DEFINITION.md において、クラウドネイティブを以下のように定義している
    - クラウドネイティブ技術は、*パブリッククラウド*、*プライベートクラウド*、*ハイブリッドクラウド*などの**近代的でダイナミックな環境において、スケーラブルなアプリケーションを構築および実行するための能力を組織にもたらす**
    - このアプローチの代表例に、**コンテナ**、**サービスメッシュ**、**マイクロサービス**、**イミューダブルインフラストラクチャ**、および**宣言型API**がある
    - これらの手法により、**回復性**、**管理力**、および**可観測性のある疎結合システムが実現**する。 
    - これらを**堅牢な自動化と組み合わせる**ことで、エンジニアはインパクトのある変更を**最小限の労力で頻繁かつ予測どおりに行うことができる**
    - Cloud Native Computing Foundationは、オープンソースでベンダー中立プロジェクトのエコシステムを育成・維持して、このパラダイムの採用を促進したいと考えている
    - 私たちは最先端のパターンを民主化し、これらのイノベーションを誰もが利用できるようにする。
- （まとめると）**クラウドの近代的でダイナミックな環境で、回復性などがある疎結合システムを実現する技術のことをクラウドネイティブ技術と呼ぶというもの**。

#### 4．（廣石氏による）まとめ

- アプリケーションの作法に着目したクラウドネイティブと、技術に着目したクラウドネイティブがある
- クラウドネイティブと言っても、あくまでクラウドの利点を生かすための作法や技術のため、それはクラウド以外でも効果的なものになる
- 本質的に目指しているものは共通だが、最近のKubernetesとその周辺のコミュニティが活性化していることを受けて、後者の**技術に着目したクラウドネイティブが語られる**ことが多くなっている
- しかし、**技術だけに着目すると目的を見失う**ため、クラウドネイティブを以下のように理解いただきたい
    - *アジリティとスケーラブルというクラウドの利点を生かす作法* が **クラウドネイティブ**
    - *それを生かすための作法* が **Twelve Factor-App**
    - それを実現する技術が **Cloud Native Computing Foundationというコミュニティで活発に議論** されている
    - まずは**アジリティ**と**スケーラブル**を意識し**Twelve Factor-App** で問われている作法をしっかり理解し、それを実現するために**Cloud Native Computing Foundation** にホストされている技術の採用を検討するのが **クラウドネイティブなシステム開発**

- （補足）**クラウドネイティブとマイクロサービスの関係**について
    - マイクロサービスはアプリケーションを小さなサービスに分割して開発し、それをAPIで疎結合することにより、各サービスの修正・拡張・異常の影響を局所化し、システムの拡張性・可用性を向上するアーキテクチャ
    - クラウドネイティブの発展系がマイクロサービスと説明されることもあるが、上述のように**クラウドネイティブはアジリティとスケーラブルを意識した考え方・作法**であり、**マイクロサービスはそれを実現する一つの手段**であると考えるのが自然
    - この意味で *CI/CD、DevOps、コンテナ* も**クラウドネイティブを実現する手段**であり、Pivotal社がhttps://pivotal.io/jp/cloud-nativeで示している考え方が自然ととらえている

ということで、廣石氏による記事について、整理させていただきました。（廣石氏に感謝）
この記事を何度も読み返すことで、クラウドネイティブについて、さらに理解を深めていきたいと思います。
 
##参考記事

1.[クラウドネイティブのススメ](https://qiita.com/HiroishiMasaya/items/f2e589ea2ed72dc604b3)
2.[クラウド・ネイティブという考え方――これからのIT基礎知識 Vol.3](https://www.ibm.com/blogs/think/jp-ja/cloud-native-concept-03/)
3.[「The Twelve-Factor App」を15項目に見直した「Beyond the Twelve-Factor App」を読んだ](https://kakakakakku.hatenablog.com/entry/2020/03/09/084833)