クラウドとクラウドネイティブ
AWS(Lambda、BeansTalkほか)、Cloud Foundry、Salesforce App Cloud、Salesforce Heroku、Microsoft Azure、OpenShift、Oracle cloud、Google Cloud Platform、IBM Bluemixなど、今やクラウドサービスにはかなりの種類が存在しています。
クラウドは古くから、SaaS/PaaS/IaaSのサービスレイヤーで語られてきており、DockerやHadoop、CDN(Contents Delivery Network)等さまざまな技術要素へ対応してきています。そんな中マイクロサービス対応についても、REST APIやCI等の観点でラインナップに加えられるようになってきています。
多様な機能を有するPaaS領域 |
クラウドの利用を前提とした「クラウドネイティブ」という言葉が広まりつつあり、クラウドの利点を最大限に活用することに力点が置かれています。いわばクラウドネイティブ時代とも呼べる状況になってきました。そんな中、クラウドネイティブな開発スタイルを実現するために押さえるべき要素として、Herokuの「The Twelve-Factor App」(後述)が出てくるなど、これまで先進的なプロジェクトにおいて暗黙的に実行されてきたベストプラクティスが徐々に開発指針として形式知化されてきています。
クラウドネイティブなアーキテクチャが追い求めるもの
従来より、大規模開発といえば、ウォーターフォールが最も有名な開発スタイルであり、システム開発の初期段階でシステムのスコープを定め、外部要因等に起因してスコープが変わる場合は仕様変更として対応するというスタイルでした。
それに対し、システムのスコープは変動するものであり、あらかじめ計画不可能という前提に立ったプロセス・思想としてアジャイルがあります。中でも、スクラム(SCRUM)やXP(エクストリーム プログラミング)は有名です。マイクロサービスにおいも「進化的な設計」と呼ばれ、変更容易性が重視されます。 アジャイルにおいて、変更容易性をより高め、スコープの変動に追従するためには、「基盤やCI/CDの仕組みが確立されている」ことが前提となり、実は「クラウドネイティブ」にも共通する前提となります。
クラウドを簡単に使えるような仕組みとしてAWS Elastic Beanstalkのようなアプリケーションのデプロイや管理を簡単にするサービスが生まれてきており、非機能面はクラウド製品に任せ、利用者はアプリケーション開発により注力できるようになってきています。これを更に推し進めた先進的な動きとしては、サーバレスアーキテクチャがあり、その名の通りサーバ運用を一切しないやり方も出てきています。
例えば、AWSの機能には「Auto Scaling」と呼ばれるリソースの自動拡張機能があります。また、Pivotalが提供するCloud Foundryの「Circuit Breaker Dashboard」は、一つのサービスの故障が他へ伝搬するのを防ぎます。
小さな粒度で構成されるマイクロサービスはこれらの機能との親和性が高く、クラウドネイティブなアーキテクチャと呼ばれます。
クラウドイミグラントと「The Twelve-Factor App」
「〜ネイティブ」を、対義語である「〜イミグラント」と比較説明しましょう。
例えば「デジタルネイティブ」は、生まれたころからITに親しんでいる世代を指します。最近は、就学前の小さな子供がiPadを触ってYoutubeの動画を見ているといったことも珍しくありません。対義語としての「デジタルイミグラント」は人生の途中からITを親しむようになった世代で、最初はITにとっつきにくいと感じる方もいます。
また筆者は、CやVBといった手続き型言語を学習後にオブジェクト指向言語を学んだいわば「オブジェクト指向イミグラント」なのですが、ちょっと気を抜くとついつい手続き型のコーディングスタイルとなってしまっていました。JavaやScalaといたオブジェクト指向言語を初めてのプログラミング言語として学習した「オブジェクト指向ネイティブ」はあまりそう言った心配がありません。
英語やフランス語等を学習する際もそうですが、ネイティブはある種感覚的にできてしまう部分も、イミグラントにとっては、文法等を教科書で理解してからでないと、使えるようになりません。
クラウドネイティブな開発スタイルとして、マイクロサービスと並び評されることの多いのが先述の「The Twelve-Factor App」です。
その名の通り12の要素を踏まえてアプリケーションを作ろうという発想であり、以下の通り定義されています。
- I. コードベース
バージョン管理されている1つのコードベースと複数のデプロイ- II. 依存関係
依存関係を明示的に宣言し分離する- III. 設定
設定を環境変数に格納する- IV. バックエンドサービス
バックエンドサービスをアタッチされたリソースとして扱う- V. ビルド、リリース、実行
ビルド、リリース、実行の3つのステージを厳密に分離する- VI. プロセス
アプリケーションを1つもしくは複数のステートレスなプロセスとして実行する- VII. ポートバインディング
ポートバインディングを通してサービスを公開する- VIII. 並行性
プロセスモデルによってスケールアウトする
「V. ビルド、リリース、実行」などCI/CDに関わる事項や、「VII. ポートバインディング」のようにマイクロサービスの公開に関わる事項などが盛り込まれています。
一つ一つ詳細な説明はしませんが、これまで非クラウドにて開発してきた方(もしくはシステム)、つまり「クラウドイミグラント」にとっては、「The Twelve-Factor App」のように体系的に整理されたものが、より求められるのではないでしょうか。
* * *
今回は、マイクロサービスと並び注目されてきている「クラウドネイティブ」について説明しました。
マイクロサービスとクラウドは相性が良く、またその効果を高めるには、これまでのウォーターフォールやオンプレミスの考え方とは異なるアプローチが必要になってきます。
次回は、「クラウドネイティブなアーキテクチャ」を支える技術を深堀りします。
著者紹介
正野 勇嗣 (SHONO Yuji ) - NTTデータ シニア・エキスパート
2011年頃まで開発自動化技術のR&Dに従事。その後、開発プロジェクト支援やトラブルシューティング等に主戦場を移す。「ソースコード自動生成」に加えて、JenkinsやMaven等の「ビルド自動化」、JsTestDriverやSelenium等の「テスト自動化」を扱うようになり、多様化する開発自動化技術動向に興味。
最近は第四の自動化であるInfrastructure as Code等の「基盤自動化」の魅力に惹かれている。開発自動化技術に関する雑誌・記事執筆も行う。2児のパパ。