クラウドネイティブのススメ

皆さんがモダンなアプリケーション・システムの開発を行う場合、プロジェクト内で何を意識して開発を行うでしょうか？
共有されたインフラを利用して運用コストを削減するクラウド、開発手法であるアジャイル開発、継続的に修正の作成・リリースを行う仕組みであるCI/CD、頻繁な修正を可能とするアーキテクチャのマイクロサービス、など色々と考える技術要素は多く、それらを取り入れて結局何を求めて目指しているのか分からなくなることは無いでしょうか？

私は**クラウドネイティブ**を意識することをお勧めしています。
私はモダンなアプリケーション・システムの開発の根底にクラウドネイティブの考え方があり、クラウドを活用する・しないに関わらず有効であると考えています。

ちなみに、「クラウドネイティブ」とは誰が言い出した言葉なのでしょう？
例えば、「Microservice」を調べれば2014年にJames Lewis/Martin Fowlerが提唱した言葉だと分かりますが、私が何度か「クラウドネイティブ」の厳密な定義を知ろうと調べても誰がいつ、この言葉を誰が使いはじめたのか分かりません。
(出典をご存じの方はぜひ教えてください)

その中で技術者の方々が「クラウドネイティブ」を説明するアプローチは2つあります。
どちらもクラウドの利点を最大限に生かすという意味では共通ですが、着目している点が異なるため以下に説明します。

1. Pivotal/Cloud Foundry/Twelve Factor-App
2. Kubernetes/The Cloud Native Computing Foundation

# アプリケーション開発作法に着目したクラウドネイティブ(Pivotal/Cloud Foundry/Twelve Factor-App)
Povital社が開発したCloud Foundryは、以前からクラウドネイティブアプリケーションプラットフォームとして知られています。
Cloud FoundryはグローバルスタンダードなPaaSであったHerokuの技術者が、クラウドの利点を最大限に引き出すためのアプリケーション開発の12個の作法をまとめた[Twelve Factor-App](https://12factor.net/ja/)を継承した仕様となっています。
例えば、有名なものはステートレスなアプリケーションとすべきとする「VI. プロセス」と、ログは標準出力・標準エラー出力に出力すべきという「XI. ログ」でしょう。
Pivotal社は更に"Twelve Factor-App"を15個の作法に拡張した[Beyond the 12 Factor App](https://content.pivotal.io/ebooks/beyond-the-12-factor-app)を公開しており、モダンなシステムを開発する上で非常に参考になります。

しかし、クラウドネイティブ＝Twelve Factor-Appと考えて12個の作法を読むと「どこがクラウドなのか？」と違和感を持つことはないでしょうか？
確かに「I. コードベース」には、ソースコードをGitなどでバージョン管理し、コードベースとアプリケーションを1対1で管理しましょうと言っています。
クラウドとは一見関係ないように見えます。
そこが、私がクラウドネイティブをお勧めしたい理由でもあります。

皆さんが新たに開発するシステムの特長を説明する際に、「アジャイル開発を導入する」や「マイクロサービスのアーキテクチャを採用する」という説明すると「それは手段であった目的ではないよね？結局何が良くなるの？」と問われたことは無いでしょうか？
一方でクラウドネイティブは、その言葉自体に明確な技術的な意味が無く、「クラウドネイティブを導入します」では何をするのか伝わりません。

では、「クラウドネイティブ」とは何なのか。
一般的には「クラウドを前提としたアプリケーション・システムのこと」と説明されますが、クラウドを前提とするとは何なのかよく分からないと思います。
私は、「クラウドの利点を最大限に生かしたアプリケーション・システムのこと」とクラウドネイティブを説明しています。
クラウドの利点とは、「アジリティ」と「スケーラブル」です。

## アジリティ
現代風にアジリティと表現しますが、いわゆるスピードです。
インフラリソースを共有するクラウドでは、クラウド提供元にインフラ構築・運用を任せることができるため、
すぐにシステム構築に着手することができ、素早くシステム構築することができます。

## スケーラブル
現代風にスケーラブルと表現しますが、いわゆる拡張性です。
共有されたインフラリソースを利用するクラウドでは、必要な時に必要な分のリソースをすぐに利用できます。
このため、最初は最小限のリソースでスタート（スモールスタート）し、必要に応じて柔軟に使用するリソースを拡大もしくは縮小することができます。

しかし、クラウドを利用してアジリティの向上を目指しても、「I. コードベース」に示すようなソースのバージョン管理が行われていなければ、アプリケーションを素早く開発することができません。
また、スケーラブルを目指しても、「VI. プロセス」に示すような状態を保持するステートフルなアプリケーションではスケーラブルなシステムを構築することができません。

このようにクラウドネイティブは「クラウドのアジリティとスケーラブルという利点を最大限に生かしたアプリケーション・システムのこと」です。

# 技術に着目したクラウドネイティブ(Kubernetes/The Cloud Native Computing Foundation)
Cloud Native Computing Foundation(略してCNCF)は2015年に発足したKubernetesをホストする組織です。
クラウドの利点を生かすオープンソースの技術・サービスをホストし、そのコミュニティ活動を活性化しています。

この組織では「CNCF Cloud Native Definition v1.0」https://github.com/cncf/toc/blob/master/DEFINITION.mdで
クラウドネイティブを以下のように定義しています。

>Cloud native technologies empower organizations to build and run scalable applications in modern, dynamic environments such as public, private, and hybrid clouds. Containers, service meshes, microservices, immutable infrastructure, and declarative APIs exemplify this approach.
These techniques enable loosely coupled systems that are resilient, manageable, and observable. Combined with robust automation, they allow engineers to make high-impact changes frequently and predictably with minimal toil.
The Cloud Native Computing Foundation seeks to drive adoption of this paradigm by fostering and sustaining an ecosystem of open source, vendor-neutral projects. We democratize state-of-the-art patterns to make these innovations accessible for everyone.

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


クラウドの近代的でダイナミックな環境で、回復性などがある疎結合システムを実現する技術のことをクラウドネイティブ技術と呼ぶというものです。

# まとめ
アプリケーションの作法に着目したクラウドネイティブと、技術に着目したクラウドネイティブがあることがあることが分かっていただけたでしょうか？
クラウドネイティブと言っても、あくまでクラウドの利点を生かすための作法や技術のため、それはクラウド以外でも効果的なものになります。

本質的に目指しているものは共通ですが、最近の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で示している考え方が自然ととらえている。