「クラウドを使うと基盤の構築がなくなるので,システム開発は楽になる」---。ハードウエアやミドルウエア,アプリケーションなどをインターネットのサービスとして利用できるクラウド・コンピューティング(以下クラウド)。クラウドに対してこんな印象をお持ちなら,改めた方がいいかもしれない。

 記者がそう強く感じたのは,日経SYSTEMS2009年12月号で「JUMP! クラウド革命に備えよう」という特集を担当したからだ。クラウドをいち早く利用した開発現場に取材をすると「クラウドの利用によって開発は難しくなり,工数はむしろ増えた」という声が意外に多く聞かれたのである。

 クラウドを利用すると,確かに基盤構築の工数は減る。しかしクラウドの基盤が持つ特徴や制約を考慮して,クラウド上で動作するシステムを構築すると,手組みやパッケージ・ソフトと違った開発の難しさが発生するのだ。

負担になる三つの作業

 日経SYSTEMSの特集では,要件定義,設計,テストにわたるさまざまな難しさやクラウドの仕組みなどを解説した。ここでは,開発作業で最も負担が大きいと見られる三つの作業について紹介したい。

(1)並列処理の徹底的な考慮

 一つ目の負担は,アーキテクチャを設計する際に,徹底的に並列処理を考慮しなければならないことである。

 クラウドを利用する最大の魅力は,世界各地のサーバー・リソースを利用したスケーラビリティ(拡張性)にある。この魅力を享受するには,複数の処理をいかにして同時に実行させるかがポイントとなる。スケーラビリティを引き出せなければ,クラウドの利用価値は大きく低下しかねない。

 並列性を高めるにはどうしたらよいのか。例えば,クラウド上の分散型DB(キー・バリュー型のデータストア)を利用するのはもちろん,このデータストアに対して並列にアクセスできる処理に分割することが挙げられる。データを一元管理するリレーショナル型のDBを利用すると,DBアクセスが性能のボトルネックとなってしまう。

 トランザクションを細かい単位に分割することも考慮する必要がある。複数処理をまとめたトランザクションでは,処理同士が競合する範囲が広くなり,並列処理の妨げになる。同じデータであっても,参照用と更新用のデータにテーブルを分けることも必要となる。この場合,参照用と更新用のデータを適切に同期させるロジックも考えなくてはいけない。

 このほか,インターネット上のクラウドでは,原因不明の処理遅延や処理の失敗があるかもしれない。この問題を回避するには,同じ処理を複数実行させて,最初に成功したものを採用するなどの工夫がいる。また,処理にはサーバーの接続先やリクエストの内容といった「セッション状態」を持たせず,処理を実行するサーバーを限定させない仕組みも必要となる。

(2)実装できない機能の見極め

 並列処理を徹底的に考慮すると,実装しにくい機能が出てくる。そのため要件定義の段階で,クラウド上の制約を考慮しながら,実装すべき機能を見極めていく必要がある。これが,二つ目の負担である。

 例えば前述のように,アーキテクチャを設計する際には,粒度が大きいトランザクションを実装できない点を考慮しなければならない。処理の並列性を損ねるためである。

 この制約は,システムに機能として盛り込む処理に影響を及ぼす可能性がある。「在庫数」や「口座残高」「顧客情報」といった複数のデータ項目を確認する受注処理はその一例だ。こうした処理を多く含む機能はトランザクションの粒度が大きくなるので,実装しにくくなる。

 難しいのは,要件定義の段階で,トランザクションの粒度をどう見極めるかである。粒度を見極めるにはデータ・モデルを明らかにして,参照用と更新用のデータを分けたり,演算処理をデータとして持ったり(キーバリュー型ではデータ抽出時に集計できない)することを考えなくてはならない。

 つまり要件定義の段階で,データ・モデルを設計する作業が発生する。“基盤ありき”で要件定義を進める煩わしさが,クラウドを利用した開発にはつきまとうのである。

(3)四つの追加テスト

 工数が膨らむもう一つの理由は,クラウド特有のテストが発生することである。クラウド上でシステムを稼働させる場合,大きく四つのテストが追加される可能性がある。

 一つ目は,クラウドの定期メンテナンスやバージョンアップに伴う回帰テストだ。米Salesforce.comが提供する「Salesforce.com」や「Force.com」の場合,4カ月に1度の定期的なバージョンアップがある。もちろん基盤自体のテストは完了している。だがその上で自作のソフトを動作させる場合,正しく動作するかを再度確認する必要がある。

 クラウドでは,インターネット回線を使ったり,他のシステムの負荷による影響を受けたりすることもある。そのためソフトの動作に再現性があるかどうかを確認するテストも発生する。これが,追加すべき二つ目のテストである。

 1度実行して網羅率(カバレッジ)を確認していた従来のテストでは「テスト不足」となる可能性がある。「網羅率80%のテストを5回実施した」という具合に,再現性を保証することが大切なのだ。

 三つ目は,並列処理の実行状況を確認するテストである。処理を分割し,DBアクセスなどの処理を実行し,結果を返す---という一連の流れをそれぞれの個所で確認する。

 四つ目のテストは,ログを確認するグレーボックス・テストだ。クラウドでは内部仕様がブラックボックス化していることが多い。内部仕様を確認しながらテストするホワイトボックス・テストを実施しにくく,入力と出力だけで動作を確認するブラックボックス・テストでは不安な場合が出てくる。そこで適切な個所のログを見て,動作を確認するグレーボックス・テストが求められる。

難関乗り越えれば利用価値大きい

 以上の三つの作業を,クラウドを利用したシステム開発で実施する必要がある。実際には,いま挙げた三つの作業以外に発生する作業もあるだろう。開発が難しくなり,それに伴う工数が膨らむという現場の声が多いのもうなずける。

 ただし,これらの作業を効率化して難関を乗り越えれば,クラウドの利用価値は極めて大きくなるはずだ。多くのベテラン・エンジニアはこうした状況を「20年前のオープンシステム登場時に似ている」と見る。

 2010年以降,クラウドの普及は急速に進むと見られる。この大きな変化に現場が対応できるかが,その後の飛躍を左右する条件になるかもしれない。