以下、本実施の形態について図面を参照して説明する。
[第1の実施の形態]
図1は、第1の実施の形態の情報処理装置を示す図である。情報処理装置1は、サーバ2,3,4およびクライアント5とネットワーク6を介して接続されている。情報処理装置1は、ユーザU1によるプログラムの開発を支援する。サーバ2,3,4は、各種のサービスを提供するコンピュータ(情報処理装置と呼ばれてもよい)である。プログラムは、サーバ2,3,4により提供される各種のサービスを用いて実行される。ユーザU1は、クライアント5を操作して、情報処理装置1に対するプログラムなどの情報の入力を行う。情報処理装置1は、プログラムの実行に利用されるサービスの複数の候補からユーザU1の利用対象のサービスを選択する。
情報処理装置1は、記憶部1aおよび処理部1bを有する。記憶部1aは、RAM(Random Access Memory)などの揮発性の半導体メモリでもよいし、HDD(Hard Disk Drive)やフラッシュメモリなどの不揮発性のストレージでもよい。処理部1bは、例えば、CPU(Central Processing Unit)やDSP(Digital Signal Processor)などのプロセッサである。ただし、処理部1bは、ASIC(Application Specific Integrated Circuit)やFPGA(Field Programmable Gate Array)などの特定用途の電子回路を含んでもよい。プロセッサは、RAMなどのメモリ(記憶部1aでもよい)に記憶されたプログラムを実行する。複数のプロセッサの集合を「マルチプロセッサ」または単に「プロセッサ」と言うこともある。
記憶部1aは、処理部1bにより取得された制約条件7およびプログラム8を記憶する。制約条件7は、プログラム8の実行に伴うユーザU1のポリシー(サービスの利用方針など)に応じた制約を示す情報である。プログラム8は、ユーザによって作成されたものである。プログラム8は、サーバ2,3,4の設定やサーバ間のネットワーク6経由での処理要求を意識せずに作成されたものであってよい。
制約条件7が示す制約としては、例えば、サービスの利用に伴うコストの上限や性能の下限などが考えられる。コストとしては、例えば、サービスの利用のための費用やサービスの処理に所要される演算リソース量(プロセッサリソース量やメモリリソース量)などが考えられる。また、性能としては、サービスのレスポンス時間(あるいは、レスポンス時間の速さを示す指標値)や稼働率(あるいは、サービスに対する更新パッチのリリース頻度などのサービスの信用度を示す指標)などが考えられる。
また、記憶部1aは、ルールテーブル9を予め記憶する。ルールテーブル9は、プログラム8の中に出現し得るコード(命令の集合)のうち、特定のサービスを利用可能な処理を示すコードのパターン(コードパターン)と、利用可能なサービスの候補(利用候補)との対応関係を示す情報である。ルールテーブル9は、ルール情報と言われてもよい。ルールテーブル9には、各サービスに対応する所定のパラメータpの値も設定されている。ここで、パラメータpは、該当のサービスを選択した場合のコストまたは性能などを表す指標である。パラメータpは、制約条件7に対する入力である。
例えば、ルールテーブル9は、コードパターンP1と利用候補のサービスA1とパラメータp=a1というレコードを含む。このレコードは、プログラム内のコードパターンP1に対してサービスA1を利用可能であり、サービスA1を利用した場合のパラメータpの値がa1であることを示す。
また、ルールテーブル9は、コードパターンP1と利用候補のサービスA2とパラメータp=a2というレコードを含む。このレコードは、プログラム内のコードパターンP1に対してサービスA2を利用可能であり、サービスA2を利用した場合のパラメータpの値がa2であることを示す。
ルールテーブル9には、他のコードパターンについても同様に利用候補のサービスおよびパラメータpの値が登録される。
ここで、サーバ2,3,4は、例えば、クラウドサービスを提供するサーバコンピュータである。サーバ2,3,4は、ネットワーク6経由で受信した処理要求に応じて、予め設定されたプログラムや設定情報などを用いて処理を実行する。サーバ2,3,4が実行可能な処理としては、ネットワーク6を介して受信したメッセージを処理するもの、ネットワーク6を介して受信した要求に応じて関数を実行するもの、ネットワーク6を介して受信したデータを保存するものなどが挙げられる。
処理部1bは、制約条件7およびプログラム8を取得する。処理部1bは、制約条件7およびプログラム8を記憶部1aに格納する。処理部1bは、プログラム8を実行する際に、プログラム8に含まれるコードパターンに基づいて、サービスの複数の候補から制約条件7を満たすサービスの組を特定する。処理部1bは、特定したサービスの組によりプログラム8を実行する。
例えば、処理部1bは、プログラム8の中から、パターンマッチングにより、コードパターンP1に該当するコード8aを検出する。この場合、プログラム8はコードパターンP1を含むと言える。すると、処理部1bは、ルールテーブル9に基づいて、コード8aに対応する利用候補のサービスとして、サービスA1,A2を特定する。
また、処理部1bは、プログラム8の中から、パターンマッチングにより、ルールテーブル9に登録されたコードパターンP2に該当するコード8bを検出する。この場合、プログラム8はコードパターンP2を含むと言える。すると、処理部1bは、ルールテーブル9に基づいて、コード8bに対応する利用候補のサービスとして、サービスB1,B2を特定する。
なお、あるコードパターンに該当する1つのコードに対して選択されるサービスは、1つである。上記の例では、コード8aに対してサービスA1,A2の何れか一方が選択される。また、コード8bに対してサービスB1,B2の何れか一方が選択される。
このように、処理部1bは、プログラム8に含まれる各コードパターンを検出し、サービスの複数の候補を特定する。そして、処理部1bは、各候補に対するパラメータpをルールテーブル9から取得し、制約条件7を満たすサービスの組を特定する。一例として、選択対象のサービスの候補が、サービスA1,A2,B1,B2であり、制約条件7としてコストの総和の上限Zが与えられている場合を考える。また、パラメータpは、サービスの候補のコストの値を示すものとする。
この場合、選択可能なサービスの組は、サービスA1,B1の組、サービスA1,B2の組、サービスA2,B1の組、および、サービスA2,B2の組の4通りである。サービスA1,B1の組を選択した場合のコストの総和は、a1+b1である。サービスA1,B2の組を選択した場合のコストの総和は、a1+b2である。サービスA2,B1の組を選択した場合のコストの総和は、a2+b1である。サービスA2,B2の組を選択した場合のコストの総和は、a2+b2である。
このうち、上限Zを超過しない組は、サービスA1,B1であるとする。この場合、処理部1bは、制約条件7を満たすサービスの組として、サービスA1,B1の組を特定する。なお、上限Zを超過しない組が複数ある場合、処理部1bは、コストの総和が最小のサービスの組を特定することが考えられる。
処理部1bは、制約条件7を満たすサービスの組として、サービスA1,B1の組を特定すると、サービスA1,B1の組によりプログラム8を実行する。例えば、処理部1bは、プログラム8のコード8aの箇所を実行する際に、コード8aをサービスA1を用いるコードに変換して実行してもよい。同様に、処理部1bは、プログラム8のコード8bの箇所を実行する際に、コード8bをサービスB1を用いるコードに変換して実行してもよい。
あるいは、処理部1bは、プログラム8を、複数のサービスを組合せた分散処理ソフトウェア用のプログラム群に変換してもよい。例えば、ルールテーブル9には、コードパターンP1に対応付けて、プログラム変換用の第1のテンプレートが予め登録されていてもよい。同様に、ルールテーブル9には、コードパターンP2に対応付けて、プログラム変換用の第2のテンプレートが予め登録されていてもよい。「テンプレート」は、サービスの処理を規定する所定プログラムの書式(雛形)を示す。
例えば、第1のテンプレートは、処理要求に応じてサーバ2が特定の処理を実行するよう規定するプログラムの書式(雛形)を示す。第1のテンプレートは、例えば、サーバ2に実行させるプログラムの書式や、サーバ2に設定情報を送信するためのプログラムの書式などである。また、例えば、第2のテンプレートは、サーバ2にネットワーク6経由で処理要求を送信するプログラムの書式(雛形)を示す。
より具体的な例では、第1のテンプレートが関数プログラムの書式を示し、第2のテンプレートが関数を呼び出すプログラムの書式を示す。また、例えば、第1のテンプレートがデータ保存場所を設定するプログラムの書式を示し、第2のテンプレートがデータの書き込みや読み出しを要求するプログラムの書式を示す。
この場合、処理部1bは、コード8aから抽出した値を第1のテンプレートの引数に代入することで、サービスA1を利用する第1の変換後プログラムを生成してもよい。例えば、第1の変換後プログラムは、コード8aに対応する処理をサーバ2がサービスA1を利用して実行するよう規定する。第1の変換後プログラムは、サーバ2に適用される。例えば、第1の変換後プログラムがサーバ2に送信され、サーバ2によって第1の変換後プログラムが実行される。また、例えば、第1の変換後プログラムが規定する手順に従って所定の設定情報がサーバ2に送信されてもよい。
更に、処理部1bは、コード8bから抽出した値を第2のテンプレートの引数に代入することで、サービスB1を利用する第2の変換後プログラムを生成してもよい。例えば、第2の変換後プログラムは、コード8bに対応する処理をサーバ3がサービスB1を利用して実行するよう規定する。第2の変換後プログラムは、例えば、サーバ2とは異なるサーバ3に適用される。例えば、第2の変換後プログラムがサーバ3に送信され、サーバ3によって第2の変換後プログラムが実行される。
なお、サーバ3は、他のサービスを提供してもよい。その場合、第2のテンプレートは、サーバ3が特定の処理を実行するよう規定するプログラムの書式を兼ねている。これにより、処理部1bは、サーバ2,3上の複数のサービス(例えば、サービスA1,B1)を連携させて、プログラム8に記述された処理を実行することもできる。
情報処理装置1によれば、制約条件7とプログラム8とが取得され、取得されたプログラム8を実行する際に、プログラム8に含まれるコードパターンに基づいて、サービスの複数の候補から制約条件7を満たすサービスの組が特定される。そして、特定したサービスの組によりプログラム8が実行される。
これにより、ユーザU1による利用対象のサービスを適切に特定できる。例えば、制約条件7として、サービス利用に伴う費用などのコストの和の上限が用いられる。この場合、情報処理装置1は、ユーザU1が想定するコストを上回らないようにサービスを組合せてユーザU1に提供できる。
また、制約条件7として、サービス利用に伴う性能値を用いてもよい。例えば、性能値として、レスポンス時間の和の上限値を用いることもできる。レスポンス時間の和の上限値を下げることで(あるいは、レスポンス時間がより小さいサービスの組を選択することで)、プログラム8の実行を高速化することができる。
また、制約条件7として、稼働率の平均の下限値を用いてもよい。稼働率の平均の下限値を上げることで(あるいは、稼働率の平均がより大きいサービスの組を選択することで)、プログラム8により実現される機能の信頼性を向上することもできる。
あるいは、制約条件7として、変換後プログラムのコードの見易さを示す指標(例えば、値が大きいほど見易いことを示す)の下限値を用いることも考えられる。この場合、パラメータpは、利用候補の各サービスを利用する場合のコードの見易さを示す指標を表す。例えば、コードの見易さを示す指標の和の下限値を上げることで(あるいは、当該指標の和がより大きいサービスの組を選択することで)、変換後プログラムの見易さが向上し、当該変換後プログラムのユーザU1によるメンテナンスを容易化できる。
更に、制約条件7は、コストおよび性能値などの複数の種類のパラメータそれぞれに対する条件を含んでもよい。そして、処理部1bは、複数の種類のパラメータそれぞれに対する条件を全て満たすサービスの組を選択してもよい。また、処理部1bは、各種のパラメータに対する優先度の入力を受け付けてもよい。そして、処理部1bは、制約条件7を満たすサービスの組が複数ある場合に、優先度が高い種類のパラメータほど条件に対する評価が優位である組を選択してもよい。例えば、制約条件7が、コストおよび性能値のそれぞれに対する条件を含み、かつ、コストの優先度が性能値の優先度よりも高い場合を考える。この場合、処理部1bは、コストおよび性能値のそれぞれに対する条件を全て満たすサービスの組が複数であると、当該複数の組のうち、コストが最小の組を利用対象のサービスの組として特定することが考えられる。
なお、各種のサービスの処理の実行主体は、情報処理装置1でもよい。すなわち、情報処理装置1は、サーバ2,3,4にサービスの処理を依頼せずに、当該サービスの処理を自身で実行してもよい。あるいは、各種のサービスの処理の実行主体は、情報処理装置1およびサーバ2,3,4(他の情報処理装置)を含む情報処理システムであってもよい。この場合、情報処理装置1の機能、各種のサービスおよびプログラム8(あるいは変換後プログラム)の実行主体は、当該情報処理システムであるとも言える。
[第2の実施の形態]
図2は、第2の実施の形態の情報処理システムの例を示す図である。第2の実施の形態の情報処理システムは、複数のクラウドサービスを組合せることで実装されるアプリケーションソフトウェアの開発を支援する。第2の実施の形態の情報処理システムは、クライアント11、クラウドシステム20および開発サーバ100を含む。クライアント11、クラウドシステム20および開発サーバ100は、ネットワーク10に接続されている。ネットワーク10は、例えば、インターネットなどの広域データ通信ネットワークである。なお、開発サーバ100は、第1の実施の形態の情報処理装置1の一例である。
クライアント11は、アプリケーションソフトウェアを開発する開発者が使用するクライアントコンピュータである。クライアント11は、ネットワーク10を介して開発サーバ100にアクセスし、開発サーバ100と対話的にアプリケーションソフトウェアの開発を進める。また、クライアント11は、開発したアプリケーションソフトウェアをクラウドシステム20に配備するよう開発サーバ100に指示する。例えば、クライアント11にはWebブラウザがインストールされている。その場合、クライアント11は、Webブラウザを通じて開発サーバ100にアクセスし、開発者がWebブラウザ上でプログラムのソースコードを編集できるようにする。また、クライアント11は、アプリケーションソフトウェアの配備をWebブラウザを通じて指示する。
開発サーバ100は、クラウドシステム20に配備可能なアプリケーションソフトウェアの開発を支援するサーバコンピュータである。特に、開発サーバ100は、クラウドシステム20によって提供される複数のクラウドサービスを連携させた分散処理ソフトウェアの開発を支援する。開発サーバ100は、ネットワーク10を介してクライアント11から開発者の入力を受け付け、入力に応じてプログラムを作成して保存する。
このとき開発者は、複数のクラウドサービスを連携させるためのクラウドサービス特有の処理をプログラム中に直接記述しなくてよく、本質的な情報処理手順(コアロジック)の定義に注力することができる。すなわち、開発者は、コアロジックの全体が1つのコンピュータ上で閉じて実行されるようなプログラムを作成すればよい。開発サーバ100は、開発者からの入力によって作成されたプログラムを、複数のクラウドサービスを組合せた分散処理ソフトウェア用のプログラム群に変換する。
開発サーバ100は、クライアント11から配備の指示を受け付ける。すると、開発サーバ100は、変換後のプログラム群を用いて、そのアプリケーションソフトウェアから起動されるサービス実体(「サービスインスタンス」と言うことがある)を、クラウドシステム20に配備する。サービスインスタンスを構成する複数のインスタンスが、クラウドシステム20に含まれる複数のサーバコンピュータに分散して配備される。
インスタンスの中には、サーバコンピュータ上で予め起動して待機し、リクエストメッセージの受信などのイベント発生を待つものが含まれ得る。また、インスタンスの中には、イベント発生を契機として起動し、当該イベントに対する処理が完了すると破棄されるものが含まれ得る。サービスインスタンスの配備では、開発サーバ100は、変換後プログラムをサーバコンピュータに送信し、当該サーバコンピュータに変換後プログラムを実行させるかまたは実行可能な状態に設定する場合がある。また、開発サーバ100は、変換後プログラムに従って(例えば、変換後プログラムを実行して)、サービスインスタンスの設定を示す設定情報をサーバコンピュータに送信する場合がある。クラウドシステム20のサーバコンピュータに対して変換後プログラムや設定情報を送信する方法は、利用するクラウドサービスの規約に従うことになる。
また、開発サーバ100は、クライアント11からサービスインスタンスの停止の指示を受け付けると、変換後のプログラム群を用いて、クラウドシステム20にサービスインスタンスを停止させる。また、開発サーバ100は、クライアント11からサービスインスタンスの削除の指示を受け付けると、変換後のプログラム群を用いて、サービスインスタンスに関するデータをクラウドシステム20から削除する。このように、クライアント11が複数のクラウドサービスに対して個別に配備・停止・削除を指示しなくても、開発サーバ100が全体の配備・停止・削除を一括で実行することができる。ここで、クラウドサービスを、単に「サービス」と言うことがある。
クラウドシステム20は、1つのクラウド事業者が保有する情報処理システムであり、例えば、データセンタに設置されている。図2では1つのクラウド事業者が保有する1つのクラウドシステムのみがネットワーク10に接続されているが、複数のクラウド事業者が保有する複数のクラウドシステムがネットワーク10に接続されていてもよい。
クラウドシステム20は、PaaS(Platform as a Service)システム21、FaaS(Function as a Service)システム22およびストレージシステム23を含む複数のサブシステムを有する。PaaSシステム21、FaaSシステム22およびストレージシステム23などのサブシステムは、それぞれ1以上のサーバコンピュータを含む。PaaSシステム21は、ユーザに対してPaaSサービスを提供する。FaaSシステム22は、ユーザに対してFaaSサービスを提供する。ストレージシステム23は、ユーザに対してオブジェクトストレージサービスを提供する。このように、クラウドシステム20は、種類の異なる複数のクラウドサービスを提供している。クラウドシステム20は、データベースサービスやメッセージキューサービスなど他の種類のクラウドサービスを更に提供するサブシステムを含む。
PaaSシステム21は、アプリケーションソフトウェアを実行する基盤となるプラットフォームをユーザに使用させる。プラットフォームには、例えば、CPUやメモリなどのハードウェア、OSおよびミドルウェアが含まれる。ユーザに使用させるプラットフォームは仮想マシンである場合がある。PaaSシステム21のユーザは、プラットフォーム上にアプリケーションプログラムを配備し、PaaSシステム21に当該アプリケーションプログラムを実行させる。
FaaSシステム22は、リクエストメッセージの受信やデータ更新などのイベント発生に応じて動的に「関数」を実行する。FaaSの関数は比較的小規模な処理単位であり、比較的小さなプログラムによって実装される。FaaSシステム22のユーザは、予め関数のプログラムをFaaSシステム22にアップロードしておく。FaaSシステム22は、イベントを検出すると、検出したイベントに対応する関数のプログラムをメモリにロードして関数を実行する。関数が終了するとその関数のプログラムをメモリから削除してもよい。このように、関数は予め起動して待機するものではなく、イベント発生に応じて自動的に起動して短時間だけ実行される。Webフックにより、ストレージシステム23上のデータの更新を、関数が起動される契機となるイベントとすることもできる。
ストレージシステム23は、キーバリュー形式でオブジェクトデータを保存する軽量の不揮発性ストレージシステムである。ストレージシステム23のユーザは、「コンテナ」というデータ保存場所をストレージシステム23に登録しておく。コンテナは、例えば、ディレクトリに対応する。ストレージシステム23は、ネットワーク経由でコンテナにオブジェクトデータを書き込むためのPUT用のAPIと、ネットワーク経由でコンテナからオブジェクトデータを読み出すためのGET用のAPIを提供する。ストレージシステム23は、PUT用のAPIの呼び出しに応じてオブジェクトデータをコンテナに書き込み、GET用のAPIの呼び出しに応じてオブジェクトデータをコンテナから読み出す。
なお、FaaSシステム22の関数とストレージシステム23のコンテナの連携にあたり、FaaSシステム22がストレージシステム23の更新を監視してもよいし、ストレージシステム23がFaaSシステム22にデータ更新を通知してもよい。
以下では、このようなPaaSサービス、FaaSサービスおよびオブジェクトストレージサービスを含む複数のクラウドサービスを組合せたアプリケーションソフトウェアの開発例を説明する。特に、ある機能を実現するために利用可能なクラウドサービスは、複数存在し得る。そこで、開発サーバ100は、選択可能なクラウドサービスの候補の中から、クラウドサービスの適切な組合せの選択を支援する機能を提供する。
図3は、開発サーバのハードウェア例を示すブロック図である。開発サーバ100は、CPU101、RAM102、HDD103、画像信号処理部104、入力信号処理部105、媒体リーダ106および通信インタフェース107を有する。クライアント11も、開発サーバ100と同様のハードウェアを用いて実装できる。また、PaaSシステム21、FaaSシステム22およびストレージシステム23に用いられるサーバコンピュータも、開発サーバ100と同様のハードウェアを用いて実装できる。なお、CPU101は、第1の実施の形態の処理部1bの一例である。RAM102またはHDD103は、第1の実施の形態の記憶部1aの一例である。
CPU101は、プログラムの命令を実行するプロセッサである。CPU101は、HDD103に記憶されたプログラムやデータの少なくとも一部をRAM102にロードし、プログラムを実行する。なお、CPU101は複数のプロセッサコアを含んでもよい。また、開発サーバ100は複数のプロセッサを有してもよく、以下で説明する処理を複数のプロセッサまたはプロセッサコアを用いて並列に実行してもよい。また、複数のプロセッサの集合を「マルチプロセッサ」または単に「プロセッサ」と言うことがある。
RAM102は、CPU101が実行するプログラムやCPU101が演算に用いるデータを一時的に記憶する揮発性の半導体メモリである。なお、開発サーバ100は、RAM以外の種類のメモリを備えてもよく、複数個のメモリを備えてもよい。
HDD103は、OSやミドルウェアやアプリケーションソフトウェアなどのソフトウェアのプログラム、および、データを記憶する不揮発性の記憶装置である。なお、開発サーバ100は、フラッシュメモリやSSD(Solid State Drive)などの他の種類の記憶装置を備えてもよく、複数の不揮発性の記憶装置を備えてもよい。
画像信号処理部104は、CPU101からの命令に従って、開発サーバ100に接続されたディスプレイ111に画像を出力する。ディスプレイ111としては、CRT(Cathode Ray Tube)ディスプレイ、液晶ディスプレイ(LCD:Liquid Crystal Display)、プラズマディスプレイ、有機EL(OEL:Organic Electro-Luminescence)ディスプレイなど、任意の種類のディスプレイを用いることができる。
入力信号処理部105は、開発サーバ100に接続された入力デバイス112から入力信号を取得し、CPU101に出力する。入力デバイス112としては、マウス・タッチパネル・タッチパッド・トラックボールなどのポインティングデバイス、キーボード、リモートコントローラ、ボタンスイッチなどを用いることができる。また、開発サーバ100に、複数の種類の入力デバイスが接続されていてもよい。
媒体リーダ106は、記録媒体113に記録されたプログラムやデータを読み取る読み取り装置である。記録媒体113として、例えば、磁気ディスク、光ディスク、光磁気ディスク(MO:Magneto-Optical disk)、半導体メモリなどを使用できる。磁気ディスクには、フレキシブルディスク(FD:Flexible Disk)やHDDが含まれる。光ディスクには、CD(Compact Disc)やDVD(Digital Versatile Disc)が含まれる。
媒体リーダ106は、例えば、記録媒体113から読み取ったプログラムやデータを、RAM102やHDD103などの他の記録媒体にコピーする。読み取られたプログラムは、例えば、CPU101によって実行される。なお、記録媒体113は可搬型記録媒体であってもよく、プログラムやデータの配布に用いられることがある。また、記録媒体113やHDD103を、コンピュータ読み取り可能な記録媒体と言うことがある。
通信インタフェース107は、ネットワーク10に接続され、ネットワーク10を介してクライアント11、PaaSシステム21、FaaSシステム22、ストレージシステム23などと通信を行うインタフェースである。通信インタフェース107は、例えば、スイッチやルータなどの通信装置とケーブルで接続される。
図4は、開発サーバの機能例を示すブロック図である。開発サーバ100は、環境設定記憶部121、プログラム記憶部122、変換ルール記憶部123、実行状態記憶部124、開発UI(User Interface)部131、コンパイル部132および起動制御部133を有する。環境設定記憶部121、プログラム記憶部122、変換ルール記憶部123および実行状態記憶部124は、例えば、RAM102またはHDD103に確保した記憶領域を用いて実装される。開発UI部131、コンパイル部132および起動制御部133は、例えば、プログラムを用いて実装される。
環境設定記憶部121は、クラウドシステム20を利用するための設定を示す環境設定情報を記憶する。通常、ある開発者(ユーザ)が作成したアプリケーションソフトウェアをクラウドシステム20に配備するには、予め契約などによって当該開発者がクラウドシステム20を利用する権利を有していることを要する。そこで、環境設定記憶部121は、開発者から入力された環境設定情報を記憶する。環境設定情報は、クラウドシステム20のユーザを認証するための認証情報を含む。認証情報は、例えば、ユーザID・パスワード・アクセスキー・アクセストークン・クレデンシャルなどと呼ばれる各種の情報を含む。
同一のクラウド事業者が提供する複数のクラウドサービス、すなわち、クラウドシステム20の複数のクラウドサービスは、同一の認証情報を用いて利用できる。ただし、同一のクラウド事業者が提供する異なるクラウドサービスに対して異なる認証情報が使用されてもよい。また、クラウドシステム20以外のクラウドシステムが利用可能である場合、そのクラウドシステムに対応する環境設定情報が環境設定記憶部121に記憶される。
プログラム記憶部122は、開発者からの入力に応じて作成された変換前プログラムのソースコードを記憶する。また、プログラム記憶部122は、変換前プログラムから生成されたクラウドシステム20用の変換後プログラム群を記憶する。また、プログラム記憶部122は、開発者から入力された制約条件を示す情報を記憶する。制約条件は、変換後プログラムを生成するにあたって開発者から指定される要求や制約を示す。
変換ルール記憶部123は、単一サーバ用のプログラムをクラウドシステム20用の分散処理プログラムに変換するための複数の変換ルールを記憶する。各変換ルールは、コードパターン、テンプレート、利用可能サービスおよびコストを含む。テンプレートは、クラウドサービスを利用するための処理を引数を用いて記述したプログラムの雛形である。テンプレートの引数に、変換前プログラムから抽出した値や環境設定情報を代入することで、変換後プログラムを生成することができる。コードパターンは、変換前プログラムに含まれるどの様なコード(命令の集合)に対して当該テンプレートを適用可能かを示す。変換前プログラムの中のコードパターンに該当するコードが、テンプレートを用いてクラウド用に変換される。利用可能サービスは、該当のコードパターンに対して利用可能なクラウドサービスの識別名である。テンプレートは、利用可能サービス毎に存在する。また、1つのコードパターンに対して、複数の利用可能サービスが存在することがある。コストは、該当の利用可能サービスを利用する場合のコストである。コストの一例は、該当のサービスの利用に対してクラウド事業者からユーザに課金される費用(課金額)である。
実行状態記憶部124は、サービスインスタンスの実行状態を示す実行状態情報を記憶する。ある変換後プログラム群から1以上のサービスインスタンスを起動することができる。各サービスインスタンスにはユニークな識別情報が付与される。サービスインスタンスの実行状態は、未配備(none)、実行中(running)、停止中(terminated)および削除済み(removed)の何れかである。
開発UI部131は、クライアント11に対してユーザインタフェースを提供し、クライアント11から各種の入力を受け付ける。例えば、開発UI部131は、Webブラウザ上で表示される開発用Webページを示す画面情報をクライアント11に送信し、そのWebページ上で入力されたデータをクライアント11から受信する。開発UI部131は、クライアント11に統合開発環境(IDE:Integrated Development Environment)を提供していると言うことができ、そのIDEをクラウドIDEと言うこともできる。
開発UI部131は、クライアント11から環境設定情報を受信し、受信した環境設定情報を環境設定記憶部121に保存する。また、開発UI部131は、クライアント11からプログラムの入力を受け付け、プログラム記憶部122に記憶された変換前プログラムを更新する。また、開発UI部131は、クライアント11から制約条件の入力を受け付け、プログラム記憶部122に格納する。制約条件は、クラウドサービスの利用に関するユーザのポリシーを反映した所定の制約(例えば、課金される費用の上限額)を示す情報である。また、開発UI部131は、クライアント11からプログラム変換リクエストを受け付け、コンパイル部132にプログラム変換を指示する。また、開発UI部131は、クライアント11から実行状態変更リクエストを受け付け、起動制御部133にサービスインスタンスの配備、停止または削除を指示する。
コンパイル部132は、プログラム変換サービス(コンパイラサービス)を提供する。図4では開発UI部131とコンパイル部132が共に開発サーバ100に配置されているが、コンパイル部132を開発UI部131とは異なるサーバコンピュータに配置してもよい。コンパイル部132は、開発UI部131からの指示に応じて、単一サーバ用のプログラムをクラウドシステム20用の分散処理プログラムに変換する。このとき、コンパイル部132は、プログラム記憶部122から変換前プログラムを読み出し、変換前プログラムに含まれるコードを解析して、利用対象のクラウドサービスの組を特定する。そして、コンパイル部132は、環境設定記憶部121および変換ルール記憶部123を参照して、特定したクラウドサービスの組に応じた変換後プログラム群を生成し、生成した変換後プログラム群をプログラム記憶部122に保存する。
コンパイル部132は、サービス選択部134およびコード生成部135を有する。サービス選択部134は、変換前プログラムの中から、変換ルール記憶部123に記憶された変換ルールを適用可能なコードをパターンマッチングによって検出する。パターンマッチングは、変換前プログラムに含まれるコードと、変換ルールに含まれるコードパターンとの照合により行われる。サービス選択部134は、検出したコード毎に、利用可能なクラウドサービスの複数の候補を変換ルールから抽出する。1つのコード(あるいはコードパターン)に対して、クラウドサービスの複数の候補が存在し得る。サービス選択部134は、ユーザにより入力された制約条件に基づいて、抽出したコード毎の複数の候補の中から、利用対象のクラウドサービスの組を特定する。コード生成部135は、特定された組に属するクラウドサービスに対応する変換ルールのテンプレートに、検出されたコードから抽出した値や環境設定記憶部121に記憶された環境設定情報を適用して変換後プログラムを生成する。
起動制御部133は、サービスインスタンスの起動サービス(ランチャーサービス)を提供する。図4では開発UI部131と起動制御部133が共に開発サーバ100に配置されているが、起動制御部133を開発UI部131とは異なるサーバコンピュータに配置してもよい。また、コンパイル部132と起動制御部133とが異なるサーバコンピュータに配置されてもよい。起動制御部133は、開発UI部131からの指示に応じて、プログラム記憶部122から変換後プログラム群を読み出し、変換後プログラム群を用いてサービスインスタンスの配備、停止または削除を実行する。また、起動制御部133は、実行状態記憶部124に記憶された実行状態情報を更新する。
新たなサービスインスタンスをクラウドシステム20に配備する際には、起動制御部133は、当該サービスインスタンスに対してユニークなサービスインスタンスIDを付与する。また、起動制御部133は、クラウドシステム20に配備された既存のサービスインスタンスと競合が生じないように、変換後プログラム群の中に記載されている関数名やコンテナ名などの構成要素名をユニークな名称に変換する。例えば、起動制御部133は、付与されたサービスインスタンスIDを含むように構成要素名を変換する。
サービスインスタンスの配備では、起動制御部133は、利用対象のサービスを提供する各サブシステムに対して、所定の規約に従って(例えば、所定のAPIを用いて)作成リクエストを送信する。作成リクエストには、生成された変換後プログラムやその他の設定情報が含まれ得る。例えば、PaaSシステム21に対しては、プラットフォーム上で実行されるアプリケーションプログラムが送信され、FaaSシステム22に対しては、関数プログラムが送信される。
サービスインスタンスの停止では、起動制御部133は、サービスインスタンスの配備先の各サブシステムに対して、所定の規約に従って消去リクエストを送信する。これにより、PaaSシステム21およびFaaSシステム22などのサブシステムからサービスインスタンスに関する情報が消去される。停止状態のサービスインスタンスは再配備される可能性があるため、ストレージシステム23などのストレージサービスを提供するサブシステムに保存されたデータはまだ消去されない。サービスインスタンスの削除では、起動制御部133は、ストレージシステム23などのストレージサービスを提供するサブシステムに対して所定の規約に従って消去リクエストを送信する。これにより、ストレージサービスを提供するサブシステムに保存されたデータが消去される。
図5は、環境設定管理テーブルの例を示す図である。環境設定管理テーブル141は、環境設定記憶部121に記憶される。環境設定管理テーブル141は、クラウドシステム名および認証情報の項目を有する。クラウドシステム名の項目には、クラウドシステムの名称またはクラウド事業者の名称が登録される。図5の「Aシステム」はクラウドシステム20を示している。認証情報の項目には、開発者から入力された認証情報が登録される。図5では、PaaSシステム21、FaaSシステム22およびストレージシステム23などの各種のサブシステムが同一の認証情報によって利用可能であることを想定している。環境設定管理テーブル141には、複数のクラウドシステムの認証情報が登録されてもよく、異なる開発者から入力された認証情報が登録されてもよい。
認証に用いる情報の種類はクラウドシステムによって異なる。例えば、クラウドシステム20について、アクセスキーIDが「xxx」、秘密アクセスキーが「yyy」、地域が「us-west-2」、アカウントIDが「123」という情報が登録される。
図6は、変換前プログラムと制約条件の例を示す図である。プログラム142は、プログラム記憶部122に記憶される。プログラム142は、開発者からの入力によって作成された変換前プログラムである。図6ではプログラム142は、Node.js形式のサーバサイドスクリプトとして作成されている。
プログラム142は、HTTP(Hypertext Transfer Protocol)を用いた通信を制御するExpressモジュールと、HTTPリクエストからPOSTメソッドのデータを抽出するBodyParserモジュールを使用している。プログラム142によれば、TCP(Transmission Control Protocol)の3000番ポートでHTTPリクエストを待ち受け、URL(Uniform Resource Locator)に「/csv」を含むPOSTメソッドのHTTPリクエストが受信されたときに関数「app.post」を実行することになる。
「app.post」では、HTTPリクエストからデータ名とCSV(Comma Separated Value)形式テキストが抽出され、変数「csv」にデータ名と対応付けてCSV形式テキストが代入される。CSV形式テキストから1行ずつカンマ区切り文字列が抽出されて変数「record」に代入され、カンマを分割位置として当該カンマ区切り文字列が複数部分に分割される。そして、所定のメールアドレス宛てに電子メールが送信され、HTTPリクエストに対応するHTTPレスポンスが返信される。
制約条件143は、プログラム記憶部122に記憶されている。制約条件143は、クライアント11から受信された情報である。図6では制約条件143は、パラメータとして「Cost」を含む。「Cost」は、プログラム142をクラウドサービスを用いて実行する際に許容される課金額の上限である。図6では、課金額の上限は「100円」に設定されている。
図7は、変換前プログラムに対応する抽象構文木の例を示す図である。コンパイル部132は、プログラム142から変換後プログラム群を生成するにあたり、プログラム142を解析して抽象構文木144を生成する。抽象構文木144は、木構造に連結された複数のノードを含む。図7には、図6のプログラム142から生成されるノード群の一部を記載している。抽象構文木144は、ノード144a,144b,144c,144d,144e,144f,144g,144h,144iを含む。
ノード144aはルートノードである。ノード144aはプログラム型であり、その配下に本文に関するノードが接続される。ノード144bはノード144a配下のノードである。ノード144bは宣言文型であり、「use strict」という命令を示している。ノード144cはノード144b配下のノードである。ノード144cはリテラル型であり、「use strict」という文字列を示している。ノード144b,144cは、図6のプログラム142の1行目に対応する。
ノード144dはノード144a配下のノードである。ノード144dは変数宣言型であり、その配下に変数宣言文に関するノードが接続される。ノード144eはノード144d配下のノードである。ノード144eは変数宣言文型であり、その配下に変数名と初期値に関するノードが接続される。ノード144fはノード144e配下のノードである。ノード144fは識別子型であり、「express」という変数名を示している。ノード144gはノード144e配下のノードである。ノード144gは呼び出し文型であり、その配下に関数名と引数に関するノードが接続される。
ノード144hはノード144g配下のノードである。ノード144hは識別子型であり、「require」という関数名を示している。ノード144iはノード144g配下のノードである。ノード144iはリテラル型であり、「express」という引数を示している。ノード144e,144f,144g,144h,144iは、図6のプログラム142の2行目に対応する。このように、プログラム142の字句解析や構文解析が行われ、プログラム142の構造を示す抽象構文木144が生成される。
図8は、変換ルールテーブルの例を示す図である。変換ルールテーブル145は、変換ルール記憶部123に記憶される。変換ルールテーブル145には、配備先のクラウドシステム20について、予め複数の変換ルールが登録されている。変換ルールテーブル145は、ルールID、ルール名、コードパターン、利用可能サービス、適用条件、テンプレートおよびコストの項目を有する。
ルールIDの項目には、変換ルールを識別する識別情報が登録される。ルール名の項目には、変換ルールの特徴を表す名称が登録される。コードパターンの項目には、変換前プログラムに含まれるコードのうちテンプレートの適用対象とするコードの特徴が登録される。コードパターンは正規表現を用いて記載されてもよい。利用可能サービスの項目には該当のコードパターンに対して利用可能なクラウドサービスの名称が登録される。適用条件の項目には、テンプレートを適用する条件のうちコードパターン以外の条件が登録される。
テンプレートの項目には、引数を用いて記述された変換後プログラムの雛形が登録される。テンプレートの引数に値を代入することで、実行可能な変換後プログラムとなる。引数の値として、変換前プログラムから抽出される値や環境設定管理テーブル141に登録された認証情報が用いられることがある。図8では説明を簡単にするため、テンプレートをプログラム形式で記述していない。コストの項目には、該当のクラウドサービスを利用する場合の課金額が登録される。
ここで、あるコードパターンに対して利用可能サービスが複数存在する場合に、利用可能サービスの項目にクラウドサービスの名称が登録され、利用可能サービスが1つの場合には設定なしとなる。また、適用条件やコストの項目には何の情報も設定されないことがある。図中、「設定なし」の箇所にはハイフン記号「-」が記載されている。
例えば、変換ルールR1~R8が変換ルールテーブル145に登録される。変換ルールR1は「RunOnServer」であり、抽象構文木の中のルートノードに対して適用される。変換ルールR1は、サーバ実行環境上で呼び出されるサーバ関数の中でコード全体が実行されるように変換するテンプレートをもつ。
変換ルールR2は「DeclareContainerA1」であり、空の変数宣言に対して適用され得る。変換ルールR2は、変数に対応するコンテナを「コンテナサービスA1」を用いて作成するテンプレートをもつ。変換ルールR2は、「コンテナサービスA1」を用いる場合のコスト「C1」をもつ。
変換ルールR3は、「DeclareContainerA2」であり、空の変数宣言に対して適用され得る。変換ルールR3は、変数に対応するコンテナを「コンテナサービスA2」を用いて作成するテンプレートをもつ。変換ルールR3は、「コンテナサービスA2」を用いる場合のコスト「C2」をもつ。
変換ルールR2,R3の両方が同時に適用されることはない。
変換ルールR4は「PutInContainer」であり、ある変数に変換ルールR2または変換ルールR3を適用済みである場合に、その変数に値を代入する代入文に対して適用される。変換ルールR4は、変換ルールR2または変換ルールR3で作成されるコンテナに値を書き込むためにPUT用のAPIを呼び出すテンプレートをもつ。変換ルールR4は変換ルールR2または変換ルールR3に依存している。
変換ルールR5は「DeclareFunctionBehindContainerAF1」であり、ある変数の代入文に変換ルールR4を適用済みである場合に、その代入文の後にその変数の値を用いた演算を行う文に対して適用され得る。変換ルールR5は、FaaSシステム22用の関数を「サーバレス関数のサービスAF1」を用いて作成するテンプレートをもつ。変換ルールR5は変換ルールR4に依存している。変換ルールR5は、「サーバレス関数のサービスAF1」を用いる場合のコスト「C3」をもつ。
変換ルールR6は「DeclareFunctionBehindContainerAF2」であり、ある変数の代入文に変換ルールR4を適用済みである場合に、その代入文の後にその変数の値を用いた演算を行う文に対して適用され得る。変換ルールR6は、FaaSシステム22用の関数を「サーバレス関数のサービスAF2」を用いて作成するテンプレートをもつ。変換ルールR6は変換ルールR4に依存している。変換ルールR6は、「サーバレス関数のサービスAF2」を用いる場合のコスト「C4」をもつ。
変換ルールR5,R6の両方が同時に適用されることはない。
変換ルールR7は、「ParallelizeForOfF1FA1」であり、for-ofブロックに対して適用され得る。for-ofブロックはループ変数(iterator変数)を用いたループ処理を示す。変換ルールR7は、ループ変数に対応するコンテナを「コンテナサービスFA1」を用いて作成するテンプレートと、ループ処理に対応するFaaSシステム22用の関数を「サーバレス関数のサービスF1」を用いて作成するテンプレートをもつ。また、変換ルールR7は、「サーバレス関数のサービスF1」および「コンテナサービスFA1」を用いる場合のコスト「C5+C6」をもつ。ここで、コスト「C5」は、「サーバレス関数のサービスF1」を利用する場合のコストである。コスト「C6」は、「コンテナサービスFA1」を用いる場合のコストである。
変換ルールR8は、「ParallelizeForOfF2FA2」であり、for-ofブロックに対して適用され得る。変換ルールR8は、ループ変数に対応するコンテナを「コンテナサービスFA2」を用いて作成するテンプレートと、ループ処理に対応するFaaSシステム22用の関数を「サーバレス関数のサービスF2」を用いて作成するテンプレートをもつ。また、変換ルールR8は、「サーバレス関数のサービスF2」および「コンテナサービスFA2」を用いる場合のコスト「C7+C8」をもつ。ここで、コスト「C7」は、「サーバレス関数のサービスF2」を利用する場合のコストである。コスト「C8」は、「コンテナサービスFA2」を用いる場合のコストである。
変換ルールR7,R8の両方が同時に適用されることはない。
なお、「コンテナサービスA1」、「コンテナサービスA2」、「コンテナサービスFA1」および「コンテナサービスFA2」は、何れもオブジェクトストレージサービスである。
また、変換ルールR7,R8のテンプレートによれば、スケーラブルな処理が実現され得る。変換ルールR7,R8により、負荷に応じて自動的に並列度が変化するようにプログラムを変換可能である。例えば、負荷が高いときは、並列度を上げるスケールアウトが自動的に行われ、負荷が低いときは並列度を下げるスケールインが自動的に行われるように変換後プログラムが作成され得る。
図9は、変換ルール間の依存関係の例を示す図である。図9では、変換ルールテーブル145に設定されている適用条件に応じた変換ルール間の依存関係を例示している。例えば、変換ルール「PutInContainer」は、変換ルール「DeclareContainerA1」または変換ルール「DeclareContainerA2」に依存する。すなわち、変換ルール「DeclareContainerA1」または変換ルール「DeclareContainerA2」が適用済みの場合に限り、変換ルール「PutInContainer」が適用される。
また、変換ルール「DeclareFunctionBehindContainerAF1」および変換ルール「DeclareFunctionBehindContainerAF2」は、変換ルール「PutInContainer」に依存する。すなわち、変換ルール「PutInContainer」が適用済みの場合に限り、変換ルール「DeclareFunctionBehindContainerAF1」または変換ルール「DeclareFunctionBehindContainerAF2」が適用される。
図10は、変換前プログラムと変換ルールとの関連の例を示す図である。変換ルールテーブル145に登録された変換ルールと、プログラム142におけるコードとの対応関係は次の通りである。ここで、プログラム142におけるコードを、プログラム142の左側に付した行番号によって示す。
プログラム142の7行目のコードは、コードパターン「空の変数宣言」に対応する。したがって、プログラム142の7行目のコードには、変換ルール「DeclareContainerA1」または変換ルール「DeclareContainerA2」が適用される。
プログラム142の15行目のコードは、コードパターン「変数への代入文」に対応する。したがって、プログラム142の15行目のコードには、変換ルール「PutInContainer」が適用される。
プログラム142の12~24行目のコードは、コードパターン「代入後に変数を用いる文」に対応する。したがって、プログラム142の12~24行目のコードには、変換ルール「DeclareFunctionBehindContainerAF1」または変換ルール「DeclareFunctionBehindContainerAF2」が適用される。
プログラム142の16~22行目のコードは、コードパターン「for-ofブロック」に対応する。したがって、プログラム142の16~22行目のコードには、変換ルール「ParallelizeForOfF1FA1」または「ParallelizeForOfF2FA2」が適用される。
図11は、変換ルールテーブルに含まれるテンプレート例を示す図である。テンプレート145aは、図8の変換ルールR4(「PutInContainer」)に含まれるテンプレートである。テンプレート145aは、引数として「accessKeyId」、「secretAccessKey」および「region」を含む。この3つの引数は、環境設定管理テーブル141に登録されたアクセスキーID、秘密アクセスキーおよび地域に対応する。また、テンプレート145aは、引数として「object.name」、「property.name」および「right」を含む。この3つの引数は、変換前プログラムから抽出される変数名、キーおよび代入値に対応する。
テンプレート145aによれば、アクセスキーIDや秘密アクセスキーを用いてクラウドシステム20のストレージシステム23にアクセスし、変数に対応するコンテナにキーバリュー形式のデータを書き込む変換後プログラムが得られる。
図12は、変換後プログラムの例を示す図である。プログラム146は、プログラム記憶部122に記憶される。プログラム146は、環境設定管理テーブル141、プログラム142およびテンプレート145aから生成された変換後プログラムである。引数「accessKeyId」に環境設定管理テーブル141の「xxx」が代入されている。引数「secretAccessKey」に環境設定管理テーブル141の「yyy」が代入されている。引数「region」に環境設定管理テーブル141の「us-west-2」が代入されている。また、引数「object.name」にプログラム142の「csv」が代入されている。引数「property.name」にプログラム142の「name」が代入されている。引数「right」にプログラム142の「object」が代入されている。
プログラム146によれば、アクセスキーID「xxx」と秘密アクセスキー「yyy」を用いてストレージシステム23にアクセスし、変数「name」の値に対応付けて変数「object」の値をコンテナ「csv」に書き込むことになる。このプログラム146は、例えば、PaaSシステム21に配備されて実行される。
図13は、変換後プログラムに含まれるコンポーネント例を示す図である。プログラム142から生成される変換後プログラム群によれば、アプリケーションソフトウェアはコンポーネント147a,147b,147c,147d,147eを含む。
コンポーネント147aは、HTTPリクエストの受信に応じて一連の処理を開始するアプリケーションプログラムである。コンポーネント147aは、「/csv」を含むURLを指定したPOSTメソッドのHTTPリクエストを受信するインタフェースと、このHTTPリクエストを処理する関数を含む。コンポーネント147bは、コンテナ名が「csv」であるコンテナである。コンポーネント147bは、データを書き込むPUT用のAPIとデータを読み出すGET用のAPIをもつ。コンポーネント147cは、関数名が「splitCsv」であるFaaS用の関数である。コンポーネント147dは、コンテナ名が「record」であるコンテナである。コンポーネント147dは、データを書き込むPUT用のAPIとデータを読み出すGET用のAPIをもつ。コンポーネント147eは、関数名が「sendEmail」であるFaaS用の関数である。
コンポーネント147aは、PaaSシステム21で実行される。コンポーネント147c,147eは、FaaSシステム22で実行される。コンポーネント147b,147dは、ストレージシステム23で実行される。コンポーネント147aは、コンポーネント147bのAPIを呼び出してデータを書き込む。データが書き込まれると、Webフックによりコンポーネント147cが起動する。コンポーネント147cは、コンポーネント147bのAPIを呼び出してデータを読み出し、コンポーネント147dのAPIを呼び出してデータを書き込む。データが書き込まれると、Webフックによりコンポーネント147eが起動する。コンポーネント147eは、コンポーネント147dのAPIを呼び出してデータを読み出し、電子メールを送信する。
プログラム142からは、まず図8の変換ルールR1が適用されてコンポーネント147aが生成される。次に、プログラム142の「var csv={}」に対して図8の変換ルールR2または変換ルールR3が適用され、コンポーネント147bが生成される。次に、プログラム142の「csv[name]=object」に対して図8の変換ルールR4が適用され、コンポーネント147aがコンポーネント147bを呼び出すように更新される。
次に、プログラム142の「csv[name].split」に対して図8の変換ルールR5または変換ルールR6が適用され、コンポーネント147cが生成される。次に、プログラム142の「for(…record of…){…}」に対して図8の変換ルールR7または変換ルールR8が適用され、コンポーネント147d,147eが生成される。また、コンポーネント147cがコンポーネント147dを呼び出すように更新される。
あるコードパターンに対して複数の変換ルールが適用候補となる場合、複数の適用候補のうちの1つの変換ルールが適用される。何れの変換ルールを用いるかは、制約条件143および変換ルールテーブル145に登録された利用可能サービス毎のコストにより決定される。
図14は、実行状態管理テーブルの例を示す図である。実行状態管理テーブル148は、実行状態記憶部124に記憶される。実行状態管理テーブル148は、サービスインスタンスIDおよび実行状態の項目を有する。サービスインスタンスIDの項目には、サービスインスタンスを識別する識別情報が登録される。サービスインスタンスIDは、あるサービスインスタンスを最初に配備するときに、他のサービスインスタンスと重複しないように当該サービスインスタンスに対して付与される。
実行状態の項目には、サービスインスタンスの状態が登録される。実行状態は、未配備(none)、実行中(running)、停止中(terminated)および削除済み(removed)の何れかである。未配備は、サービスインスタンスがクラウドシステム20に配備されたことがないことを示す。実行中は、サービスインスタンスがクラウドシステム20に配備されて実行可能であることを示す。停止中は、サービスインスタンスは停止しているものの、データはまだ削除されておらず再配備が可能であることを示す。削除済みは、データが削除されて再配備が不能であることを示す。
図15は、インスタンスの配備例を示す図である。クラウドシステム20には、サービスインスタンスの構成要素としてインスタンス149a,149b,149c,149d,149eが形成される。インスタンス149aはPaaSシステム21で実行される。インスタンス149b,149cはFaaSシステム22で実行される。インスタンス149d,149eはストレージシステム23で実行される。インスタンス149aはコンポーネント147aから起動される。インスタンス149bはコンポーネント147cから起動される。インスタンス149cはコンポーネント147eから起動される。インスタンス149dはコンポーネント147bから起動される。インスタンス149eはコンポーネント147dから起動される。
インスタンス149aは、HTTPリクエストを受信すると処理を開始し、インスタンス149dにデータを送信する。インスタンス149bは、インスタンス149dがデータを保存すると処理を開始し、インスタンス149dからデータを受信し、インスタンス149eにデータを送信する。インスタンス149cは、インスタンス149eがデータを保存すると処理を開始し、インスタンス149eからデータを受信する。
開発サーバ100がクライアント11から配備リクエストを受信した場合、図15のようにインスタンス149a,149b,149c,149d,149eが形成される。ここでは、配備するサービスインスタンスのサービスインスタンスIDが「123」であるとする。すると、例えば、インスタンス149bの関数名が、サービスインスタンスIDを含むように「splitCsv_123」と変更される。また、インスタンス149cの関数名が、サービスインスタンスIDを含むように「sendEmail_123」と変更される。また、インスタンス149dのコンテナ名が、サービスインスタンスIDを含むように「csv_123」と変更される。また、インスタンス149eのコンテナ名が、サービスインスタンスIDを含むように「record_123」と変更される。
その後、開発サーバ100がクライアント11から停止リクエストを受信した場合、PaaSシステム21からインスタンス149aが消去され、FaaSシステム22からインスタンス149b,149cが消去される。ただし、ストレージシステム23のインスタンス149d,149eは、データを保持しておくため消去されない。その後、開発サーバ100がクライアント11から削除リクエストを受信した場合、ストレージシステム23からインスタンス149d,149eが消去される。
次に、開発サーバ100の処理手順について説明する。
図16は、プログラム解析の手順例を示すフローチャートである。
(S10)コンパイル部132は、変換前プログラムと制約条件143とを取得する。
(S11)サービス選択部134は、字句解析や構文解析などにより変換前プログラムを解析して、変換前プログラムの構造を示す抽象構文木を生成する。
(S12)サービス選択部134は、着目位置を抽象構文木のルートに移動する。
(S13)サービス選択部134は、直近のステップS12以降に行った、ルートから始まる深さ優先探索によって、抽象構文木に含まれる全てのノードを選択したか判断する。抽象構文木の全てのノードを選択した場合はステップS21に処理が進み、未選択のノードがある場合はステップS14に処理が進む。
(S14)サービス選択部134は、現在の着目位置から深さ優先探索によって次のノードを選択し、選択したノードに着目位置を移動する。現在の着目位置がルートである場合、ルートノードを選択する。現在の着目位置が何れかのノードであり、そのノードの配下に子ノードが存在する場合、当該子ノードを選択する。現在の着目位置がルートノード以外のノードであり、そのノードの配下に子ノードが存在しない場合、未選択の子ノードが存在する親ノードまで着目位置を戻し、当該未選択の子ノードを選択する。
(S15)サービス選択部134は、ステップS14で選択したノードに対して、変換ルールテーブル145に登録されている全ての変換ルールを選択したか判断する。全ての変換ルールを選択した場合はステップS19に処理が進み、未選択の変換ルールが存在する場合はステップS16に処理が進む。
(S16)サービス選択部134は、変換ルールテーブル145に登録されている複数の変換ルールの中から未選択の変換ルールを1つ選択する。
(S17)サービス選択部134は、ステップS14で選択したノードが、ステップS16で選択した変換ルールのコードパターンを満たすか判断する。また、サービス選択部134は、制約条件143やその他のプログラム変換状況が、ステップS16で選択した変換ルールの適用条件を満たすか判断する。コードパターンと適用条件の両方を満たす場合はステップS18に処理が進み、コードパターンと適用条件の少なくとも一方を満たさない場合はステップS15に処理が進む。ここで、ステップS17における適用条件を満たすかの判断では、ステップS16で選択した変換ルールに対して前提となる変換ルールが、変換前プログラムへの適用候補として選択済みである場合に、当該前提となる変換ルールを適用済みであるとみなしてよい。ここでは適用候補を抽出するための判定が行われ、実際に適用するか否かは後段の処理で判定されることになる。
(S18)サービス選択部134は、ステップS16で選択した変換ルールを適用候補として選択する。そして、ステップS15に処理が進む。
(S19)サービス選択部134は、現在の着目位置のノードに対して、適用候補となる変換ルールがあるか否かを判定する。現在の着目位置のノードに対して、適用候補となる変換ルールがある場合はステップS20に処理が進み、適用候補となる変換ルールがない場合はステップS13に処理が進む。
(S20)サービス選択部134は、現在の着目位置のノードに対して、1つのルールを使用する条件を作成する。また、サービス選択部134は、適用候補の変換ルールのコストをコスト関数に追加する。ここで、「1つのルールを使用する条件」とは、適用候補となる変換ルールが複数の場合に、何れか1つの変換ルールを選択することを示す条件である。適用候補の変換ルールが1つの場合、現在の着目位置のノードに対して「1つのルールを使用する条件」を作成しなくてよい。また、「コスト関数」とは、制約条件143により示される総コストを上回らないように変換ルール(あるいは、変換ルールに対応するサービス)を選択するための関数である。コスト関数の詳細については後述する。更に、サービス選択部134は、ある変換ルールの前提となる変換ルールがある場合、これら変換ルール間の依存関係に対応する条件を作成してもよい。そして、ステップS13に処理が進む。
(S21)サービス選択部134は、直近のステップS12以降に行った深さ優先探索の間に、抽象構文木の1以上のノードに対して変換ルールが適用されたか判断する。変換ルールが適用されたノードがある場合、サービス選択部134は、ステップS12に戻って抽象構文木の深さ優先探索を再実行する。変換ルールが適用されたノードがない場合、ステップS22に処理が進む。
(S22)サービス選択部134は、制約条件143とコスト関数とに基づいて、変換前プログラムに対して見出された変換ルールの複数の適用候補の中から、利用対象のサービスの組合せを決定する。そして、プログラム解析が終了する。
図17は、サービス組合せ決定の手順例を示すフローチャートである。このサービス組合せ決定は、上記のステップS22で実行される。
(S30)サービス選択部134は、制約条件143と上記のステップS20で作成した条件とを、コスト関数に適用する。
(S31)サービス選択部134は、コスト関数を満たすサービスの組合せがあるか否かを判定する。コスト関数を満たすサービスの組合せがある場合、ステップS32に処理が進み、コスト関数を満たすサービスの組合せがない場合、ステップS34に処理が進む。
(S32)サービス選択部134は、利用するサービスの組合せを最小コストの組合せに決定する。すなわち、コスト関数を満たすサービスの組合せが複数の場合、サービス選択部134は、複数の組合せのうち、最小コストの組合せを利用対象の組合せとして決定する。
(S33)サービス選択部134は、決定した組合せを出力する。例えば、サービス選択部134は、ステップS32で決定した組合せを含む画面情報を生成し、生成した画面情報をクライアント11に送信する。クライアント11のWebブラウザには、当該画面情報に基づいて、利用対象のサービスの組合せが表示される。そして、サービス組合せ決定が終了する。
(S34)サービス選択部134は、制約条件を満たすサービスの組合せが存在しないことを出力する。例えば、サービス選択部134は、制約条件を満たすサービスの組合せが存在しない旨を示すメッセージをクライアント11に送信する。クライアント11のWebブラウザには、当該メッセージの内容が表示される。そして、サービス組合せ決定が終了する。
このように、サービス選択部134は、コードパターンに対するサービスの候補とコストとを示す変換ルールテーブル145を参照して、制約条件143に応じたコスト関数と、変換前プログラムに対応するサービスの複数の候補とを決定する。そして、サービス選択部134は、コスト関数に基づいて、ユーザにより利用対象となるサービスの組を複数の候補の中から特定する。
ここで、コスト関数は、サービスの複数の候補それぞれのコストに対する演算(あるいは、演算式)を含む。サービス選択部134は、サービスの複数の候補のうちの第1の候補および第2の候補の選択の条件を示す条件式を生成し、条件式を適用した演算に基づいて、サービスの組を特定する。これにより、あるコードパターンに対して競合するサービスが複数ある場合に、何れかのサービスを適切に選択可能になる。
また、前述のように、変換ルールテーブル145は、第1のコードパターンに対するサービスの複数の第1の候補と、第2のコードパターンに対するサービスの複数の第2の候補とを含んでいる。そして、サービス選択部134は、変換前プログラムに含まれる第1のコードパターンに対して複数の第1の候補のうちの1つを選択し、変換前プログラムに含まれる第2のコードパターンに対して複数の第2の候補のうちの1つを選択する。これにより、あるコードパターンに対して競合するサービスが複数ある場合に、ユーザのポリシーに応じた制約条件143を満たしたサービスを提供可能になる。
図18は、コストの例を示す図である。ここで、図18では、作成可能サービスインスタンスとして、図8で例示したサービス名の末尾のアルファベットと数字との結合(「A1」など)のみを図示している。また、一例として、コストの単位は「円」である。
例えば、オブジェクトストレージサービスである「コンテナサービスA1」、「コンテナサービスA2」、「コンテナサービスFA1」および「コンテナサービスFA2」それぞれのコストの値は、次の通りであるとする。「コンテナサービスA1」のコストC1は10である。「コンテナサービスA2」のコストC2は20である。「コンテナサービスFA1」のコストC6は10である。「コンテナサービスFA2」のコストC8は30である。
また、FaaSサービスである「サーバレス関数のサービスF1」、「サーバレス関数のサービスF2」、「サーバレス関数のサービスAF1」および「サーバレス関数のサービスAF2」それぞれのコストの値は、次の通りであるとする。「サーバレス関数のサービスF1」のコストC5は20である。「サーバレス関数のサービスF2」のコストC7は50である。「サーバレス関数のサービスAF1」のコストC3は30である。「サーバレス関数のサービスAF2」のコストC4は50である。
図19は、コスト関数の例を示す図である。図19(A)は、コスト関数に用いられる変数と、変数に設定される値の意味を示す。変数A1は、「コンテナサービスA1」を使用するか否かを示す変数である。変数A2は、「コンテナサービスA2」を使用するか否かを示す変数である。変数FA1は、「コンテナサービスFA1」を使用するか否かを示す変数である。変数FA2は、「コンテナサービスFA2」を使用するか否かを示す変数である。変数F1は、「サーバレス関数のサービスF1」を使用するか否かを示す変数である。変数F2は、「サーバレス関数のサービスF2」を使用するか否かを示す変数である。変数AF1は、「サーバレス関数のサービスAF1」を使用するか否かを示す変数である。変数AF2は、「サーバレス関数のサービスAF2」を使用するか否かを示す変数である。ここで、変数A1,A2,FA1,FA2,F1,F2,AF1,AF2それぞれは、「True」が該当のサービスの使用を示し、「False」が該当のサービスの不使用を示す。
図19(B)は、サービスの選択に関する条件を示す。当該条件は、上記のステップS20で作成される。例えば、条件を表す条件式「A1 xor A2 = True」は、競合する2つのサービスである「コンテナサービスA1」および「コンテナサービスA2」の何れか一方が利用対象として選択されることを示す。変換ルールテーブル145によれば、その他に、「AF1 xor AF2 = True」、「FA1 xor FA2 = True」および「F1 xor F2 = True」という条件式も作成される。
なお、競合する2つのサービスのうちの一方を選択する旨の条件式以外の条件式が作成されてもよい。例えば、「A1 and (A5 xor A6) = True」(「コンテナサービスA1」を利用する場合に「サービスA5」または「サービスA6」の何れか一方を利用する)といった複雑な条件式も考えられる。
図19(C)は、プログラム142に対して作成されるコスト関数の例を示す。このコスト関数(あるいは、コスト関数の演算式)は、「A1*C1+A2*C2+FA1*C6+FA2*C8+F1*C5+F2*C7+AF1*C3+AF2*C4<=C」と表される。ここで、Cは、制約条件143により入力された「Cost」の値である。
また、「A1*C1」の項は、「A1=True」のときに「C1」であり、「A1=False」のときに「0」である。また、条件式「A1 xor A2 = True」によれば、「A1=True」のとき「A2=False」であり、「A1=False」のとき「A2=True」である。コスト関数の他の項についても同様である。
図20は、コスト関数による判定例を示す図である。図18の各コストの値とC=100と図19(B)の条件式とに対して、図19(C)のコスト関数により許容されるサービスの各組に対する総コストがコスト関数を満たすか否かが判定される。
図20(A)は、サービスA2,AF1,F2,FA2の組を選択した場合(パタンa)である。パタンaの場合、C2+C3+C7+C8=20+30+50+30=130>C(=100)であり、コスト関数を満たさない。したがって、サービスA2,AF1,F2,FA2の組は、不採用となる。
図20(B)は、サービスA1,AF1,F1,FA1の組を選択した場合(パタンb)である。パタンbの場合、C1+C3+C5+C6=10+30+20+10=70<C(=100)であり、コスト関数を満たす。したがって、サービスA1,AF1,F1,FA1の組は、採用となる。
図20(C)は、サービスA2,AF2,F1,FA1の組を選択した場合(パタンc)である。パタンcの場合、C2+C4+C5+C6=20+50+20+10=100=C(=100)であり、コスト関数を満たす。ただし、パタンcよりも総コストが小さいパタンbが存在する。したがって、パタンcよりもパタンbが優先して選択され、サービスA2,AF2,F1,FA1の組は、不採用となる。
図21は、出力画面の例を示す図である。出力画面40の画面情報は、サービス選択部134により生成され、クライアント11に送信される。クライアント11のWebブラウザは、画面情報を受信し、クライアント11のディスプレイに出力画面40を表示させる。
出力画面40は、入力内容領域41、サービス選択結果領域42、選択可能サービス領域43、キャンセルボタン44および確定ボタン45を含む。
入力内容領域41は、ユーザにより入力されたプログラム142や制約条件143を表す画像が表示される領域である。サービス選択結果領域42は、開発サーバ100によるサービスの選択結果を表す画像が表示される領域である。例えば、サービス選択結果領域42には、図19(B)のパタンbのサービスA1,AF1,F1,FA1の組、サービスA1,AF1,F1,FA1それぞれのコスト、および、合計コスト「70円」という画像が表示される。
選択可能サービス領域43は、選択可能なその他のサービスを表す画像が表示される領域である。例えば、ユーザは、Webブラウザを操作して、サービス選択結果領域42に選択済みのサービスのうちの一部を、選択可能サービス領域43に表示された別のサービスに変更することができる。サービスの変更に応じて、合計コストが再計算されて、合計コストの表示も変更される。
キャンセルボタン44は、現在の入力内容およびサービス選択結果のキャンセルを入力するためのボタンである。例えば、ユーザは、キャンセルボタン44を押下操作することで、現在の入力内容およびサービス選択結果をキャンセルし、別の入力内容を入力できる。
確定ボタン45は、現在の入力内容およびサービス選択結果を確定し、変換後プログラムの生成と、サービス選択結果領域42に表示された各サービスの起動とを開発サーバ100に指示するためのボタンである。開発サーバ100は、確定ボタン45の選択を受け付けると、プログラム142および変換ルールテーブル145に基づいて、選択されたサービスの組に応じた変換後プログラムを生成する。開発サーバ100は、生成した変換後プログラムにより、選択された各サービスを起動する。
次に、変換前プログラムに変換ルールを適用して変換後プログラムを生成する手順を説明する。変換ルールとして、出力画面40で確定された各サービスに対応する変換ルールが用いられる。例えば、サービスA1,AF1,F1,FA1の組が選択された場合、変換前プログラムに対する適用対象の変換ルールは、図8の変換ルールR1,R2,R4,R5,R7である。
図22は、変換ルール適用の手順例を示すフローチャートである。
(S40)コード生成部135は、変換前プログラムの抽象構文木から未適用の変換ルールの適用対象のノードを特定する。未適用の変換ルールは、図21の出力画面40で確定された各サービスに対応する変換ルールの中から選択される。
(S41)コード生成部135は、ステップS40で特定したノードに対する変換ルールに含まれるテンプレートの引数を特定する。コード生成部135は、着目するノードの中から、特定した引数に対応する値を抽出する。抽出する値としては、例えば、変換前プログラムで使用されている変数名や関数名などが挙げられる。また、コード生成部135は、抽出した値を、変換後プログラムの中でユニークな値になるように変更する。
(S42)コード生成部135は、環境設定管理テーブル141から、利用するクラウドシステム20に対応する認証情報を読み出す。コード生成部135は、読み出した認証情報の中から、ステップS41で特定した引数に対応する値を抽出する。
(S43)コード生成部135は、ステップS41,S42で抽出した値をテンプレートの引数に対して代入し、変換後プログラムを生成する。例えば、コード生成部135は、引数を示す所定の文字列を、ステップS41,S42で抽出した値に置換する。
(S44)コード生成部135は、ステップS43で生成した変換後プログラムを、変換後プログラム群に挿入する。なお、1つの変換前プログラムから、複数のクラウドサービスを利用するための複数の断片的プログラムが生成され得る。
(S45)コード生成部135は、適用対象の変換ルールを全て適用済みであるか否かを判定する。全て適用済みの場合、変換ルール適用が終了し、未適用の変換ルールがある場合、ステップS40に処理が進む。
次に、変換後プログラム群によるクラウドサービスの起動手順を説明する。
図23は、起動サービスの手順例を示すフローチャートである。
(S50)開発UI部131は、実行状態変更リクエストを受信する。実行状態変更リクエストは、配備リクエスト、停止リクエストまたは削除リクエストである。
(S51)起動制御部133は、実行状態変更リクエストが指定するサービスインスタンスに対してサービスインスタンスIDが既に割り当てられているか判断する。配備されたことのない新規のサービスインスタンスに対してはサービスインスタンスIDが未割り当てである。既存のサービスインスタンスの再配備、停止または削除の際には、実行状態変更リクエストにサービスインスタンスIDが含まれていてもよい。サービスインスタンスIDが割り当て済みである場合はステップS54に処理が進み、サービスインスタンスIDが未割り当てである場合はステップS52に処理が進む。
(S52)起動制御部133は、新規のサービスインスタンスIDを生成し、生成したサービスインスタンスIDを実行状態管理テーブル148に登録する。
(S53)起動制御部133は、ステップS52のサービスインスタンスIDに対応する実行状態を未配備(none)に初期化する。
(S54)起動制御部133は、実行状態を変更するサービスインスタンスに対応する変換後プログラム群から、FaaSの関数名やコンテナ名などの構成要素名を検索する。起動制御部133は、他のサービスインスタンスと競合しないように、その構成要素名をユニークな名称に変更する。例えば、変換後プログラム群に記載された関数名やコンテナ名の末尾に、サービスインスタンスIDなどのリテラルを付加する。
(S55)起動制御部133は、受け付けた実行状態変更リクエストが配備リクエストであるか判断する。実行状態変更リクエストが配備リクエストである場合はステップS56に処理が進み、それ以外の場合はステップS60に処理が進む。
(S56)起動制御部133は、実行状態管理テーブル148に登録された実行状態が未配備(none)または停止中(terminated)であるか判断する。実行状態が未配備または停止中である場合、ステップS57に処理が進む。実行状態がそれ以外である場合、すなわち、実行状態が実行中(running)または削除済み(removed)である場合、ステップS59に処理が進む。
(S57)起動制御部133は、ステップS54で書き換えた変換後プログラム群を用いて、PaaSシステム21、FaaSシステム22およびストレージシステム23と通信し、サービスインスタンスをクラウドシステム20に配備する。例えば、起動制御部133は、PaaSシステム21やFaaSシステム22に実行させたい変換後プログラムを送信することがある。送信された変換後プログラムはすぐに実行される場合もあるし、所定のイベントが発生したときに実行される場合もある。また、起動制御部133は、変換後プログラムに規定された手順を実行することで、設定情報を送信することがある。例えば、起動制御部133は、ストレージシステム23にコンテナ名を含む設定情報を送信する。
(S58)起動制御部133は、実行状態管理テーブル148に登録された実行状態を実行中(running)に変更する。そして、起動サービスが終了する。
(S59)起動制御部133は、実行状態変更リクエストが拒否されたことを示すエラーメッセージを生成する。開発UI部131は、エラーメッセージを返信する。
図24は、起動サービスの手順例を示すフローチャート(続き)である。
(S60)起動制御部133は、受け付けた実行状態変更リクエストが停止リクエストであるか判断する。実行状態変更リクエストが停止リクエストである場合はステップS61に処理が進み、それ以外の場合はステップS64に処理が進む。
(S61)起動制御部133は、実行状態管理テーブル148に登録された実行状態が実行中(running)であるか判断する。実行状態が実行中である場合、ステップS62に処理が進む。実行状態がそれ以外である場合、すなわち、実行状態が未配備(none)、停止中(terminated)または削除済み(removed)である場合、ステップS59に処理が進む。
(S62)起動制御部133は、ステップS54で書き換えた変換後プログラム群を用いて、PaaSシステム21、FaaSシステム22およびストレージシステム23と通信し、クラウドシステム20にサービスインスタンスを停止させる。起動制御部133は、変換後プログラムに規定された手順を実行することで、設定情報を送信することがある。例えば、PaaSシステム21のアプリケーションやFaaSシステム22の関数が消去される。
(S63)起動制御部133は、実行状態管理テーブル148に登録された実行状態を停止中(terminated)に変更する。そして、起動サービスが終了する。
(S64)起動制御部133は、受け付けた実行状態変更リクエストが削除リクエストであるか判断する。実行状態変更リクエストが削除リクエストである場合はステップS65に処理が進み、それ以外の場合は起動サービスが終了する。
(S65)起動制御部133は、実行状態管理テーブル148に登録された実行状態が停止中(terminated)であるか判断する。実行状態が停止中である場合、ステップS66に処理が進む。実行状態がそれ以外である場合、すなわち、実行状態が未配備(none)、実行中(running)または削除済み(removed)である場合、ステップS59に処理が進む。
(S66)起動制御部133は、ステップS54で書き換えた変換後プログラム群を用いて、PaaSシステム21、FaaSシステム22およびストレージシステム23と通信し、クラウドシステム20にサービスインスタンスを削除させる。例えば、ストレージシステム23のコンテナが消去される。
(S67)起動制御部133は、実行状態管理テーブル148に登録された実行状態を削除済み(removed)に変更する。そして、起動サービスが終了する。
このように、変換ルールテーブル145は、サービスの処理を規定する所定プログラムの書式を示すテンプレートを含む。そして、コード生成部135は、サービスの組が特定されると、プログラムの中のコードパターンに該当するコードに対応する処理を実行するよう規定する変換後プログラム(他のプログラム)を、特定されたサービスの組に属するサービスに対するテンプレートに基づいて生成する。起動制御部133は、変換後プログラム(他のプログラム)に基づいて、特定されたサービスの組に属するサービスをネットワーク経由でクラウドシステム20に属する各サブシステム(サブシステムに属するサーバコンピュータなどの情報処理装置)に配備する。これにより、開発サーバ100により特定されたサービスの組にて、変換前プログラムに対応する分散処理ソフトウェアが各サブシステムにより実行される。
開発サーバ100によれば、ユーザの制約条件に合う、利用対象のサービスを適切に特定できる。
例示したように、制約条件143として、サービス利用に伴うコストの和の上限を用いることで、ユーザが想定するコストを上回らないようにサービスを組合せてユーザに提供できる。ただし、制約条件143の内容は、コストの和の上限に限られない。
例えば、コストに代わるパラメータとして、サービス利用に伴う性能値に関する上限値や下限値が制約条件143に設定されてもよい。これにより、ユーザが想定する性能を満たすようにサービスを組合せてユーザに提供できる。例えば、レスポンス時間の和の上限値を制約条件143として用いることが考えられる。レスポンス時間の和の上限値を下げることで(あるいは、レスポンス時間の和がより小さくなるサービスの組を選択することで)、変換後プログラム群による分散処理ソフトウェアの実行を高速化することもできる。
また、例えば、稼働率の平均の下限値を制約条件143として用いることで、分散処理ソフトウェアにより実現される機能の信頼性を向上することもできる。稼働率あるいはサービスの信用度に関する1つの指標として、該当のサービスのプログラムに対するベンダによる更新パッチのリリース頻度が挙げられる。更新パッチのリリース頻度が高いほど、更新適用のための該当のサービスの停止頻度も上がり、稼働率が低下するためである。
あるいは、コストに代わるパラメータとして、変換後プログラムのコードの見易さを示す指標(値が大きいほどが見易いことを表すとする)の下限値が制約条件143に設定されてもよい。例えば、コードの見易さを示す指標の和の下限値を上げることで(あるいは、指標の和がより大きくなるサービスの組を選択することで)、変換後プログラムの見易さが向上し、変換後プログラムのユーザによるメンテナンスを容易化できる。
また、制約条件143として、コストおよび性能値などの複数の種類のパラメータそれぞれに対する条件を用いてもよい。この場合、サービス選択部134は、複数の種類のパラメータそれぞれに対する条件を全て満たすサービスの組を選択する。また、サービス選択部134は、開発UI部131を介して、各種のパラメータに対する優先度の入力を受け付けてもよい。そして、処理部1bは、制約条件143を満たすサービスの組が複数ある場合に、優先度が高い種類のパラメータほど条件に対する評価が優位である組を選択してもよい。例えば、制約条件143が、コストおよび性能値のそれぞれに対する条件を含み、かつ、コストの優先度が性能値の優先度よりも高い場合を考える。この場合、サービス選択部134は、コストおよび性能値のそれぞれに対する条件を全て満たすサービスの組が複数であると、当該複数の組のうち、コストが最小の組を利用対象のサービスの組として特定することが考えられる。
このように、制約条件には、ユーザに対する課金額などのコスト、レスポンス時間などの性能値、あるいは、変換後プログラムのコードの見易さを示す指標など、種々のパラメータを利用可能である。サービス選択部134は、コードパターンに対するサービスの候補とサービスの候補に対応するパラメータの値とを示す情報を参照して、パラメータの値の組が制約条件を満たすサービスの組を特定してもよい。これにより、ユーザが重視するポリシーに応じたパラメータを利用可能になり、ユーザのポリシーに適合したサービスを適切に提供可能になる。
更に、第2の実施の形態の情報処理システムによれば、コアロジック全体が1つのコンピュータ上で閉じて実行されるようなプログラムを開発者が作成すれば、そのプログラムから複数のクラウドサービスを利用し連携させるプログラム群が生成される。よって、開発者はクラウド事業者が独自に規定したAPIや規約を学習しなくてもよく、学習コストを低減することができる。また、開発者は複数のクラウドサービスに分散する断片的なプログラムや設定情報を直接記述しなくてよく、コアロジックの定義に注力することができる。よって、複数のクラウドサービスを利用するアプリケーションソフトウェアの開発効率が向上する。また、複数のクラウドサービスに対するプログラムや設定情報の送信が、開発者に代わって開発サーバ100によって一括して行われる。よって、開発者が個別にクラウドサービスにアクセスしなくてよく、サービスインスタンスの配備を効率化できる。
なお、第2の実施の形態の情報処理システムは、複数の計算ノード(例えば、サーバブレードや情報処理ユニットなど)を含む大規模なコンピュータ(あるいは、コンピュータシステム)により実現されてもよい。この場合、第1の計算ノードが開発サーバ100の機能を実行し、複数の第2の計算ノードが複数のサブシステムの機能を実行してもよい。
すなわち、当該コンピュータに属する第1の計算ノードが、制約条件とプログラムとを取得し、取得したプログラムを実行する際に、プログラムに含まれるコードパターンに基づいて、サービスの複数の候補から制約条件を満たすサービスの組を特定してもよい。第1の計算ノードが、取得したプログラムから特定したサービスの組に応じた変換後プログラムを生成してもよい。また、当該コンピュータに属する複数の第2の計算ノードが、特定されたサービスの組によりプログラム(あるいは変換後プログラム)を実行してもよい。
[第3の実施の形態]
以下、第3の実施の形態を説明する。前述の第2の実施の形態と相違する事項を主に説明し、共通する事項の説明を省略する。
第3の実施の形態の情報処理システムの装置構成は、図2で例示した第2の実施の形態の情報処理システムの装置構成と同様である。そこで、第3の実施の形態でも、第2の実施の形態と同じ符号・名称を用いて各構成を記述する。
ここで、制約条件に対するコスト関数は、利用されるサービス間の関係に応じて変わることがある。例えば、制約条件として、可用性を用いる場合を考える。可用性を表す指標の1つに、稼働率が挙げられる。稼働率のような性能に対する制約条件もコスト関数により表わされる。稼働率を表すコスト関数は、利用するサービス間の関係に応じて変わり得る。
図25は、サービス間の関係の例を示す図である。図25では、サービスs1,s2,s3の連携方法に応じたサービスs1,s2,s3の間の関係の2つの候補を例示している。サービス間の関係(接続関係)は、サービスをノード、あるサービスから別のサービスの呼び出しをエッジとしたグラフによって表される。
図25(A)は、グラフ151を示す。グラフ151は、サービスs1からサービスs2,s3の何れか一方が呼び出される関係を示す。例えば、サービスs2,s3が相互に相手のサービス処理を代替可能である場合、サービスs1が稼働し、かつ、サービスs2,s3の何れか一方が稼働していれば、ユーザは、サービスs1,s2,s3の連携により実現されるアプリケーションを利用できる。
図25(B)は、グラフ152を示す。グラフ152は、サービスs1からサービスs2を呼び出し、サービスs2からサービスs3が呼び出される関係を示す。この場合、サービスs1,s2,s3の全てが稼働していなければ、ユーザは、サービスs1,s2,s3の連携により実現されるアプリケーションを利用できない。
例えば、稼働率として、動作可能時間(MTBF:Mean Time Between Failures)と動作不能時間(MTTR:Mean Time To Recovery)との和に対する動作可能時間の比(MTBF/(MTBF+MTTR))を用いる場合を考える。この場合、グラフ151に対応するサービス構成での稼働率を表すコスト関数と、グラフ152に対応するサービス構成での稼働率を表すコスト関数は、相違する。このように、サービス間の関係に応じて、コスト関数が変わることがある。サービス間の関係は、ユーザによるプログラム142の記述に応じて決まる。そこで、第3の実施の形態では、開発サーバ100は、サービス間の関係に応じて適切なコスト関数を使用して、利用するサービスの選択を支援する機能を提供する。
図26は、第3の実施の形態の開発サーバの機能例を示すブロック図である。開発サーバ100は、図4で例示した機能に加えて、更に、コスト関数記憶部125およびサービス構成モデル記憶部126を有する。コスト関数記憶部125およびサービス構成モデル記憶部126は、例えば、RAM102またはHDD103に確保した記憶領域を用いて実装される。
コスト関数記憶部125は、サービス構成のパタンに対応するコスト関数を、当該パタン毎に予め記憶する。サービス構成モデル記憶部126は、サービス選択部134により以下に示す処理によって特定されたサービス構成を、ユーザ毎に記憶する。例えば、ユーザは、クライアント11のWebブラウザを用いて、開発サーバ100にアクセスし、既存のアプリケーションソフトウェアに対応するサービス構成を確認することができる。
サービス選択部134は、第2の実施の形態の機能に加えて、ユーザにより入力されたプログラムに対応するサービス構成の特定と、当該サービス構成に応じたコスト関数の選択とを行う。サービス選択部134は、ユーザにより入力されたプログラムの抽象構文木を深さ優先探索で解析することで、サービス構成を表すグラフを生成する。サービス選択部134は、生成したグラフで表されるサービス構成と、コスト関数記憶部125に記憶されたサービス構成のパタンとを照合し、生成したグラフに対応するコスト関数をコスト関数記憶部125から取得する。サービス選択部134は、取得したコスト関数を用いて、利用するサービスを選択する。
図27は、変換前プログラムと制約条件の例を示す図である。プログラム142は、プログラム記憶部122に記憶される。プログラム142は、図6で例示した変換前プログラムと同じである。
制約条件143aは、プログラム記憶部122に記憶されている。制約条件143aは、クライアント11から受信された情報である。図27では制約条件143aは、パラメータとして「Availability」を含む。「Availability」は、プログラム142をクラウドサービスを用いて実行する際に許容される稼働率の下限である。図27では、稼働率の下限は「99%」に設定されている。
制約条件143aとして、稼働率を用いる場合、変換ルール記憶部123に記憶された変換ルールテーブル145のコストの項目には、各利用サービスの稼働率が予め登録される。
図28は、コスト関数テーブルの例を示す図である。コスト関数テーブル153は、コスト関数記憶部125に記憶される。コスト関数テーブル153は、グラフ情報およびコスト関数の項目を含む。グラフ情報の項目には、予め用意されたサービス構成のパタンを示すグラフデータが登録される。コスト関数の項目には、当該サービス構成のパタンに対応するコスト関数が登録される。例えば、コスト関数テーブル153には、グラフ情報「graph1」に対して、コスト関数「func1」が登録されている。
サービス選択部134は、ユーザにより記述されたプログラムに対して生成したグラフが、グラフ情報「graph1」に適合する場合、サービスの選択にコスト関数「func1」を利用できる。すなわち、サービス選択部134は、生成したグラフで示されるサービス候補間の接続関係が、グラフ情報「graph1」で示されるサービス間の接続関係に適合する場合に、サービスの選択にコスト関数「func1」を利用できる。コスト関数テーブル153には、サービス構成(サービス間の接続関係)の複数のパタンに応じた複数のグラフデータが予め登録される。
図29は、サービス構成モデルの例を示す図である。グラフ154は、プログラム142に対応するサービス構成モデルを示すグラフである。グラフ154は、ノード154a,154b,154c,154dおよびエッジ155a,155b,155cを有する。
ノード154aは、変換ルールテーブル145におけるルールID「R2」、「R3」のコンテナサービスA1,A2に対して作成されるノードである。ルールID「R2」、「R3」は、抽象構文木144におけるコンテナ名「csv」のコンテナを作成するノードに対して適用される。このため、サービス選択部134は、ノード154aのノード名を「S_csv」とする。接頭辞の「S_」は、コンテナ作成に対応するノードであることを示す。後述するように、サービス選択部134は、サービスインスタンス名をノード名とすることができる。
サービス選択部134は、ノード154aに対応する選択候補のサービスとして、コンテナサービスA1,A2の識別情報156a(「Services:[A1,A2]」)をノード154aに設定する。
エッジ155aは、ノード154aを起点とするエッジである。サービス選択部134は、変換ルールテーブル145におけるルールID「R2」、「R3」に対応するテンプレートを参照することで、選択候補のサービス(コンテナサービスA1,A2)に対して用意されたAPIを特定する。例えば、サービス選択部134は、ノード154aに対して、API「getObject」をテンプレートから特定し、ノード154aを起点とするエッジ155aとして追加する。サービス選択部134は、API情報157a(「api:getObject」)を、エッジ155aに設定する。
ここで、ルール名「PutInContainer」が適用される抽象構文木144のノードも、コンテナ名「csv」のコンテナに対する操作である。ただし、当該操作は、コンテナ名「csv」のコンテナに対する単なるPUT操作であるため、サービス選択部134は、グラフ154に対して新規にノードを追加しない。
ノード154bは、変換ルールテーブル145におけるルールID「R5」、「R6」のサーバレス関数のサービスAF1,AF2に対して作成されるノードである。ルールID「R5」、「R6」は、抽象構文木144におけるコンテナ名「csv」のコンテナに代入された値を用いるノードに対して適用される。このため、サービス選択部134は、ノード154bのノード名を「F_csv」とする。接頭辞の「F_」は、コンテナに代入された値に対する処理に対応するノードであることを示す。サービス選択部134は、ノード154bに対応する選択候補のサービスとして、サーバレス関数のサービスAF1,AF2の識別情報156b(「Services:[AF1,AF2]」)をノード154bに設定する。
また、サービス選択部134は、抽象構文木144またはプログラム142から、ルールID「R5」、「R6」の適用の前提となるコンテナのコンテナ名「csv」を特定する。このため、サービス選択部134は、エッジ155aの終点にノード154bを接続する。
エッジ155bは、ノード154bを起点とするエッジである。サービス選択部134は、変換ルールテーブル145におけるルールID「R5」、「R6」に対応するテンプレートを参照することで、選択候補のサービス(サーバレス関数のサービスAF1,AF2)に対して用意されたAPIを特定する。例えば、サービス選択部134は、ノード154bに対して、API「putObject」をテンプレートから特定し、ノード154bを起点とするエッジ155bとして追加する。サービス選択部134は、API情報157b(「api:putObject」)を、エッジ155bに設定する。
ノード154cは、変換ルールテーブル145におけるルールID「R7」、「R8」のコンテナサービスFA1,FA2に対して作成されるノードである。ルールID「R7」、「R8」のコンテナサービスFA1,FA2に関するルールは、抽象構文木144におけるコンテナ名「record」のコンテナを作成するノードに対して適用される。このため、サービス選択部134は、ノード154cのノード名を「S_record」とする。サービス選択部134は、ノード154cに対応する選択候補のサービスとして、コンテナサービスFA1,FA2の識別情報156c(Services:[FA1,FA2])をノード154cに設定する。
また、サービス選択部134は、抽象構文木144におけるコンテナ名「record」のコンテナを作成するノードが、前段のノード154bに対応する処理のスコープ内にあることを特定する。このため、サービス選択部134は、ノード154bを起点とするエッジ155bの終点に、ノード154cを接続する。サービス選択部134は、プログラム142の記述に基づいて、コンテナ名「record」のコンテナ作成処理が、前段のノード154bに対応する処理のスコープ内にあることを特定してもよい。なお、サービス選択部134は、後述するノード154dについても同様に、ノード154bに対応する処理のスコープ内にあることを特定することができる。
エッジ155cは、ノード154cを起点とするエッジである。サービス選択部134は、変換ルールテーブル145におけるルールID「R7」、「R8」に対応するテンプレートを参照することで、選択候補のサービス(コンテナサービスFA1,FA2)に対して用意されたAPIを特定する。例えば、サービス選択部134は、ノード154cに対して、API「invokeFunction」をテンプレートから特定し、ノード154cを起点とするエッジ155cとして追加する。サービス選択部134は、API情報157c(「api:invokeFunction」)を、エッジ155cに設定する。
ノード154dは、変換ルールテーブル145におけるルールID「R7」、「R8」のサーバレス関数のサービスF1,F2に対して作成されるノードである。ルールID「R7」、「R8」のサーバレス関数のサービスF1,F2に関するルールは、抽象構文木144におけるコンテナ名「record」のコンテナ作成処理からの関数呼び出しのノードに対して適用される。このため、サービス選択部134は、ノード154dのノード名を「F_record」とする。サービス選択部134は、ノード154dに対応する選択候補のサービスとして、サーバレス関数のサービスF1,F2の識別情報156d(「Services:[F1,F2]」)をノード154dに設定する。サービス選択部134は、サーバレス関数のサービスF1,F2が他のサービスを呼び出さないので、ノード154dを起点とするエッジを作成しない。
なお、上記で示したグラフ154のノード名は、一例であり、他のノードと区別可能であればよい。例えば、サービス選択部134は、抽象構文木144における変換ルールの適用対象のノードに、当該変換ルールを適用して得られるコード片からリソース名(サービスインスタンス名)を抽出してグラフ154のノード名としてもよい。この場合、例えば、サービス選択部134は、図15のサービスインスタンスの構成で例示したサービスインスタンス名を、ルール適用後のコード片から抽出してグラフのノード名とする。より具体的には、サービス選択部134は、プログラム142に対し、ノード154aのノード名を「csv」、ノード154bのノード名を「splitCsv」、ノード154cのノード名を「record」、ノード154dのノード名を「sendEmail」のように決定してもよい。そして、サービス選択部134は、当該サービスインスタンス間の接続をエッジで表す。
このようにして、サービス選択部134は、プログラム142に対するサービス構造モデルを表すグラフ154を生成する。
次に、第3の実施の形態の開発サーバ100の処理手順を説明する。
図30は、プログラム解析の手順例を示すフローチャートである。第3の実施の形態では、図16で例示した第2の実施の形態の手順のステップS20に代えて、ステップS23,S24を含む点が異なる。ステップS19 Yesの場合に、ステップS23が実行される。ステップS23,S24は、サービス選択部134がユーザにより入力されたプログラムからサービス構成モデルを示すグラフを作成する処理である。また、ステップS22では、ステップS23,S24の結果(サービス構成モデルを示すグラフ)に応じた処理を実行する。そこで、以下では、ステップS23,S24を主に説明し、ステップS10~S22の説明を省略する。
(S23)サービス選択部134は、抽象構文木144における該当のノードに変換ルールを適用して得られるコード片からリソースを抽出してグラフのノードとする。ここで、「抽象構文木144における該当のノード」とは、ステップS14で選択されている抽象構文木144のノードを示す。例えば、サービス選択部134は、作成対象のサービスインスタンス名をリソースとして抽出し、当該グラフのノードのノード名に設定する。サービス選択部134は、元エッジがあれば当該グラフのノードを元エッジと接続する。「元エッジ」とは、今回グラフに追加したノードに対応するサービスの呼出元であるサービスに対応するノードを起点とするエッジである。なお、前述のルール名「PutInContainer」が適用される処理のように、既存のノードで示されるリソースへの単なるPUT操作については、サービス選択部134は、新たなノードを追加せずに、ステップS13に処理を進めてよい。
(S24)サービス選択部134は、ステップS23で追加したノードに対応する変換ルールのテンプレートを参照して、当該ノードにエッジを追加する。サービス選択部134は、サービスインスタンス間の呼出確率、使用されたルール名、および、クラウドサービスにおけるAPIの情報を、追加したエッジに設定する。なお、サービス選択部134は、ステップS23で追加したノードにエッジを追加しない場合、ステップS24をスキップしてもよい。そして、ステップS13に処理が進む。
ここで、ステップS24では、サービス選択部134は、ステップS23で追加したノードに対応する変換ルールのテンプレートに基づいて、次のサービスインスタンスの呼出確率を特定することが考えられる。
呼出確率は、例えば、次のサービスを呼出すためのAPIが複数ある場合における各APIの利用割合である。例えば、サービス選択部134は、提供されている全てのAPIからどのルートを使用するかに応じて計算される。あるいは、サービスインスタンスによる各APIの利用割合の情報は、変換ルール記憶部123に予め格納されてもよい。この場合、サービス選択部134は、変換ルール記憶部123を参照して、グラフ中のあるノードを起点とするエッジについて、当該エッジに対応するAPIの利用割合(すなわち、当該APIを利用して次のサービスを呼出す呼出確率)を特定できる。例えば、テンプレートのコードに基づいて利用割合を特定する方法の他にも、サービスインスタンスによる各APIの過去の利用割合の実績を変換ルール記憶部123に格納しておき、当該利用割合を用いることも考えられる。
サービス選択部134は、図30の手順により、例えば、プログラム142に対してサービス構成モデルを示すグラフ154を生成する。サービス選択部134は、例えば、プログラム142に対して作成したグラフ154の情報を、サービス構成モデル記憶部126に格納する。ステップS22では、サービス選択部134は、グラフ154に基づいてコスト関数を取得し、サービスを選択する。
図31は、サービス組合せ決定の手順例を示すフローチャートである。第3の実施の形態では、図17で例示した第2の実施の形態の手順のステップS30の前に、ステップS29を含む点が異なる。そこで、以下では、ステップS29を説明し、ステップS30~S34の説明を省略する。
(S29)サービス選択部134は、コスト関数記憶部125に記憶されたコスト関数テーブル153を参照して、図30の手順で作成されたグラフで示されるサービス構造モデルに対応するコスト関数を選択する。例えば、サービス選択部134は、図30の手順で作成したグラフと、コスト関数テーブル153に記憶されたグラフ情報とを照合し、作成したグラフの木構造に最も良く一致するグラフ情報を特定する。サービス選択部134は、特定したグラフ情報に対応付けられたコスト関数を、コスト関数テーブル153から取得する。そして、ステップS30に処理が進む。
サービス選択部134は、ステップS29で選択したコスト関数を用いて、ステップS30以降の手順を実行する。このように、サービス選択部134は、ユーザにより入力されたプログラムのコードパターンに基づいて、サービスの候補間の接続関係を特定し、接続関係に応じたコスト関数を決定する。
なお、図31の例では、コストとして稼働率を想定している。このため、ステップS32では、利用するサービスの組合せを最大コスト(すなわち、最大稼働率)の組合せに決定する点に注意されたい。ただし、コストとして他のパラメータを用いる場合には、第2の実施の形態で例示したように、ステップS32において最小コストの組合せに決定することもあり得る。
また、開発UI部131は、クライアント11のWebブラウザの要求に応じて、グラフ154の情報(ノードやエッジに付与した情報を含む)をクライアント11に送信し、プログラム142に対するサービス構成モデルをユーザに提供することができる。
次に、サービス構成モデルに応じたコスト関数の例を説明する。
図32は、サービス構成モデルに応じたコスト関数の例を示す図である。コストとして、稼働率を考える。図32(A)は、サービスに対する条件の例を示す。図32(A)の条件は、図19(B)で例示した条件と同じである。変数A1,A2,AF1,AF2,FA1,FA2,F1,F2の意味は、図19で説明した意味と同じである。
また、「コンテナサービスA1」の稼働率を「a1」とする。「コンテナサービスA2」の稼働率を「a2」とする。「サーバレス関数のサービスAF1」の稼働率を「af1」とする。「サーバレス関数のサービスAF2」の稼働率を「af2」とする。「コンテナサービスFA1」の稼働率を「fa1」とする。「コンテナサービスFA2」の稼働率を「fa2」とする。「サーバレス関数のサービスF1」の稼働率を「f1」とする。「サーバレス関数のサービスF2」の稼働率を「f2」とする。
図32(B)は、コスト関数の例(その1)を示す。コスト関数161は、サービス構成モデル158に対応するコスト関数である。サービス構成モデル158では、「コンテナサービスA1(またはA2)」、「サーバレス関数のサービスAF1(またはAF2)」、「コンテナサービスFA1(またはFA2)」、「サーバレス関数のサービスF1(またはF2)」が直列に接続される。
この場合、コスト関数161は、(a1 or a2)*(fa1 or fa2)*(f1 or f2)*(af1 or af2)>=Aである。「or」演算は、「or」の左右に記述された稼働率の何れか一方を選択することを示す。
図32(C)は、コスト関数の例(その2)を示す。コスト関数162は、サービス構成モデル159に対応するコスト関数である。サービス構成モデル159では、「コンテナサービスA1(またはA2)」に対して、「サーバレス関数のサービスF1(またはF2)」と、「サーバレス関数のサービスAF1(またはAF2)」とが並列に接続される。また、「サーバレス関数のサービスAF1(またはAF2)」に対して、更に、「コンテナサービスFA1(またはFA2)」が接続される。
ここで、「コンテナサービスA1(またはA2)」から「サーバレス関数のサービスF1(またはF2)」への呼出確率はp1(0<p1<1)である。更に、「コンテナサービスA1(またはA2)」から「サーバレス関数のサービスAF1(またはAF2)」への呼出確率はp2(0<p2<1)である。なお、p1+p2=1である。
この場合、コスト関数162は、R1*p1+(R2*(a1 or a2))*p2>=Aである。ここで、R1=(a1 or a2)*(f1 or f2)である。また、R2=(af1 or af2)*(fa1 or fa2)である。
上記のように、コスト関数は、ユーザによって入力されたプログラムに対応するサービス構成モデルに応じて異なることがある。サービス選択部134は、ユーザによって入力されたプログラムから、当該プログラムの機能をクラウドサービスとして実装するためのサービス構成モデルを特定し、当該サービス構成モデルに応じたコスト関数を選択する。
特に、サービス選択部134は、サービスの候補間の接続関係を特定する際に、サービスの候補間の呼出確率を取得する。そして、サービス選択部134は、サービスの候補間の接続関係に含まれる当該呼出確率に基づいてコスト関数を決定してもよい。例えば、サービス構成モデル159に対してサービス選択部134がコスト関数テーブル153から抽出したコスト関数には、呼出確率を設定可能なパラメータが予め用意される。サービス選択部134は、当該パラメータに対して今回のサービス候補における呼出確率を代入することで、サービス選択に用いるコスト関数を決定する。
なお、上記のコスト関数は一例であり、サービス構成モデル158,159に対して他のコスト関数を用いてもよい。
このように、第3の実施の形態の開発サーバ100によれば、サービス構成モデル(サービス候補間の接続関係)に応じた適切なコスト関数によりユーザにより利用されるサービスを選択することができる。その結果、ユーザが所望するコストや性能などの条件を満たす適切なサービスの選択が可能になる。
また、第1の実施の形態の情報処理は、処理部1bにプログラムを実行させることで実現できる。また、第2,第3の実施の形態の情報処理は、CPU101にプログラムを実行させることで実現できる。プログラムは、コンピュータ読み取り可能な記録媒体113に記録できる。
例えば、プログラムを記録した記録媒体113を配布することで、プログラムを流通させることができる。また、プログラムを他のコンピュータに格納しておき、ネットワーク経由でプログラムを配布してもよい。コンピュータは、例えば、記録媒体113に記録されたプログラムまたは他のコンピュータから受信したプログラムを、RAM102やHDD103などの記憶装置に格納し(インストールし)、当該記憶装置からプログラムを読み込んで実行してもよい。