(57)【要約】【課題】利用対象のサービスを適切に特定すること。【解決手段】情報処理装置１は、プログラム８の実行に利用されるサービスの複数の候補からユーザＵ１の利用対象のサービスを選択する。情報処理装置１は、記憶部１ａおよび処理部１ｂを有する。記憶部１ａは、制約条件７とプログラム８とを記憶する。処理部１ｂは、プログラム８を実行する際に、プログラム８に含まれるコードパターンに基づいて、サービスの複数の候補から制約条件７を満たすサービスの組を特定する。処理部１ｂは、特定したサービスの組によりプログラム８を実行する。【選択図】図１
2019109874.tif 000002
【特許請求の範囲】
【請求項１】
プログラムの実行に利用されるサービスの複数の候補からユーザの利用対象のサービスを選択する情報処理方法であって、コンピュータが、
制約条件と前記プログラムとを取得し、
取得した前記プログラムを実行する際に、前記プログラムに含まれるコードパターンに基づいて、前記複数の候補から前記制約条件を満たすサービスの組を特定し、
特定した前記サービスの組により前記プログラムを実行する、
情報処理方法。
【請求項２】
前記コードパターンに対する前記サービスの候補とコストとを示すルール情報を参照して、前記制約条件に応じたコスト関数と、前記プログラムに対応する前記複数の候補とを決定し、
前記コスト関数に基づいて、前記ユーザにより利用対象となる前記サービスの組を前記複数の候補の中から特定する、
請求項１記載の情報処理方法。
【請求項３】
前記コスト関数は、前記複数の候補それぞれの前記コストに対する演算を含み、
前記複数の候補のうちの第１の候補および第２の候補の選択の条件を示す条件式を生成し、前記条件式を適用した前記演算に基づいて、前記サービスの組を特定する、
請求項２記載の情報処理方法。
【請求項４】
前記ルール情報は、第１のコードパターンに対する前記サービスの複数の第１の候補と、第２のコードパターンに対する前記サービスの複数の第２の候補とを含み、
前記プログラムに含まれる前記第１のコードパターンに対して複数の前記第１の候補のうちの１つを選択し、前記プログラムに含まれる前記第２のコードパターンに対して複数の前記第２の候補のうちの１つを選択する、
請求項２記載の情報処理方法。
【請求項５】
前記ルール情報は、前記サービスの処理を規定する所定プログラムの書式を示すテンプレートを含み、
前記サービスの組を特定すると、前記プログラムの中の前記コードパターンに該当するコードに対応する処理を実行するよう規定する他のプログラムを、前記サービスの組に属する前記サービスに対する前記テンプレートに基づいて生成し、
前記他のプログラムに基づいて、前記サービスの組に属する前記サービスをネットワーク経由で情報処理装置に配備する、
請求項２記載の情報処理方法。
【請求項６】
前記コストは、前記サービスの利用に伴う前記ユーザに対する課金額であり、
前記制約条件は、前記ユーザに対する課金額の和の上限値である、
請求項２記載の情報処理方法。
【請求項７】
前記コードパターンに対する前記サービスの候補と前記サービスの候補に対応するパラメータの値とを示す情報を参照して、前記パラメータの値の組が前記制約条件を満たす前記サービスの組を特定する、請求項１記載の情報処理方法。
【請求項８】
前記パラメータは、前記サービスの候補を用いる場合のレスポンス時間であり、
前記制約条件は、前記プログラムの実行に対するレスポンス時間の和の上限値である、
請求項７記載の情報処理方法。
【請求項９】
前記コスト関数の決定では、前記コードパターンに基づいて前記サービスの候補間の接続関係を特定し、前記接続関係に応じた前記コスト関数を決定する、
請求項２記載の情報処理方法。
【請求項１０】
前記コスト関数の決定では、前記接続関係に含まれる前記サービスの候補間の呼出確率に基づいて前記コスト関数を決定する、
請求項９記載の情報処理方法。
【請求項１１】
プログラムの実行に利用されるサービスの複数の候補からユーザの利用対象のサービスを選択する情報処理装置であって、
制約条件と前記プログラムとを記憶する記憶部と、
前記プログラムを実行する際に、前記プログラムに含まれるコードパターンに基づいて、前記複数の候補から前記制約条件を満たすサービスの組を特定し、特定した前記サービスの組により前記プログラムを実行する処理部と、
を有する情報処理装置。
【請求項１２】
プログラムの実行に利用されるサービスの複数の候補からユーザの利用対象のサービスを選択する情報処理プログラムであって、
制約条件と前記プログラムとを取得し、
取得した前記プログラムを実行する際に、前記プログラムに含まれるコードパターンに基づいて、前記複数の候補から前記制約条件を満たすサービスの組を特定し、
特定した前記サービスの組により前記プログラムを実行する、
処理をコンピュータに実行させる情報処理プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は情報処理方法、情報処理装置および情報処理プログラムに関する。
【背景技術】
【０００２】
近年、アプリケーションソフトウェアを実行する情報処理環境を自ら所有する代わりに、サービス事業者のもつ情報処理環境をネットワーク経由で利用することが増えている。ネットワーク経由で情報処理環境を利用させるサービスはクラウドサービスと言われることがある。クラウドサービスとして利用可能な情報処理環境には、プロセッサやメモリなどの計算ハードウェア、ローカルネットワーク、ＯＳ（Operating System）やデータベースなどの基盤ソフトウェア、セキュリティ機構などが含まれ得る。
【０００３】
クラウドサービスの種類には様々なものがある。例えば、物理マシンや仮想マシンなどの単位計算リソースをユーザに貸し出し、ユーザが作成したアプリケーションプログラムをその単位計算リソース上で実行するサービスがある。また、ユーザが作成した軽量プログラムを配備し、特定のイベントが発生したときに短時間だけ当該軽量プログラムを実行するサービスや、ネットワークから受信したデータを保存するサービスがある。
【０００４】
クラウドサービスは、ユーザから予めプログラムや設定情報などを受け付け、ユーザが望む処理をクラウドサービス側の情報処理環境で実行可能になるよう設定しておく。そして、クラウドサービスは、処理要求に応じて上記の設定された処理を実行する。クラウドサービスはＡＰＩ（Application Programming Interface）を提供しており、当該クラウドサービスの外部のプログラムからはＡＰＩを用いて処理を要求することができる。そのため、あるクラウドサービスと外部のプログラム（例えば、別のクラウドサービスのプログラム）とが連携するような分散処理ソフトウェアを開発することができる。
【０００５】
なお、クラウドから確保した配備候補のインスタンスの性能とインスタンス間の性能を計測し、両性能の計測結果に基づき、顧客要件を満たす配備先のインスタンスを決定する機能配置設計装置の提案がある。
【０００６】
また、クラウドコンピューティングシステムにおけるワークロードの実行時の複数ノードのクラスタの性能特性と、当該クラスタの所望の性能特定との比較に基づき、当該クラスタのコンフィギュレーションパラメータのセットを選択するシステムの提案もある。
【０００７】
また、複数のコンポーネント配置要求のそれぞれを特徴ベクトル化し、複数の特徴ベクトルをクラスタ化することで、コンポーネント配置要求のクラスタ化を行い、各クラスタに対してコンポーネントの配置位置を決定するシステムの提案もある。
【０００８】
また、既存のレプリケーション・メカニズムを介して個別パーツの複製が可能な既存のサブ構造体を含むインフラストラクチャを識別し、当該インフラストラクチャの既存のサブ構造体をクラウドに移行する方法の提案もある。
【０００９】
更に、従来型のステートフルアプリケーションをステートレスプロセスにて動作させるために、状態情報を格納できる領域に対する全ての読み取りおよび書き込みコールを捕捉するシステムの提案もある。提案のシステムは、クラウドストレージシステムに格納され得る独立した状態情報へ当該コールをリダイレクトする仮想化レイヤを有する。
【先行技術文献】
【特許文献】
【００１０】
【特許文献１】国際公開第２０１７／０２２８２５号
【特許文献２】国際公開第２０１４／０２５５８４号
【特許文献３】国際公開第２０１３／１２０６８６号
【特許文献４】国際公開第２０１３／０５５６０１号
【特許文献５】国際公開第２０１２／０５７９５５号
【発明の概要】
【発明が解決しようとする課題】
【００１１】
ユーザが作成したプログラムに記述されたある機能を提供するクラウドサービスの候補は、複数存在し得る。例えば、データを保存するサービスには、ＲＤＢ（Relational DataBase）を提供するサービスや、ＫＶＳ（Key-Value Store）などのオブジェクトストレージを提供するサービスなど、種々のサービスが存在する。このため、ユーザは、該当の機能について、複数の候補の中から、該当のプログラムの実行のために利用するサービスを選択し得る。しかし、ユーザが、クラウド環境の利用に関する自身のポリシーに則したサービスを各機能に対して予め選択し、選択したサービスを利用するようにプログラムを作成することは容易ではない。
【００１２】
１つの側面では、本発明は、利用対象のサービスを適切に特定可能にすることを目的とする。
【課題を解決するための手段】
【００１３】
１つの態様では、プログラムの実行に利用されるサービスの複数の候補からユーザの利用対象のサービスを選択する情報処理方法が提供される。この情報処理方法では、コンピュータが、制約条件とプログラムとを取得し、取得したプログラムを実行する際に、プログラムに含まれるコードパターンに基づいて、複数の候補から制約条件を満たすサービスの組を特定し、特定したサービスの組によりプログラムを実行する。
【発明の効果】
【００１４】
１つの側面では、利用対象のサービスを適切に特定できる。
【図面の簡単な説明】
【００１５】
【図１】第１の実施の形態の情報処理装置を示す図である。
【図２】第２の実施の形態の情報処理システムの例を示す図である。
【図３】開発サーバのハードウェア例を示すブロック図である。
【図４】開発サーバの機能例を示すブロック図である。
【図５】環境設定管理テーブルの例を示す図である。
【図６】変換前プログラムと制約条件の例を示す図である。
【図７】変換前プログラムに対応する抽象構文木の例を示す図である。
【図８】変換ルールテーブルの例を示す図である。
【図９】変換ルール間の依存関係の例を示す図である。
【図１０】変換前プログラムと変換ルールとの関連の例を示す図である。
【図１１】変換ルールテーブルに含まれるテンプレート例を示す図である。
【図１２】変換後プログラムの例を示す図である。
【図１３】変換後プログラムに含まれるコンポーネント例を示す図である。
【図１４】実行状態管理テーブルの例を示す図である。
【図１５】インスタンスの配備例を示す図である。
【図１６】プログラム解析の手順例を示すフローチャートである。
【図１７】サービス組合せ決定の手順例を示すフローチャートである。
【図１８】コストの例を示す図である。
【図１９】コスト関数の例を示す図である。
【図２０】コスト関数による判定例を示す図である。
【図２１】出力画面の例を示す図である。
【図２２】変換ルール適用の手順例を示すフローチャートである。
【図２３】起動サービスの手順例を示すフローチャートである。
【図２４】起動サービスの手順例を示すフローチャート（続き）である。
【図２５】サービス間の関係の例を示す図である。
【図２６】第３の実施の形態の開発サーバの機能例を示すブロック図である。
【図２７】変換前プログラムと制約条件の例を示す図である。
【図２８】コスト関数テーブルの例を示す図である。
【図２９】サービス構成モデルの例を示す図である。
【図３０】プログラム解析の手順例を示すフローチャートである。
【図３１】サービス組合せ決定の手順例を示すフローチャートである。
【図３２】サービス構成モデルに応じたコスト関数の例を示す図である。
【発明を実施するための形態】
【００１６】
以下、本実施の形態について図面を参照して説明する。
［第１の実施の形態］
図１は、第１の実施の形態の情報処理装置を示す図である。情報処理装置１は、サーバ２，３，４およびクライアント５とネットワーク６を介して接続されている。情報処理装置１は、ユーザＵ１によるプログラムの開発を支援する。サーバ２，３，４は、各種のサービスを提供するコンピュータ（情報処理装置と呼ばれてもよい）である。プログラムは、サーバ２，３，４により提供される各種のサービスを用いて実行される。ユーザＵ１は、クライアント５を操作して、情報処理装置１に対するプログラムなどの情報の入力を行う。情報処理装置１は、プログラムの実行に利用されるサービスの複数の候補からユーザＵ１の利用対象のサービスを選択する。
【００１７】
情報処理装置１は、記憶部１ａおよび処理部１ｂを有する。記憶部１ａは、ＲＡＭ（Random Access Memory）などの揮発性の半導体メモリでもよいし、ＨＤＤ（Hard Disk Drive）やフラッシュメモリなどの不揮発性のストレージでもよい。処理部１ｂは、例えば、ＣＰＵ（Central Processing Unit）やＤＳＰ（Digital Signal Processor）などのプロセッサである。ただし、処理部１ｂは、ＡＳＩＣ（Application Specific Integrated Circuit）やＦＰＧＡ（Field Programmable Gate Array）などの特定用途の電子回路を含んでもよい。プロセッサは、ＲＡＭなどのメモリ（記憶部１ａでもよい）に記憶されたプログラムを実行する。複数のプロセッサの集合を「マルチプロセッサ」または単に「プロセッサ」と言うこともある。
【００１８】
記憶部１ａは、処理部１ｂにより取得された制約条件７およびプログラム８を記憶する。制約条件７は、プログラム８の実行に伴うユーザＵ１のポリシー（サービスの利用方針など）に応じた制約を示す情報である。プログラム８は、ユーザによって作成されたものである。プログラム８は、サーバ２，３，４の設定やサーバ間のネットワーク６経由での処理要求を意識せずに作成されたものであってよい。
【００１９】
制約条件７が示す制約としては、例えば、サービスの利用に伴うコストの上限や性能の下限などが考えられる。コストとしては、例えば、サービスの利用のための費用やサービスの処理に所要される演算リソース量（プロセッサリソース量やメモリリソース量）などが考えられる。また、性能としては、サービスのレスポンス時間（あるいは、レスポンス時間の速さを示す指標値）や稼働率（あるいは、サービスに対する更新パッチのリリース頻度などのサービスの信用度を示す指標）などが考えられる。
【００２０】
また、記憶部１ａは、ルールテーブル９を予め記憶する。ルールテーブル９は、プログラム８の中に出現し得るコード（命令の集合）のうち、特定のサービスを利用可能な処理を示すコードのパターン（コードパターン）と、利用可能なサービスの候補（利用候補）との対応関係を示す情報である。ルールテーブル９は、ルール情報と言われてもよい。ルールテーブル９には、各サービスに対応する所定のパラメータｐの値も設定されている。ここで、パラメータｐは、該当のサービスを選択した場合のコストまたは性能などを表す指標である。パラメータｐは、制約条件７に対する入力である。
【００２１】
例えば、ルールテーブル９は、コードパターンＰ１と利用候補のサービスＡ１とパラメータｐ＝ａ１というレコードを含む。このレコードは、プログラム内のコードパターンＰ１に対してサービスＡ１を利用可能であり、サービスＡ１を利用した場合のパラメータｐの値がａ１であることを示す。
【００２２】
また、ルールテーブル９は、コードパターンＰ１と利用候補のサービスＡ２とパラメータｐ＝ａ２というレコードを含む。このレコードは、プログラム内のコードパターンＰ１に対してサービスＡ２を利用可能であり、サービスＡ２を利用した場合のパラメータｐの値がａ２であることを示す。
【００２３】
ルールテーブル９には、他のコードパターンについても同様に利用候補のサービスおよびパラメータｐの値が登録される。
ここで、サーバ２，３，４は、例えば、クラウドサービスを提供するサーバコンピュータである。サーバ２，３，４は、ネットワーク６経由で受信した処理要求に応じて、予め設定されたプログラムや設定情報などを用いて処理を実行する。サーバ２，３，４が実行可能な処理としては、ネットワーク６を介して受信したメッセージを処理するもの、ネットワーク６を介して受信した要求に応じて関数を実行するもの、ネットワーク６を介して受信したデータを保存するものなどが挙げられる。
【００２４】
処理部１ｂは、制約条件７およびプログラム８を取得する。処理部１ｂは、制約条件７およびプログラム８を記憶部１ａに格納する。処理部１ｂは、プログラム８を実行する際に、プログラム８に含まれるコードパターンに基づいて、サービスの複数の候補から制約条件７を満たすサービスの組を特定する。処理部１ｂは、特定したサービスの組によりプログラム８を実行する。
【００２５】
例えば、処理部１ｂは、プログラム８の中から、パターンマッチングにより、コードパターンＰ１に該当するコード８ａを検出する。この場合、プログラム８はコードパターンＰ１を含むと言える。すると、処理部１ｂは、ルールテーブル９に基づいて、コード８ａに対応する利用候補のサービスとして、サービスＡ１，Ａ２を特定する。
【００２６】
また、処理部１ｂは、プログラム８の中から、パターンマッチングにより、ルールテーブル９に登録されたコードパターンＰ２に該当するコード８ｂを検出する。この場合、プログラム８はコードパターンＰ２を含むと言える。すると、処理部１ｂは、ルールテーブル９に基づいて、コード８ｂに対応する利用候補のサービスとして、サービスＢ１，Ｂ２を特定する。
【００２７】
なお、あるコードパターンに該当する１つのコードに対して選択されるサービスは、１つである。上記の例では、コード８ａに対してサービスＡ１，Ａ２の何れか一方が選択される。また、コード８ｂに対してサービスＢ１，Ｂ２の何れか一方が選択される。
【００２８】
このように、処理部１ｂは、プログラム８に含まれる各コードパターンを検出し、サービスの複数の候補を特定する。そして、処理部１ｂは、各候補に対するパラメータｐをルールテーブル９から取得し、制約条件７を満たすサービスの組を特定する。一例として、選択対象のサービスの候補が、サービスＡ１，Ａ２，Ｂ１，Ｂ２であり、制約条件７としてコストの総和の上限Ｚが与えられている場合を考える。また、パラメータｐは、サービスの候補のコストの値を示すものとする。
【００２９】
この場合、選択可能なサービスの組は、サービスＡ１，Ｂ１の組、サービスＡ１，Ｂ２の組、サービスＡ２，Ｂ１の組、および、サービスＡ２，Ｂ２の組の４通りである。サービスＡ１，Ｂ１の組を選択した場合のコストの総和は、ａ１＋ｂ１である。サービスＡ１，Ｂ２の組を選択した場合のコストの総和は、ａ１＋ｂ２である。サービスＡ２，Ｂ１の組を選択した場合のコストの総和は、ａ２＋ｂ１である。サービスＡ２，Ｂ２の組を選択した場合のコストの総和は、ａ２＋ｂ２である。
【００３０】
このうち、上限Ｚを超過しない組は、サービスＡ１，Ｂ１であるとする。この場合、処理部１ｂは、制約条件７を満たすサービスの組として、サービスＡ１，Ｂ１の組を特定する。なお、上限Ｚを超過しない組が複数ある場合、処理部１ｂは、コストの総和が最小のサービスの組を特定することが考えられる。
【００３１】
処理部１ｂは、制約条件７を満たすサービスの組として、サービスＡ１，Ｂ１の組を特定すると、サービスＡ１，Ｂ１の組によりプログラム８を実行する。例えば、処理部１ｂは、プログラム８のコード８ａの箇所を実行する際に、コード８ａをサービスＡ１を用いるコードに変換して実行してもよい。同様に、処理部１ｂは、プログラム８のコード８ｂの箇所を実行する際に、コード８ｂをサービスＢ１を用いるコードに変換して実行してもよい。
【００３２】
あるいは、処理部１ｂは、プログラム８を、複数のサービスを組合せた分散処理ソフトウェア用のプログラム群に変換してもよい。例えば、ルールテーブル９には、コードパターンＰ１に対応付けて、プログラム変換用の第１のテンプレートが予め登録されていてもよい。同様に、ルールテーブル９には、コードパターンＰ２に対応付けて、プログラム変換用の第２のテンプレートが予め登録されていてもよい。「テンプレート」は、サービスの処理を規定する所定プログラムの書式（雛形）を示す。
【００３３】
例えば、第１のテンプレートは、処理要求に応じてサーバ２が特定の処理を実行するよう規定するプログラムの書式（雛形）を示す。第１のテンプレートは、例えば、サーバ２に実行させるプログラムの書式や、サーバ２に設定情報を送信するためのプログラムの書式などである。また、例えば、第２のテンプレートは、サーバ２にネットワーク６経由で処理要求を送信するプログラムの書式（雛形）を示す。
【００３４】
より具体的な例では、第１のテンプレートが関数プログラムの書式を示し、第２のテンプレートが関数を呼び出すプログラムの書式を示す。また、例えば、第１のテンプレートがデータ保存場所を設定するプログラムの書式を示し、第２のテンプレートがデータの書き込みや読み出しを要求するプログラムの書式を示す。
【００３５】
この場合、処理部１ｂは、コード８ａから抽出した値を第１のテンプレートの引数に代入することで、サービスＡ１を利用する第１の変換後プログラムを生成してもよい。例えば、第１の変換後プログラムは、コード８ａに対応する処理をサーバ２がサービスＡ１を利用して実行するよう規定する。第１の変換後プログラムは、サーバ２に適用される。例えば、第１の変換後プログラムがサーバ２に送信され、サーバ２によって第１の変換後プログラムが実行される。また、例えば、第１の変換後プログラムが規定する手順に従って所定の設定情報がサーバ２に送信されてもよい。
【００３６】
更に、処理部１ｂは、コード８ｂから抽出した値を第２のテンプレートの引数に代入することで、サービスＢ１を利用する第２の変換後プログラムを生成してもよい。例えば、第２の変換後プログラムは、コード８ｂに対応する処理をサーバ３がサービスＢ１を利用して実行するよう規定する。第２の変換後プログラムは、例えば、サーバ２とは異なるサーバ３に適用される。例えば、第２の変換後プログラムがサーバ３に送信され、サーバ３によって第２の変換後プログラムが実行される。
【００３７】
なお、サーバ３は、他のサービスを提供してもよい。その場合、第２のテンプレートは、サーバ３が特定の処理を実行するよう規定するプログラムの書式を兼ねている。これにより、処理部１ｂは、サーバ２，３上の複数のサービス（例えば、サービスＡ１，Ｂ１）を連携させて、プログラム８に記述された処理を実行することもできる。
【００３８】
情報処理装置１によれば、制約条件７とプログラム８とが取得され、取得されたプログラム８を実行する際に、プログラム８に含まれるコードパターンに基づいて、サービスの複数の候補から制約条件７を満たすサービスの組が特定される。そして、特定したサービスの組によりプログラム８が実行される。
【００３９】
これにより、ユーザＵ１による利用対象のサービスを適切に特定できる。例えば、制約条件７として、サービス利用に伴う費用などのコストの和の上限が用いられる。この場合、情報処理装置１は、ユーザＵ１が想定するコストを上回らないようにサービスを組合せてユーザＵ１に提供できる。
【００４０】
また、制約条件７として、サービス利用に伴う性能値を用いてもよい。例えば、性能値として、レスポンス時間の和の上限値を用いることもできる。レスポンス時間の和の上限値を下げることで（あるいは、レスポンス時間がより小さいサービスの組を選択することで）、プログラム８の実行を高速化することができる。
【００４１】
また、制約条件７として、稼働率の平均の下限値を用いてもよい。稼働率の平均の下限値を上げることで（あるいは、稼働率の平均がより大きいサービスの組を選択することで）、プログラム８により実現される機能の信頼性を向上することもできる。
【００４２】
あるいは、制約条件７として、変換後プログラムのコードの見易さを示す指標（例えば、値が大きいほど見易いことを示す）の下限値を用いることも考えられる。この場合、パラメータｐは、利用候補の各サービスを利用する場合のコードの見易さを示す指標を表す。例えば、コードの見易さを示す指標の和の下限値を上げることで（あるいは、当該指標の和がより大きいサービスの組を選択することで）、変換後プログラムの見易さが向上し、当該変換後プログラムのユーザＵ１によるメンテナンスを容易化できる。
【００４３】
更に、制約条件７は、コストおよび性能値などの複数の種類のパラメータそれぞれに対する条件を含んでもよい。そして、処理部１ｂは、複数の種類のパラメータそれぞれに対する条件を全て満たすサービスの組を選択してもよい。また、処理部１ｂは、各種のパラメータに対する優先度の入力を受け付けてもよい。そして、処理部１ｂは、制約条件７を満たすサービスの組が複数ある場合に、優先度が高い種類のパラメータほど条件に対する評価が優位である組を選択してもよい。例えば、制約条件７が、コストおよび性能値のそれぞれに対する条件を含み、かつ、コストの優先度が性能値の優先度よりも高い場合を考える。この場合、処理部１ｂは、コストおよび性能値のそれぞれに対する条件を全て満たすサービスの組が複数であると、当該複数の組のうち、コストが最小の組を利用対象のサービスの組として特定することが考えられる。
【００４４】
なお、各種のサービスの処理の実行主体は、情報処理装置１でもよい。すなわち、情報処理装置１は、サーバ２，３，４にサービスの処理を依頼せずに、当該サービスの処理を自身で実行してもよい。あるいは、各種のサービスの処理の実行主体は、情報処理装置１およびサーバ２，３，４（他の情報処理装置）を含む情報処理システムであってもよい。この場合、情報処理装置１の機能、各種のサービスおよびプログラム８（あるいは変換後プログラム）の実行主体は、当該情報処理システムであるとも言える。
【００４５】
［第２の実施の形態］
図２は、第２の実施の形態の情報処理システムの例を示す図である。第２の実施の形態の情報処理システムは、複数のクラウドサービスを組合せることで実装されるアプリケーションソフトウェアの開発を支援する。第２の実施の形態の情報処理システムは、クライアント１１、クラウドシステム２０および開発サーバ１００を含む。クライアント１１、クラウドシステム２０および開発サーバ１００は、ネットワーク１０に接続されている。ネットワーク１０は、例えば、インターネットなどの広域データ通信ネットワークである。なお、開発サーバ１００は、第１の実施の形態の情報処理装置１の一例である。
【００４６】
クライアント１１は、アプリケーションソフトウェアを開発する開発者が使用するクライアントコンピュータである。クライアント１１は、ネットワーク１０を介して開発サーバ１００にアクセスし、開発サーバ１００と対話的にアプリケーションソフトウェアの開発を進める。また、クライアント１１は、開発したアプリケーションソフトウェアをクラウドシステム２０に配備するよう開発サーバ１００に指示する。例えば、クライアント１１にはＷｅｂブラウザがインストールされている。その場合、クライアント１１は、Ｗｅｂブラウザを通じて開発サーバ１００にアクセスし、開発者がＷｅｂブラウザ上でプログラムのソースコードを編集できるようにする。また、クライアント１１は、アプリケーションソフトウェアの配備をＷｅｂブラウザを通じて指示する。
【００４７】
開発サーバ１００は、クラウドシステム２０に配備可能なアプリケーションソフトウェアの開発を支援するサーバコンピュータである。特に、開発サーバ１００は、クラウドシステム２０によって提供される複数のクラウドサービスを連携させた分散処理ソフトウェアの開発を支援する。開発サーバ１００は、ネットワーク１０を介してクライアント１１から開発者の入力を受け付け、入力に応じてプログラムを作成して保存する。
【００４８】
このとき開発者は、複数のクラウドサービスを連携させるためのクラウドサービス特有の処理をプログラム中に直接記述しなくてよく、本質的な情報処理手順（コアロジック）の定義に注力することができる。すなわち、開発者は、コアロジックの全体が１つのコンピュータ上で閉じて実行されるようなプログラムを作成すればよい。開発サーバ１００は、開発者からの入力によって作成されたプログラムを、複数のクラウドサービスを組合せた分散処理ソフトウェア用のプログラム群に変換する。
【００４９】
開発サーバ１００は、クライアント１１から配備の指示を受け付ける。すると、開発サーバ１００は、変換後のプログラム群を用いて、そのアプリケーションソフトウェアから起動されるサービス実体（「サービスインスタンス」と言うことがある）を、クラウドシステム２０に配備する。サービスインスタンスを構成する複数のインスタンスが、クラウドシステム２０に含まれる複数のサーバコンピュータに分散して配備される。
【００５０】
インスタンスの中には、サーバコンピュータ上で予め起動して待機し、リクエストメッセージの受信などのイベント発生を待つものが含まれ得る。また、インスタンスの中には、イベント発生を契機として起動し、当該イベントに対する処理が完了すると破棄されるものが含まれ得る。サービスインスタンスの配備では、開発サーバ１００は、変換後プログラムをサーバコンピュータに送信し、当該サーバコンピュータに変換後プログラムを実行させるかまたは実行可能な状態に設定する場合がある。また、開発サーバ１００は、変換後プログラムに従って（例えば、変換後プログラムを実行して）、サービスインスタンスの設定を示す設定情報をサーバコンピュータに送信する場合がある。クラウドシステム２０のサーバコンピュータに対して変換後プログラムや設定情報を送信する方法は、利用するクラウドサービスの規約に従うことになる。
【００５１】
また、開発サーバ１００は、クライアント１１からサービスインスタンスの停止の指示を受け付けると、変換後のプログラム群を用いて、クラウドシステム２０にサービスインスタンスを停止させる。また、開発サーバ１００は、クライアント１１からサービスインスタンスの削除の指示を受け付けると、変換後のプログラム群を用いて、サービスインスタンスに関するデータをクラウドシステム２０から削除する。このように、クライアント１１が複数のクラウドサービスに対して個別に配備・停止・削除を指示しなくても、開発サーバ１００が全体の配備・停止・削除を一括で実行することができる。ここで、クラウドサービスを、単に「サービス」と言うことがある。
【００５２】
クラウドシステム２０は、１つのクラウド事業者が保有する情報処理システムであり、例えば、データセンタに設置されている。図２では１つのクラウド事業者が保有する１つのクラウドシステムのみがネットワーク１０に接続されているが、複数のクラウド事業者が保有する複数のクラウドシステムがネットワーク１０に接続されていてもよい。
【００５３】
クラウドシステム２０は、ＰａａＳ（Platform as a Service）システム２１、ＦａａＳ（Function as a Service）システム２２およびストレージシステム２３を含む複数のサブシステムを有する。ＰａａＳシステム２１、ＦａａＳシステム２２およびストレージシステム２３などのサブシステムは、それぞれ１以上のサーバコンピュータを含む。ＰａａＳシステム２１は、ユーザに対してＰａａＳサービスを提供する。ＦａａＳシステム２２は、ユーザに対してＦａａＳサービスを提供する。ストレージシステム２３は、ユーザに対してオブジェクトストレージサービスを提供する。このように、クラウドシステム２０は、種類の異なる複数のクラウドサービスを提供している。クラウドシステム２０は、データベースサービスやメッセージキューサービスなど他の種類のクラウドサービスを更に提供するサブシステムを含む。
【００５４】
ＰａａＳシステム２１は、アプリケーションソフトウェアを実行する基盤となるプラットフォームをユーザに使用させる。プラットフォームには、例えば、ＣＰＵやメモリなどのハードウェア、ＯＳおよびミドルウェアが含まれる。ユーザに使用させるプラットフォームは仮想マシンである場合がある。ＰａａＳシステム２１のユーザは、プラットフォーム上にアプリケーションプログラムを配備し、ＰａａＳシステム２１に当該アプリケーションプログラムを実行させる。
【００５５】
ＦａａＳシステム２２は、リクエストメッセージの受信やデータ更新などのイベント発生に応じて動的に「関数」を実行する。ＦａａＳの関数は比較的小規模な処理単位であり、比較的小さなプログラムによって実装される。ＦａａＳシステム２２のユーザは、予め関数のプログラムをＦａａＳシステム２２にアップロードしておく。ＦａａＳシステム２２は、イベントを検出すると、検出したイベントに対応する関数のプログラムをメモリにロードして関数を実行する。関数が終了するとその関数のプログラムをメモリから削除してもよい。このように、関数は予め起動して待機するものではなく、イベント発生に応じて自動的に起動して短時間だけ実行される。Ｗｅｂフックにより、ストレージシステム２３上のデータの更新を、関数が起動される契機となるイベントとすることもできる。
【００５６】
ストレージシステム２３は、キーバリュー形式でオブジェクトデータを保存する軽量の不揮発性ストレージシステムである。ストレージシステム２３のユーザは、「コンテナ」というデータ保存場所をストレージシステム２３に登録しておく。コンテナは、例えば、ディレクトリに対応する。ストレージシステム２３は、ネットワーク経由でコンテナにオブジェクトデータを書き込むためのＰＵＴ用のＡＰＩと、ネットワーク経由でコンテナからオブジェクトデータを読み出すためのＧＥＴ用のＡＰＩを提供する。ストレージシステム２３は、ＰＵＴ用のＡＰＩの呼び出しに応じてオブジェクトデータをコンテナに書き込み、ＧＥＴ用のＡＰＩの呼び出しに応じてオブジェクトデータをコンテナから読み出す。
【００５７】
なお、ＦａａＳシステム２２の関数とストレージシステム２３のコンテナの連携にあたり、ＦａａＳシステム２２がストレージシステム２３の更新を監視してもよいし、ストレージシステム２３がＦａａＳシステム２２にデータ更新を通知してもよい。
【００５８】
以下では、このようなＰａａＳサービス、ＦａａＳサービスおよびオブジェクトストレージサービスを含む複数のクラウドサービスを組合せたアプリケーションソフトウェアの開発例を説明する。特に、ある機能を実現するために利用可能なクラウドサービスは、複数存在し得る。そこで、開発サーバ１００は、選択可能なクラウドサービスの候補の中から、クラウドサービスの適切な組合せの選択を支援する機能を提供する。
【００５９】
図３は、開発サーバのハードウェア例を示すブロック図である。開発サーバ１００は、ＣＰＵ１０１、ＲＡＭ１０２、ＨＤＤ１０３、画像信号処理部１０４、入力信号処理部１０５、媒体リーダ１０６および通信インタフェース１０７を有する。クライアント１１も、開発サーバ１００と同様のハードウェアを用いて実装できる。また、ＰａａＳシステム２１、ＦａａＳシステム２２およびストレージシステム２３に用いられるサーバコンピュータも、開発サーバ１００と同様のハードウェアを用いて実装できる。なお、ＣＰＵ１０１は、第１の実施の形態の処理部１ｂの一例である。ＲＡＭ１０２またはＨＤＤ１０３は、第１の実施の形態の記憶部１ａの一例である。
【００６０】
ＣＰＵ１０１は、プログラムの命令を実行するプロセッサである。ＣＰＵ１０１は、ＨＤＤ１０３に記憶されたプログラムやデータの少なくとも一部をＲＡＭ１０２にロードし、プログラムを実行する。なお、ＣＰＵ１０１は複数のプロセッサコアを含んでもよい。また、開発サーバ１００は複数のプロセッサを有してもよく、以下で説明する処理を複数のプロセッサまたはプロセッサコアを用いて並列に実行してもよい。また、複数のプロセッサの集合を「マルチプロセッサ」または単に「プロセッサ」と言うことがある。
【００６１】
ＲＡＭ１０２は、ＣＰＵ１０１が実行するプログラムやＣＰＵ１０１が演算に用いるデータを一時的に記憶する揮発性の半導体メモリである。なお、開発サーバ１００は、ＲＡＭ以外の種類のメモリを備えてもよく、複数個のメモリを備えてもよい。
【００６２】
ＨＤＤ１０３は、ＯＳやミドルウェアやアプリケーションソフトウェアなどのソフトウェアのプログラム、および、データを記憶する不揮発性の記憶装置である。なお、開発サーバ１００は、フラッシュメモリやＳＳＤ（Solid State Drive）などの他の種類の記憶装置を備えてもよく、複数の不揮発性の記憶装置を備えてもよい。
【００６３】
画像信号処理部１０４は、ＣＰＵ１０１からの命令に従って、開発サーバ１００に接続されたディスプレイ１１１に画像を出力する。ディスプレイ１１１としては、ＣＲＴ（Cathode Ray Tube）ディスプレイ、液晶ディスプレイ（ＬＣＤ：Liquid Crystal Display）、プラズマディスプレイ、有機ＥＬ（ＯＥＬ：Organic Electro-Luminescence）ディスプレイなど、任意の種類のディスプレイを用いることができる。
【００６４】
入力信号処理部１０５は、開発サーバ１００に接続された入力デバイス１１２から入力信号を取得し、ＣＰＵ１０１に出力する。入力デバイス１１２としては、マウス・タッチパネル・タッチパッド・トラックボールなどのポインティングデバイス、キーボード、リモートコントローラ、ボタンスイッチなどを用いることができる。また、開発サーバ１００に、複数の種類の入力デバイスが接続されていてもよい。
【００６５】
媒体リーダ１０６は、記録媒体１１３に記録されたプログラムやデータを読み取る読み取り装置である。記録媒体１１３として、例えば、磁気ディスク、光ディスク、光磁気ディスク（ＭＯ：Magneto-Optical disk）、半導体メモリなどを使用できる。磁気ディスクには、フレキシブルディスク（ＦＤ：Flexible Disk）やＨＤＤが含まれる。光ディスクには、ＣＤ（Compact Disc）やＤＶＤ（Digital Versatile Disc）が含まれる。
【００６６】
媒体リーダ１０６は、例えば、記録媒体１１３から読み取ったプログラムやデータを、ＲＡＭ１０２やＨＤＤ１０３などの他の記録媒体にコピーする。読み取られたプログラムは、例えば、ＣＰＵ１０１によって実行される。なお、記録媒体１１３は可搬型記録媒体であってもよく、プログラムやデータの配布に用いられることがある。また、記録媒体１１３やＨＤＤ１０３を、コンピュータ読み取り可能な記録媒体と言うことがある。
【００６７】
通信インタフェース１０７は、ネットワーク１０に接続され、ネットワーク１０を介してクライアント１１、ＰａａＳシステム２１、ＦａａＳシステム２２、ストレージシステム２３などと通信を行うインタフェースである。通信インタフェース１０７は、例えば、スイッチやルータなどの通信装置とケーブルで接続される。
【００６８】
図４は、開発サーバの機能例を示すブロック図である。開発サーバ１００は、環境設定記憶部１２１、プログラム記憶部１２２、変換ルール記憶部１２３、実行状態記憶部１２４、開発ＵＩ（User Interface）部１３１、コンパイル部１３２および起動制御部１３３を有する。環境設定記憶部１２１、プログラム記憶部１２２、変換ルール記憶部１２３および実行状態記憶部１２４は、例えば、ＲＡＭ１０２またはＨＤＤ１０３に確保した記憶領域を用いて実装される。開発ＵＩ部１３１、コンパイル部１３２および起動制御部１３３は、例えば、プログラムを用いて実装される。
【００６９】
環境設定記憶部１２１は、クラウドシステム２０を利用するための設定を示す環境設定情報を記憶する。通常、ある開発者（ユーザ）が作成したアプリケーションソフトウェアをクラウドシステム２０に配備するには、予め契約などによって当該開発者がクラウドシステム２０を利用する権利を有していることを要する。そこで、環境設定記憶部１２１は、開発者から入力された環境設定情報を記憶する。環境設定情報は、クラウドシステム２０のユーザを認証するための認証情報を含む。認証情報は、例えば、ユーザＩＤ・パスワード・アクセスキー・アクセストークン・クレデンシャルなどと呼ばれる各種の情報を含む。
【００７０】
同一のクラウド事業者が提供する複数のクラウドサービス、すなわち、クラウドシステム２０の複数のクラウドサービスは、同一の認証情報を用いて利用できる。ただし、同一のクラウド事業者が提供する異なるクラウドサービスに対して異なる認証情報が使用されてもよい。また、クラウドシステム２０以外のクラウドシステムが利用可能である場合、そのクラウドシステムに対応する環境設定情報が環境設定記憶部１２１に記憶される。
【００７１】
プログラム記憶部１２２は、開発者からの入力に応じて作成された変換前プログラムのソースコードを記憶する。また、プログラム記憶部１２２は、変換前プログラムから生成されたクラウドシステム２０用の変換後プログラム群を記憶する。また、プログラム記憶部１２２は、開発者から入力された制約条件を示す情報を記憶する。制約条件は、変換後プログラムを生成するにあたって開発者から指定される要求や制約を示す。
【００７２】
変換ルール記憶部１２３は、単一サーバ用のプログラムをクラウドシステム２０用の分散処理プログラムに変換するための複数の変換ルールを記憶する。各変換ルールは、コードパターン、テンプレート、利用可能サービスおよびコストを含む。テンプレートは、クラウドサービスを利用するための処理を引数を用いて記述したプログラムの雛形である。テンプレートの引数に、変換前プログラムから抽出した値や環境設定情報を代入することで、変換後プログラムを生成することができる。コードパターンは、変換前プログラムに含まれるどの様なコード（命令の集合）に対して当該テンプレートを適用可能かを示す。変換前プログラムの中のコードパターンに該当するコードが、テンプレートを用いてクラウド用に変換される。利用可能サービスは、該当のコードパターンに対して利用可能なクラウドサービスの識別名である。テンプレートは、利用可能サービス毎に存在する。また、１つのコードパターンに対して、複数の利用可能サービスが存在することがある。コストは、該当の利用可能サービスを利用する場合のコストである。コストの一例は、該当のサービスの利用に対してクラウド事業者からユーザに課金される費用（課金額）である。
【００７３】
実行状態記憶部１２４は、サービスインスタンスの実行状態を示す実行状態情報を記憶する。ある変換後プログラム群から１以上のサービスインスタンスを起動することができる。各サービスインスタンスにはユニークな識別情報が付与される。サービスインスタンスの実行状態は、未配備（ｎｏｎｅ）、実行中（ｒｕｎｎｉｎｇ）、停止中（ｔｅｒｍｉｎａｔｅｄ）および削除済み（ｒｅｍｏｖｅｄ）の何れかである。
【００７４】
開発ＵＩ部１３１は、クライアント１１に対してユーザインタフェースを提供し、クライアント１１から各種の入力を受け付ける。例えば、開発ＵＩ部１３１は、Ｗｅｂブラウザ上で表示される開発用Ｗｅｂページを示す画面情報をクライアント１１に送信し、そのＷｅｂページ上で入力されたデータをクライアント１１から受信する。開発ＵＩ部１３１は、クライアント１１に統合開発環境（ＩＤＥ：Integrated Development Environment）を提供していると言うことができ、そのＩＤＥをクラウドＩＤＥと言うこともできる。
【００７５】
開発ＵＩ部１３１は、クライアント１１から環境設定情報を受信し、受信した環境設定情報を環境設定記憶部１２１に保存する。また、開発ＵＩ部１３１は、クライアント１１からプログラムの入力を受け付け、プログラム記憶部１２２に記憶された変換前プログラムを更新する。また、開発ＵＩ部１３１は、クライアント１１から制約条件の入力を受け付け、プログラム記憶部１２２に格納する。制約条件は、クラウドサービスの利用に関するユーザのポリシーを反映した所定の制約（例えば、課金される費用の上限額）を示す情報である。また、開発ＵＩ部１３１は、クライアント１１からプログラム変換リクエストを受け付け、コンパイル部１３２にプログラム変換を指示する。また、開発ＵＩ部１３１は、クライアント１１から実行状態変更リクエストを受け付け、起動制御部１３３にサービスインスタンスの配備、停止または削除を指示する。
【００７６】
コンパイル部１３２は、プログラム変換サービス（コンパイラサービス）を提供する。図４では開発ＵＩ部１３１とコンパイル部１３２が共に開発サーバ１００に配置されているが、コンパイル部１３２を開発ＵＩ部１３１とは異なるサーバコンピュータに配置してもよい。コンパイル部１３２は、開発ＵＩ部１３１からの指示に応じて、単一サーバ用のプログラムをクラウドシステム２０用の分散処理プログラムに変換する。このとき、コンパイル部１３２は、プログラム記憶部１２２から変換前プログラムを読み出し、変換前プログラムに含まれるコードを解析して、利用対象のクラウドサービスの組を特定する。そして、コンパイル部１３２は、環境設定記憶部１２１および変換ルール記憶部１２３を参照して、特定したクラウドサービスの組に応じた変換後プログラム群を生成し、生成した変換後プログラム群をプログラム記憶部１２２に保存する。
【００７７】
コンパイル部１３２は、サービス選択部１３４およびコード生成部１３５を有する。サービス選択部１３４は、変換前プログラムの中から、変換ルール記憶部１２３に記憶された変換ルールを適用可能なコードをパターンマッチングによって検出する。パターンマッチングは、変換前プログラムに含まれるコードと、変換ルールに含まれるコードパターンとの照合により行われる。サービス選択部１３４は、検出したコード毎に、利用可能なクラウドサービスの複数の候補を変換ルールから抽出する。１つのコード（あるいはコードパターン）に対して、クラウドサービスの複数の候補が存在し得る。サービス選択部１３４は、ユーザにより入力された制約条件に基づいて、抽出したコード毎の複数の候補の中から、利用対象のクラウドサービスの組を特定する。コード生成部１３５は、特定された組に属するクラウドサービスに対応する変換ルールのテンプレートに、検出されたコードから抽出した値や環境設定記憶部１２１に記憶された環境設定情報を適用して変換後プログラムを生成する。
【００７８】
起動制御部１３３は、サービスインスタンスの起動サービス（ランチャーサービス）を提供する。図４では開発ＵＩ部１３１と起動制御部１３３が共に開発サーバ１００に配置されているが、起動制御部１３３を開発ＵＩ部１３１とは異なるサーバコンピュータに配置してもよい。また、コンパイル部１３２と起動制御部１３３とが異なるサーバコンピュータに配置されてもよい。起動制御部１３３は、開発ＵＩ部１３１からの指示に応じて、プログラム記憶部１２２から変換後プログラム群を読み出し、変換後プログラム群を用いてサービスインスタンスの配備、停止または削除を実行する。また、起動制御部１３３は、実行状態記憶部１２４に記憶された実行状態情報を更新する。
【００７９】
新たなサービスインスタンスをクラウドシステム２０に配備する際には、起動制御部１３３は、当該サービスインスタンスに対してユニークなサービスインスタンスＩＤを付与する。また、起動制御部１３３は、クラウドシステム２０に配備された既存のサービスインスタンスと競合が生じないように、変換後プログラム群の中に記載されている関数名やコンテナ名などの構成要素名をユニークな名称に変換する。例えば、起動制御部１３３は、付与されたサービスインスタンスＩＤを含むように構成要素名を変換する。
【００８０】
サービスインスタンスの配備では、起動制御部１３３は、利用対象のサービスを提供する各サブシステムに対して、所定の規約に従って（例えば、所定のＡＰＩを用いて）作成リクエストを送信する。作成リクエストには、生成された変換後プログラムやその他の設定情報が含まれ得る。例えば、ＰａａＳシステム２１に対しては、プラットフォーム上で実行されるアプリケーションプログラムが送信され、ＦａａＳシステム２２に対しては、関数プログラムが送信される。
【００８１】
サービスインスタンスの停止では、起動制御部１３３は、サービスインスタンスの配備先の各サブシステムに対して、所定の規約に従って消去リクエストを送信する。これにより、ＰａａＳシステム２１およびＦａａＳシステム２２などのサブシステムからサービスインスタンスに関する情報が消去される。停止状態のサービスインスタンスは再配備される可能性があるため、ストレージシステム２３などのストレージサービスを提供するサブシステムに保存されたデータはまだ消去されない。サービスインスタンスの削除では、起動制御部１３３は、ストレージシステム２３などのストレージサービスを提供するサブシステムに対して所定の規約に従って消去リクエストを送信する。これにより、ストレージサービスを提供するサブシステムに保存されたデータが消去される。
【００８２】
図５は、環境設定管理テーブルの例を示す図である。環境設定管理テーブル１４１は、環境設定記憶部１２１に記憶される。環境設定管理テーブル１４１は、クラウドシステム名および認証情報の項目を有する。クラウドシステム名の項目には、クラウドシステムの名称またはクラウド事業者の名称が登録される。図５の「Ａシステム」はクラウドシステム２０を示している。認証情報の項目には、開発者から入力された認証情報が登録される。図５では、ＰａａＳシステム２１、ＦａａＳシステム２２およびストレージシステム２３などの各種のサブシステムが同一の認証情報によって利用可能であることを想定している。環境設定管理テーブル１４１には、複数のクラウドシステムの認証情報が登録されてもよく、異なる開発者から入力された認証情報が登録されてもよい。
【００８３】
認証に用いる情報の種類はクラウドシステムによって異なる。例えば、クラウドシステム２０について、アクセスキーＩＤが「ｘｘｘ」、秘密アクセスキーが「ｙｙｙ」、地域が「ｕｓ−ｗｅｓｔ−２」、アカウントＩＤが「１２３」という情報が登録される。
【００８４】
図６は、変換前プログラムと制約条件の例を示す図である。プログラム１４２は、プログラム記憶部１２２に記憶される。プログラム１４２は、開発者からの入力によって作成された変換前プログラムである。図６ではプログラム１４２は、Ｎｏｄｅ．ｊｓ形式のサーバサイドスクリプトとして作成されている。
【００８５】
プログラム１４２は、ＨＴＴＰ（Hypertext Transfer Protocol）を用いた通信を制御するＥｘｐｒｅｓｓモジュールと、ＨＴＴＰリクエストからＰＯＳＴメソッドのデータを抽出するＢｏｄｙＰａｒｓｅｒモジュールを使用している。プログラム１４２によれば、ＴＣＰ（Transmission Control Protocol）の３０００番ポートでＨＴＴＰリクエストを待ち受け、ＵＲＬ（Uniform Resource Locator）に「／ｃｓｖ」を含むＰＯＳＴメソッドのＨＴＴＰリクエストが受信されたときに関数「ａｐｐ．ｐｏｓｔ」を実行することになる。
【００８６】
「ａｐｐ．ｐｏｓｔ」では、ＨＴＴＰリクエストからデータ名とＣＳＶ（Comma Separated Value）形式テキストが抽出され、変数「ｃｓｖ」にデータ名と対応付けてＣＳＶ形式テキストが代入される。ＣＳＶ形式テキストから１行ずつカンマ区切り文字列が抽出されて変数「ｒｅｃｏｒｄ」に代入され、カンマを分割位置として当該カンマ区切り文字列が複数部分に分割される。そして、所定のメールアドレス宛てに電子メールが送信され、ＨＴＴＰリクエストに対応するＨＴＴＰレスポンスが返信される。
【００８７】
制約条件１４３は、プログラム記憶部１２２に記憶されている。制約条件１４３は、クライアント１１から受信された情報である。図６では制約条件１４３は、パラメータとして「Ｃｏｓｔ」を含む。「Ｃｏｓｔ」は、プログラム１４２をクラウドサービスを用いて実行する際に許容される課金額の上限である。図６では、課金額の上限は「１００円」に設定されている。
【００８８】
図７は、変換前プログラムに対応する抽象構文木の例を示す図である。コンパイル部１３２は、プログラム１４２から変換後プログラム群を生成するにあたり、プログラム１４２を解析して抽象構文木１４４を生成する。抽象構文木１４４は、木構造に連結された複数のノードを含む。図７には、図６のプログラム１４２から生成されるノード群の一部を記載している。抽象構文木１４４は、ノード１４４ａ，１４４ｂ，１４４ｃ，１４４ｄ，１４４ｅ，１４４ｆ，１４４ｇ，１４４ｈ，１４４ｉを含む。
【００８９】
ノード１４４ａはルートノードである。ノード１４４ａはプログラム型であり、その配下に本文に関するノードが接続される。ノード１４４ｂはノード１４４ａ配下のノードである。ノード１４４ｂは宣言文型であり、「ｕｓｅ  ｓｔｒｉｃｔ」という命令を示している。ノード１４４ｃはノード１４４ｂ配下のノードである。ノード１４４ｃはリテラル型であり、「ｕｓｅ  ｓｔｒｉｃｔ」という文字列を示している。ノード１４４ｂ，１４４ｃは、図６のプログラム１４２の１行目に対応する。
【００９０】
ノード１４４ｄはノード１４４ａ配下のノードである。ノード１４４ｄは変数宣言型であり、その配下に変数宣言文に関するノードが接続される。ノード１４４ｅはノード１４４ｄ配下のノードである。ノード１４４ｅは変数宣言文型であり、その配下に変数名と初期値に関するノードが接続される。ノード１４４ｆはノード１４４ｅ配下のノードである。ノード１４４ｆは識別子型であり、「ｅｘｐｒｅｓｓ」という変数名を示している。ノード１４４ｇはノード１４４ｅ配下のノードである。ノード１４４ｇは呼び出し文型であり、その配下に関数名と引数に関するノードが接続される。
【００９１】
ノード１４４ｈはノード１４４ｇ配下のノードである。ノード１４４ｈは識別子型であり、「ｒｅｑｕｉｒｅ」という関数名を示している。ノード１４４ｉはノード１４４ｇ配下のノードである。ノード１４４ｉはリテラル型であり、「ｅｘｐｒｅｓｓ」という引数を示している。ノード１４４ｅ，１４４ｆ，１４４ｇ，１４４ｈ，１４４ｉは、図６のプログラム１４２の２行目に対応する。このように、プログラム１４２の字句解析や構文解析が行われ、プログラム１４２の構造を示す抽象構文木１４４が生成される。
【００９２】
図８は、変換ルールテーブルの例を示す図である。変換ルールテーブル１４５は、変換ルール記憶部１２３に記憶される。変換ルールテーブル１４５には、配備先のクラウドシステム２０について、予め複数の変換ルールが登録されている。変換ルールテーブル１４５は、ルールＩＤ、ルール名、コードパターン、利用可能サービス、適用条件、テンプレートおよびコストの項目を有する。
【００９３】
ルールＩＤの項目には、変換ルールを識別する識別情報が登録される。ルール名の項目には、変換ルールの特徴を表す名称が登録される。コードパターンの項目には、変換前プログラムに含まれるコードのうちテンプレートの適用対象とするコードの特徴が登録される。コードパターンは正規表現を用いて記載されてもよい。利用可能サービスの項目には該当のコードパターンに対して利用可能なクラウドサービスの名称が登録される。適用条件の項目には、テンプレートを適用する条件のうちコードパターン以外の条件が登録される。
【００９４】
テンプレートの項目には、引数を用いて記述された変換後プログラムの雛形が登録される。テンプレートの引数に値を代入することで、実行可能な変換後プログラムとなる。引数の値として、変換前プログラムから抽出される値や環境設定管理テーブル１４１に登録された認証情報が用いられることがある。図８では説明を簡単にするため、テンプレートをプログラム形式で記述していない。コストの項目には、該当のクラウドサービスを利用する場合の課金額が登録される。
【００９５】
ここで、あるコードパターンに対して利用可能サービスが複数存在する場合に、利用可能サービスの項目にクラウドサービスの名称が登録され、利用可能サービスが１つの場合には設定なしとなる。また、適用条件やコストの項目には何の情報も設定されないことがある。図中、「設定なし」の箇所にはハイフン記号「−」が記載されている。
【００９６】
例えば、変換ルールＲ１〜Ｒ８が変換ルールテーブル１４５に登録される。変換ルールＲ１は「ＲｕｎＯｎＳｅｒｖｅｒ」であり、抽象構文木の中のルートノードに対して適用される。変換ルールＲ１は、サーバ実行環境上で呼び出されるサーバ関数の中でコード全体が実行されるように変換するテンプレートをもつ。
【００９７】
変換ルールＲ２は「ＤｅｃｌａｒｅＣｏｎｔａｉｎｅｒＡ１」であり、空の変数宣言に対して適用され得る。変換ルールＲ２は、変数に対応するコンテナを「コンテナサービスＡ１」を用いて作成するテンプレートをもつ。変換ルールＲ２は、「コンテナサービスＡ１」を用いる場合のコスト「Ｃ１」をもつ。
【００９８】
変換ルールＲ３は、「ＤｅｃｌａｒｅＣｏｎｔａｉｎｅｒＡ２」であり、空の変数宣言に対して適用され得る。変換ルールＲ３は、変数に対応するコンテナを「コンテナサービスＡ２」を用いて作成するテンプレートをもつ。変換ルールＲ３は、「コンテナサービスＡ２」を用いる場合のコスト「Ｃ２」をもつ。
【００９９】
変換ルールＲ２，Ｒ３の両方が同時に適用されることはない。
変換ルールＲ４は「ＰｕｔＩｎＣｏｎｔａｉｎｅｒ」であり、ある変数に変換ルールＲ２または変換ルールＲ３を適用済みである場合に、その変数に値を代入する代入文に対して適用される。変換ルールＲ４は、変換ルールＲ２または変換ルールＲ３で作成されるコンテナに値を書き込むためにＰＵＴ用のＡＰＩを呼び出すテンプレートをもつ。変換ルールＲ４は変換ルールＲ２または変換ルールＲ３に依存している。
【０１００】
変換ルールＲ５は「ＤｅｃｌａｒｅＦｕｎｃｔｉｏｎＢｅｈｉｎｄＣｏｎｔａｉｎｅｒＡＦ１」であり、ある変数の代入文に変換ルールＲ４を適用済みである場合に、その代入文の後にその変数の値を用いた演算を行う文に対して適用され得る。変換ルールＲ５は、ＦａａＳシステム２２用の関数を「サーバレス関数のサービスＡＦ１」を用いて作成するテンプレートをもつ。変換ルールＲ５は変換ルールＲ４に依存している。変換ルールＲ５は、「サーバレス関数のサービスＡＦ１」を用いる場合のコスト「Ｃ３」をもつ。
【０１０１】
変換ルールＲ６は「ＤｅｃｌａｒｅＦｕｎｃｔｉｏｎＢｅｈｉｎｄＣｏｎｔａｉｎｅｒＡＦ２」であり、ある変数の代入文に変換ルールＲ４を適用済みである場合に、その代入文の後にその変数の値を用いた演算を行う文に対して適用され得る。変換ルールＲ６は、ＦａａＳシステム２２用の関数を「サーバレス関数のサービスＡＦ２」を用いて作成するテンプレートをもつ。変換ルールＲ６は変換ルールＲ４に依存している。変換ルールＲ６は、「サーバレス関数のサービスＡＦ２」を用いる場合のコスト「Ｃ４」をもつ。
【０１０２】
変換ルールＲ５，Ｒ６の両方が同時に適用されることはない。
変換ルールＲ７は、「ＰａｒａｌｌｅｌｉｚｅＦｏｒＯｆＦ１ＦＡ１」であり、ｆｏｒ−ｏｆブロックに対して適用され得る。ｆｏｒ−ｏｆブロックはループ変数（ｉｔｅｒａｔｏｒ変数）を用いたループ処理を示す。変換ルールＲ７は、ループ変数に対応するコンテナを「コンテナサービスＦＡ１」を用いて作成するテンプレートと、ループ処理に対応するＦａａＳシステム２２用の関数を「サーバレス関数のサービスＦ１」を用いて作成するテンプレートをもつ。また、変換ルールＲ７は、「サーバレス関数のサービスＦ１」および「コンテナサービスＦＡ１」を用いる場合のコスト「Ｃ５＋Ｃ６」をもつ。ここで、コスト「Ｃ５」は、「サーバレス関数のサービスＦ１」を利用する場合のコストである。コスト「Ｃ６」は、「コンテナサービスＦＡ１」を用いる場合のコストである。
【０１０３】
変換ルールＲ８は、「ＰａｒａｌｌｅｌｉｚｅＦｏｒＯｆＦ２ＦＡ２」であり、ｆｏｒ−ｏｆブロックに対して適用され得る。変換ルールＲ８は、ループ変数に対応するコンテナを「コンテナサービスＦＡ２」を用いて作成するテンプレートと、ループ処理に対応するＦａａＳシステム２２用の関数を「サーバレス関数のサービスＦ２」を用いて作成するテンプレートをもつ。また、変換ルールＲ８は、「サーバレス関数のサービスＦ２」および「コンテナサービスＦＡ２」を用いる場合のコスト「Ｃ７＋Ｃ８」をもつ。ここで、コスト「Ｃ７」は、「サーバレス関数のサービスＦ２」を利用する場合のコストである。コスト「Ｃ８」は、「コンテナサービスＦＡ２」を用いる場合のコストである。
【０１０４】
変換ルールＲ７，Ｒ８の両方が同時に適用されることはない。
なお、「コンテナサービスＡ１」、「コンテナサービスＡ２」、「コンテナサービスＦＡ１」および「コンテナサービスＦＡ２」は、何れもオブジェクトストレージサービスである。
【０１０５】
また、変換ルールＲ７，Ｒ８のテンプレートによれば、スケーラブルな処理が実現され得る。変換ルールＲ７，Ｒ８により、負荷に応じて自動的に並列度が変化するようにプログラムを変換可能である。例えば、負荷が高いときは、並列度を上げるスケールアウトが自動的に行われ、負荷が低いときは並列度を下げるスケールインが自動的に行われるように変換後プログラムが作成され得る。
【０１０６】
図９は、変換ルール間の依存関係の例を示す図である。図９では、変換ルールテーブル１４５に設定されている適用条件に応じた変換ルール間の依存関係を例示している。例えば、変換ルール「ＰｕｔＩｎＣｏｎｔａｉｎｅｒ」は、変換ルール「ＤｅｃｌａｒｅＣｏｎｔａｉｎｅｒＡ１」または変換ルール「ＤｅｃｌａｒｅＣｏｎｔａｉｎｅｒＡ２」に依存する。すなわち、変換ルール「ＤｅｃｌａｒｅＣｏｎｔａｉｎｅｒＡ１」または変換ルール「ＤｅｃｌａｒｅＣｏｎｔａｉｎｅｒＡ２」が適用済みの場合に限り、変換ルール「ＰｕｔＩｎＣｏｎｔａｉｎｅｒ」が適用される。
【０１０７】
また、変換ルール「ＤｅｃｌａｒｅＦｕｎｃｔｉｏｎＢｅｈｉｎｄＣｏｎｔａｉｎｅｒＡＦ１」および変換ルール「ＤｅｃｌａｒｅＦｕｎｃｔｉｏｎＢｅｈｉｎｄＣｏｎｔａｉｎｅｒＡＦ２」は、変換ルール「ＰｕｔＩｎＣｏｎｔａｉｎｅｒ」に依存する。すなわち、変換ルール「ＰｕｔＩｎＣｏｎｔａｉｎｅｒ」が適用済みの場合に限り、変換ルール「ＤｅｃｌａｒｅＦｕｎｃｔｉｏｎＢｅｈｉｎｄＣｏｎｔａｉｎｅｒＡＦ１」または変換ルール「ＤｅｃｌａｒｅＦｕｎｃｔｉｏｎＢｅｈｉｎｄＣｏｎｔａｉｎｅｒＡＦ２」が適用される。
【０１０８】
図１０は、変換前プログラムと変換ルールとの関連の例を示す図である。変換ルールテーブル１４５に登録された変換ルールと、プログラム１４２におけるコードとの対応関係は次の通りである。ここで、プログラム１４２におけるコードを、プログラム１４２の左側に付した行番号によって示す。
【０１０９】
プログラム１４２の７行目のコードは、コードパターン「空の変数宣言」に対応する。したがって、プログラム１４２の７行目のコードには、変換ルール「ＤｅｃｌａｒｅＣｏｎｔａｉｎｅｒＡ１」または変換ルール「ＤｅｃｌａｒｅＣｏｎｔａｉｎｅｒＡ２」が適用される。
【０１１０】
プログラム１４２の１５行目のコードは、コードパターン「変数への代入文」に対応する。したがって、プログラム１４２の１５行目のコードには、変換ルール「ＰｕｔＩｎＣｏｎｔａｉｎｅｒ」が適用される。
【０１１１】
プログラム１４２の１２〜２４行目のコードは、コードパターン「代入後に変数を用いる文」に対応する。したがって、プログラム１４２の１２〜２４行目のコードには、変換ルール「ＤｅｃｌａｒｅＦｕｎｃｔｉｏｎＢｅｈｉｎｄＣｏｎｔａｉｎｅｒＡＦ１」または変換ルール「ＤｅｃｌａｒｅＦｕｎｃｔｉｏｎＢｅｈｉｎｄＣｏｎｔａｉｎｅｒＡＦ２」が適用される。
【０１１２】
プログラム１４２の１６〜２２行目のコードは、コードパターン「ｆｏｒ−ｏｆブロック」に対応する。したがって、プログラム１４２の１６〜２２行目のコードには、変換ルール「ＰａｒａｌｌｅｌｉｚｅＦｏｒＯｆＦ１ＦＡ１」または「ＰａｒａｌｌｅｌｉｚｅＦｏｒＯｆＦ２ＦＡ２」が適用される。
【０１１３】
図１１は、変換ルールテーブルに含まれるテンプレート例を示す図である。テンプレート１４５ａは、図８の変換ルールＲ４（「ＰｕｔＩｎＣｏｎｔａｉｎｅｒ」）に含まれるテンプレートである。テンプレート１４５ａは、引数として「ａｃｃｅｓｓＫｅｙＩｄ」、「ｓｅｃｒｅｔＡｃｃｅｓｓＫｅｙ」および「ｒｅｇｉｏｎ」を含む。この３つの引数は、環境設定管理テーブル１４１に登録されたアクセスキーＩＤ、秘密アクセスキーおよび地域に対応する。また、テンプレート１４５ａは、引数として「ｏｂｊｅｃｔ．ｎａｍｅ」、「ｐｒｏｐｅｒｔｙ．ｎａｍｅ」および「ｒｉｇｈｔ」を含む。この３つの引数は、変換前プログラムから抽出される変数名、キーおよび代入値に対応する。
【０１１４】
テンプレート１４５ａによれば、アクセスキーＩＤや秘密アクセスキーを用いてクラウドシステム２０のストレージシステム２３にアクセスし、変数に対応するコンテナにキーバリュー形式のデータを書き込む変換後プログラムが得られる。
【０１１５】
図１２は、変換後プログラムの例を示す図である。プログラム１４６は、プログラム記憶部１２２に記憶される。プログラム１４６は、環境設定管理テーブル１４１、プログラム１４２およびテンプレート１４５ａから生成された変換後プログラムである。引数「ａｃｃｅｓｓＫｅｙＩｄ」に環境設定管理テーブル１４１の「ｘｘｘ」が代入されている。引数「ｓｅｃｒｅｔＡｃｃｅｓｓＫｅｙ」に環境設定管理テーブル１４１の「ｙｙｙ」が代入されている。引数「ｒｅｇｉｏｎ」に環境設定管理テーブル１４１の「ｕｓ−ｗｅｓｔ−２」が代入されている。また、引数「ｏｂｊｅｃｔ．ｎａｍｅ」にプログラム１４２の「ｃｓｖ」が代入されている。引数「ｐｒｏｐｅｒｔｙ．ｎａｍｅ」にプログラム１４２の「ｎａｍｅ」が代入されている。引数「ｒｉｇｈｔ」にプログラム１４２の「ｏｂｊｅｃｔ」が代入されている。
【０１１６】
プログラム１４６によれば、アクセスキーＩＤ「ｘｘｘ」と秘密アクセスキー「ｙｙｙ」を用いてストレージシステム２３にアクセスし、変数「ｎａｍｅ」の値に対応付けて変数「ｏｂｊｅｃｔ」の値をコンテナ「ｃｓｖ」に書き込むことになる。このプログラム１４６は、例えば、ＰａａＳシステム２１に配備されて実行される。
【０１１７】
図１３は、変換後プログラムに含まれるコンポーネント例を示す図である。プログラム１４２から生成される変換後プログラム群によれば、アプリケーションソフトウェアはコンポーネント１４７ａ，１４７ｂ，１４７ｃ，１４７ｄ，１４７ｅを含む。
【０１１８】
コンポーネント１４７ａは、ＨＴＴＰリクエストの受信に応じて一連の処理を開始するアプリケーションプログラムである。コンポーネント１４７ａは、「／ｃｓｖ」を含むＵＲＬを指定したＰＯＳＴメソッドのＨＴＴＰリクエストを受信するインタフェースと、このＨＴＴＰリクエストを処理する関数を含む。コンポーネント１４７ｂは、コンテナ名が「ｃｓｖ」であるコンテナである。コンポーネント１４７ｂは、データを書き込むＰＵＴ用のＡＰＩとデータを読み出すＧＥＴ用のＡＰＩをもつ。コンポーネント１４７ｃは、関数名が「ｓｐｌｉｔＣｓｖ」であるＦａａＳ用の関数である。コンポーネント１４７ｄは、コンテナ名が「ｒｅｃｏｒｄ」であるコンテナである。コンポーネント１４７ｄは、データを書き込むＰＵＴ用のＡＰＩとデータを読み出すＧＥＴ用のＡＰＩをもつ。コンポーネント１４７ｅは、関数名が「ｓｅｎｄＥｍａｉｌ」であるＦａａＳ用の関数である。
【０１１９】
コンポーネント１４７ａは、ＰａａＳシステム２１で実行される。コンポーネント１４７ｃ，１４７ｅは、ＦａａＳシステム２２で実行される。コンポーネント１４７ｂ，１４７ｄは、ストレージシステム２３で実行される。コンポーネント１４７ａは、コンポーネント１４７ｂのＡＰＩを呼び出してデータを書き込む。データが書き込まれると、Ｗｅｂフックによりコンポーネント１４７ｃが起動する。コンポーネント１４７ｃは、コンポーネント１４７ｂのＡＰＩを呼び出してデータを読み出し、コンポーネント１４７ｄのＡＰＩを呼び出してデータを書き込む。データが書き込まれると、Ｗｅｂフックによりコンポーネント１４７ｅが起動する。コンポーネント１４７ｅは、コンポーネント１４７ｄのＡＰＩを呼び出してデータを読み出し、電子メールを送信する。
【０１２０】
プログラム１４２からは、まず図８の変換ルールＲ１が適用されてコンポーネント１４７ａが生成される。次に、プログラム１４２の「ｖａｒ  ｃｓｖ＝｛｝」に対して図８の変換ルールＲ２または変換ルールＲ３が適用され、コンポーネント１４７ｂが生成される。次に、プログラム１４２の「ｃｓｖ［ｎａｍｅ］＝ｏｂｊｅｃｔ」に対して図８の変換ルールＲ４が適用され、コンポーネント１４７ａがコンポーネント１４７ｂを呼び出すように更新される。
【０１２１】
次に、プログラム１４２の「ｃｓｖ［ｎａｍｅ］．ｓｐｌｉｔ」に対して図８の変換ルールＲ５または変換ルールＲ６が適用され、コンポーネント１４７ｃが生成される。次に、プログラム１４２の「ｆｏｒ（…ｒｅｃｏｒｄ  ｏｆ…）｛…｝」に対して図８の変換ルールＲ７または変換ルールＲ８が適用され、コンポーネント１４７ｄ，１４７ｅが生成される。また、コンポーネント１４７ｃがコンポーネント１４７ｄを呼び出すように更新される。
【０１２２】
あるコードパターンに対して複数の変換ルールが適用候補となる場合、複数の適用候補のうちの１つの変換ルールが適用される。何れの変換ルールを用いるかは、制約条件１４３および変換ルールテーブル１４５に登録された利用可能サービス毎のコストにより決定される。
【０１２３】
図１４は、実行状態管理テーブルの例を示す図である。実行状態管理テーブル１４８は、実行状態記憶部１２４に記憶される。実行状態管理テーブル１４８は、サービスインスタンスＩＤおよび実行状態の項目を有する。サービスインスタンスＩＤの項目には、サービスインスタンスを識別する識別情報が登録される。サービスインスタンスＩＤは、あるサービスインスタンスを最初に配備するときに、他のサービスインスタンスと重複しないように当該サービスインスタンスに対して付与される。
【０１２４】
実行状態の項目には、サービスインスタンスの状態が登録される。実行状態は、未配備（ｎｏｎｅ）、実行中（ｒｕｎｎｉｎｇ）、停止中（ｔｅｒｍｉｎａｔｅｄ）および削除済み（ｒｅｍｏｖｅｄ）の何れかである。未配備は、サービスインスタンスがクラウドシステム２０に配備されたことがないことを示す。実行中は、サービスインスタンスがクラウドシステム２０に配備されて実行可能であることを示す。停止中は、サービスインスタンスは停止しているものの、データはまだ削除されておらず再配備が可能であることを示す。削除済みは、データが削除されて再配備が不能であることを示す。
【０１２５】
図１５は、インスタンスの配備例を示す図である。クラウドシステム２０には、サービスインスタンスの構成要素としてインスタンス１４９ａ，１４９ｂ，１４９ｃ，１４９ｄ，１４９ｅが形成される。インスタンス１４９ａはＰａａＳシステム２１で実行される。インスタンス１４９ｂ，１４９ｃはＦａａＳシステム２２で実行される。インスタンス１４９ｄ，１４９ｅはストレージシステム２３で実行される。インスタンス１４９ａはコンポーネント１４７ａから起動される。インスタンス１４９ｂはコンポーネント１４７ｃから起動される。インスタンス１４９ｃはコンポーネント１４７ｅから起動される。インスタンス１４９ｄはコンポーネント１４７ｂから起動される。インスタンス１４９ｅはコンポーネント１４７ｄから起動される。
【０１２６】
インスタンス１４９ａは、ＨＴＴＰリクエストを受信すると処理を開始し、インスタンス１４９ｄにデータを送信する。インスタンス１４９ｂは、インスタンス１４９ｄがデータを保存すると処理を開始し、インスタンス１４９ｄからデータを受信し、インスタンス１４９ｅにデータを送信する。インスタンス１４９ｃは、インスタンス１４９ｅがデータを保存すると処理を開始し、インスタンス１４９ｅからデータを受信する。
【０１２７】
開発サーバ１００がクライアント１１から配備リクエストを受信した場合、図１５のようにインスタンス１４９ａ，１４９ｂ，１４９ｃ，１４９ｄ，１４９ｅが形成される。ここでは、配備するサービスインスタンスのサービスインスタンスＩＤが「１２３」であるとする。すると、例えば、インスタンス１４９ｂの関数名が、サービスインスタンスＩＤを含むように「ｓｐｌｉｔＣｓｖ＿１２３」と変更される。また、インスタンス１４９ｃの関数名が、サービスインスタンスＩＤを含むように「ｓｅｎｄＥｍａｉｌ＿１２３」と変更される。また、インスタンス１４９ｄのコンテナ名が、サービスインスタンスＩＤを含むように「ｃｓｖ＿１２３」と変更される。また、インスタンス１４９ｅのコンテナ名が、サービスインスタンスＩＤを含むように「ｒｅｃｏｒｄ＿１２３」と変更される。
【０１２８】
その後、開発サーバ１００がクライアント１１から停止リクエストを受信した場合、ＰａａＳシステム２１からインスタンス１４９ａが消去され、ＦａａＳシステム２２からインスタンス１４９ｂ，１４９ｃが消去される。ただし、ストレージシステム２３のインスタンス１４９ｄ，１４９ｅは、データを保持しておくため消去されない。その後、開発サーバ１００がクライアント１１から削除リクエストを受信した場合、ストレージシステム２３からインスタンス１４９ｄ，１４９ｅが消去される。
【０１２９】
次に、開発サーバ１００の処理手順について説明する。
図１６は、プログラム解析の手順例を示すフローチャートである。
（Ｓ１０）コンパイル部１３２は、変換前プログラムと制約条件１４３とを取得する。
【０１３０】
（Ｓ１１）サービス選択部１３４は、字句解析や構文解析などにより変換前プログラムを解析して、変換前プログラムの構造を示す抽象構文木を生成する。
（Ｓ１２）サービス選択部１３４は、着目位置を抽象構文木のルートに移動する。
【０１３１】
（Ｓ１３）サービス選択部１３４は、直近のステップＳ１２以降に行った、ルートから始まる深さ優先探索によって、抽象構文木に含まれる全てのノードを選択したか判断する。抽象構文木の全てのノードを選択した場合はステップＳ２１に処理が進み、未選択のノードがある場合はステップＳ１４に処理が進む。
【０１３２】
（Ｓ１４）サービス選択部１３４は、現在の着目位置から深さ優先探索によって次のノードを選択し、選択したノードに着目位置を移動する。現在の着目位置がルートである場合、ルートノードを選択する。現在の着目位置が何れかのノードであり、そのノードの配下に子ノードが存在する場合、当該子ノードを選択する。現在の着目位置がルートノード以外のノードであり、そのノードの配下に子ノードが存在しない場合、未選択の子ノードが存在する親ノードまで着目位置を戻し、当該未選択の子ノードを選択する。
【０１３３】
（Ｓ１５）サービス選択部１３４は、ステップＳ１４で選択したノードに対して、変換ルールテーブル１４５に登録されている全ての変換ルールを選択したか判断する。全ての変換ルールを選択した場合はステップＳ１９に処理が進み、未選択の変換ルールが存在する場合はステップＳ１６に処理が進む。
【０１３４】
（Ｓ１６）サービス選択部１３４は、変換ルールテーブル１４５に登録されている複数の変換ルールの中から未選択の変換ルールを１つ選択する。
（Ｓ１７）サービス選択部１３４は、ステップＳ１４で選択したノードが、ステップＳ１６で選択した変換ルールのコードパターンを満たすか判断する。また、サービス選択部１３４は、制約条件１４３やその他のプログラム変換状況が、ステップＳ１６で選択した変換ルールの適用条件を満たすか判断する。コードパターンと適用条件の両方を満たす場合はステップＳ１８に処理が進み、コードパターンと適用条件の少なくとも一方を満たさない場合はステップＳ１５に処理が進む。ここで、ステップＳ１７における適用条件を満たすかの判断では、ステップＳ１６で選択した変換ルールに対して前提となる変換ルールが、変換前プログラムへの適用候補として選択済みである場合に、当該前提となる変換ルールを適用済みであるとみなしてよい。ここでは適用候補を抽出するための判定が行われ、実際に適用するか否かは後段の処理で判定されることになる。
【０１３５】
（Ｓ１８）サービス選択部１３４は、ステップＳ１６で選択した変換ルールを適用候補として選択する。そして、ステップＳ１５に処理が進む。
（Ｓ１９）サービス選択部１３４は、現在の着目位置のノードに対して、適用候補となる変換ルールがあるか否かを判定する。現在の着目位置のノードに対して、適用候補となる変換ルールがある場合はステップＳ２０に処理が進み、適用候補となる変換ルールがない場合はステップＳ１３に処理が進む。
【０１３６】
（Ｓ２０）サービス選択部１３４は、現在の着目位置のノードに対して、１つのルールを使用する条件を作成する。また、サービス選択部１３４は、適用候補の変換ルールのコストをコスト関数に追加する。ここで、「１つのルールを使用する条件」とは、適用候補となる変換ルールが複数の場合に、何れか１つの変換ルールを選択することを示す条件である。適用候補の変換ルールが１つの場合、現在の着目位置のノードに対して「１つのルールを使用する条件」を作成しなくてよい。また、「コスト関数」とは、制約条件１４３により示される総コストを上回らないように変換ルール（あるいは、変換ルールに対応するサービス）を選択するための関数である。コスト関数の詳細については後述する。更に、サービス選択部１３４は、ある変換ルールの前提となる変換ルールがある場合、これら変換ルール間の依存関係に対応する条件を作成してもよい。そして、ステップＳ１３に処理が進む。
【０１３７】
（Ｓ２１）サービス選択部１３４は、直近のステップＳ１２以降に行った深さ優先探索の間に、抽象構文木の１以上のノードに対して変換ルールが適用されたか判断する。変換ルールが適用されたノードがある場合、サービス選択部１３４は、ステップＳ１２に戻って抽象構文木の深さ優先探索を再実行する。変換ルールが適用されたノードがない場合、ステップＳ２２に処理が進む。
【０１３８】
（Ｓ２２）サービス選択部１３４は、制約条件１４３とコスト関数とに基づいて、変換前プログラムに対して見出された変換ルールの複数の適用候補の中から、利用対象のサービスの組合せを決定する。そして、プログラム解析が終了する。
【０１３９】
図１７は、サービス組合せ決定の手順例を示すフローチャートである。このサービス組合せ決定は、上記のステップＳ２２で実行される。
（Ｓ３０）サービス選択部１３４は、制約条件１４３と上記のステップＳ２０で作成した条件とを、コスト関数に適用する。
【０１４０】
（Ｓ３１）サービス選択部１３４は、コスト関数を満たすサービスの組合せがあるか否かを判定する。コスト関数を満たすサービスの組合せがある場合、ステップＳ３２に処理が進み、コスト関数を満たすサービスの組合せがない場合、ステップＳ３４に処理が進む。
【０１４１】
（Ｓ３２）サービス選択部１３４は、利用するサービスの組合せを最小コストの組合せに決定する。すなわち、コスト関数を満たすサービスの組合せが複数の場合、サービス選択部１３４は、複数の組合せのうち、最小コストの組合せを利用対象の組合せとして決定する。
【０１４２】
（Ｓ３３）サービス選択部１３４は、決定した組合せを出力する。例えば、サービス選択部１３４は、ステップＳ３２で決定した組合せを含む画面情報を生成し、生成した画面情報をクライアント１１に送信する。クライアント１１のＷｅｂブラウザには、当該画面情報に基づいて、利用対象のサービスの組合せが表示される。そして、サービス組合せ決定が終了する。
【０１４３】
（Ｓ３４）サービス選択部１３４は、制約条件を満たすサービスの組合せが存在しないことを出力する。例えば、サービス選択部１３４は、制約条件を満たすサービスの組合せが存在しない旨を示すメッセージをクライアント１１に送信する。クライアント１１のＷｅｂブラウザには、当該メッセージの内容が表示される。そして、サービス組合せ決定が終了する。
【０１４４】
このように、サービス選択部１３４は、コードパターンに対するサービスの候補とコストとを示す変換ルールテーブル１４５を参照して、制約条件１４３に応じたコスト関数と、変換前プログラムに対応するサービスの複数の候補とを決定する。そして、サービス選択部１３４は、コスト関数に基づいて、ユーザにより利用対象となるサービスの組を複数の候補の中から特定する。
【０１４５】
ここで、コスト関数は、サービスの複数の候補それぞれのコストに対する演算（あるいは、演算式）を含む。サービス選択部１３４は、サービスの複数の候補のうちの第１の候補および第２の候補の選択の条件を示す条件式を生成し、条件式を適用した演算に基づいて、サービスの組を特定する。これにより、あるコードパターンに対して競合するサービスが複数ある場合に、何れかのサービスを適切に選択可能になる。
【０１４６】
また、前述のように、変換ルールテーブル１４５は、第１のコードパターンに対するサービスの複数の第１の候補と、第２のコードパターンに対するサービスの複数の第２の候補とを含んでいる。そして、サービス選択部１３４は、変換前プログラムに含まれる第１のコードパターンに対して複数の第１の候補のうちの１つを選択し、変換前プログラムに含まれる第２のコードパターンに対して複数の第２の候補のうちの１つを選択する。これにより、あるコードパターンに対して競合するサービスが複数ある場合に、ユーザのポリシーに応じた制約条件１４３を満たしたサービスを提供可能になる。
【０１４７】
図１８は、コストの例を示す図である。ここで、図１８では、作成可能サービスインスタンスとして、図８で例示したサービス名の末尾のアルファベットと数字との結合（「Ａ１」など）のみを図示している。また、一例として、コストの単位は「円」である。
【０１４８】
例えば、オブジェクトストレージサービスである「コンテナサービスＡ１」、「コンテナサービスＡ２」、「コンテナサービスＦＡ１」および「コンテナサービスＦＡ２」それぞれのコストの値は、次の通りであるとする。「コンテナサービスＡ１」のコストＣ１は１０である。「コンテナサービスＡ２」のコストＣ２は２０である。「コンテナサービスＦＡ１」のコストＣ６は１０である。「コンテナサービスＦＡ２」のコストＣ８は３０である。
【０１４９】
また、ＦａａＳサービスである「サーバレス関数のサービスＦ１」、「サーバレス関数のサービスＦ２」、「サーバレス関数のサービスＡＦ１」および「サーバレス関数のサービスＡＦ２」それぞれのコストの値は、次の通りであるとする。「サーバレス関数のサービスＦ１」のコストＣ５は２０である。「サーバレス関数のサービスＦ２」のコストＣ７は５０である。「サーバレス関数のサービスＡＦ１」のコストＣ３は３０である。「サーバレス関数のサービスＡＦ２」のコストＣ４は５０である。
【０１５０】
図１９は、コスト関数の例を示す図である。図１９（Ａ）は、コスト関数に用いられる変数と、変数に設定される値の意味を示す。変数Ａ１は、「コンテナサービスＡ１」を使用するか否かを示す変数である。変数Ａ２は、「コンテナサービスＡ２」を使用するか否かを示す変数である。変数ＦＡ１は、「コンテナサービスＦＡ１」を使用するか否かを示す変数である。変数ＦＡ２は、「コンテナサービスＦＡ２」を使用するか否かを示す変数である。変数Ｆ１は、「サーバレス関数のサービスＦ１」を使用するか否かを示す変数である。変数Ｆ２は、「サーバレス関数のサービスＦ２」を使用するか否かを示す変数である。変数ＡＦ１は、「サーバレス関数のサービスＡＦ１」を使用するか否かを示す変数である。変数ＡＦ２は、「サーバレス関数のサービスＡＦ２」を使用するか否かを示す変数である。ここで、変数Ａ１，Ａ２，ＦＡ１，ＦＡ２，Ｆ１，Ｆ２，ＡＦ１，ＡＦ２それぞれは、「Ｔｒｕｅ」が該当のサービスの使用を示し、「Ｆａｌｓｅ」が該当のサービスの不使用を示す。
【０１５１】
図１９（Ｂ）は、サービスの選択に関する条件を示す。当該条件は、上記のステップＳ２０で作成される。例えば、条件を表す条件式「Ａ１  ｘｏｒ  Ａ２  ＝  Ｔｒｕｅ」は、競合する２つのサービスである「コンテナサービスＡ１」および「コンテナサービスＡ２」の何れか一方が利用対象として選択されることを示す。変換ルールテーブル１４５によれば、その他に、「ＡＦ１  ｘｏｒ  ＡＦ２  ＝  Ｔｒｕｅ」、「ＦＡ１  ｘｏｒ  ＦＡ２  ＝  Ｔｒｕｅ」および「Ｆ１  ｘｏｒ  Ｆ２  ＝  Ｔｒｕｅ」という条件式も作成される。
【０１５２】
なお、競合する２つのサービスのうちの一方を選択する旨の条件式以外の条件式が作成されてもよい。例えば、「Ａ１  ａｎｄ  （Ａ５  ｘｏｒ  Ａ６）  ＝  Ｔｒｕｅ」（「コンテナサービスＡ１」を利用する場合に「サービスＡ５」または「サービスＡ６」の何れか一方を利用する）といった複雑な条件式も考えられる。
【０１５３】
図１９（Ｃ）は、プログラム１４２に対して作成されるコスト関数の例を示す。このコスト関数（あるいは、コスト関数の演算式）は、「Ａ１＊Ｃ１＋Ａ２＊Ｃ２＋ＦＡ１＊Ｃ６＋ＦＡ２＊Ｃ８＋Ｆ１＊Ｃ５＋Ｆ２＊Ｃ７＋ＡＦ１＊Ｃ３＋ＡＦ２＊Ｃ４＜＝Ｃ」と表される。ここで、Ｃは、制約条件１４３により入力された「Ｃｏｓｔ」の値である。
【０１５４】
また、「Ａ１＊Ｃ１」の項は、「Ａ１＝Ｔｒｕｅ」のときに「Ｃ１」であり、「Ａ１＝Ｆａｌｓｅ」のときに「０」である。また、条件式「Ａ１  ｘｏｒ  Ａ２  ＝  Ｔｒｕｅ」によれば、「Ａ１＝Ｔｒｕｅ」のとき「Ａ２＝Ｆａｌｓｅ」であり、「Ａ１＝Ｆａｌｓｅ」のとき「Ａ２＝Ｔｒｕｅ」である。コスト関数の他の項についても同様である。
【０１５５】
図２０は、コスト関数による判定例を示す図である。図１８の各コストの値とＣ＝１００と図１９（Ｂ）の条件式とに対して、図１９（Ｃ）のコスト関数により許容されるサービスの各組に対する総コストがコスト関数を満たすか否かが判定される。
【０１５６】
図２０（Ａ）は、サービスＡ２，ＡＦ１，Ｆ２，ＦＡ２の組を選択した場合（パタンａ）である。パタンａの場合、Ｃ２＋Ｃ３＋Ｃ７＋Ｃ８＝２０＋３０＋５０＋３０＝１３０＞Ｃ（＝１００）であり、コスト関数を満たさない。したがって、サービスＡ２，ＡＦ１，Ｆ２，ＦＡ２の組は、不採用となる。
【０１５７】
図２０（Ｂ）は、サービスＡ１，ＡＦ１，Ｆ１，ＦＡ１の組を選択した場合（パタンｂ）である。パタンｂの場合、Ｃ１＋Ｃ３＋Ｃ５＋Ｃ６＝１０＋３０＋２０＋１０＝７０＜Ｃ（＝１００）であり、コスト関数を満たす。したがって、サービスＡ１，ＡＦ１，Ｆ１，ＦＡ１の組は、採用となる。
【０１５８】
図２０（Ｃ）は、サービスＡ２，ＡＦ２，Ｆ１，ＦＡ１の組を選択した場合（パタンｃ）である。パタンｃの場合、Ｃ２＋Ｃ４＋Ｃ５＋Ｃ６＝２０＋５０＋２０＋１０＝１００＝Ｃ（＝１００）であり、コスト関数を満たす。ただし、パタンｃよりも総コストが小さいパタンｂが存在する。したがって、パタンｃよりもパタンｂが優先して選択され、サービスＡ２，ＡＦ２，Ｆ１，ＦＡ１の組は、不採用となる。
【０１５９】
図２１は、出力画面の例を示す図である。出力画面４０の画面情報は、サービス選択部１３４により生成され、クライアント１１に送信される。クライアント１１のＷｅｂブラウザは、画面情報を受信し、クライアント１１のディスプレイに出力画面４０を表示させる。
【０１６０】
出力画面４０は、入力内容領域４１、サービス選択結果領域４２、選択可能サービス領域４３、キャンセルボタン４４および確定ボタン４５を含む。
入力内容領域４１は、ユーザにより入力されたプログラム１４２や制約条件１４３を表す画像が表示される領域である。サービス選択結果領域４２は、開発サーバ１００によるサービスの選択結果を表す画像が表示される領域である。例えば、サービス選択結果領域４２には、図１９（Ｂ）のパタンｂのサービスＡ１，ＡＦ１，Ｆ１，ＦＡ１の組、サービスＡ１，ＡＦ１，Ｆ１，ＦＡ１それぞれのコスト、および、合計コスト「７０円」という画像が表示される。
【０１６１】
選択可能サービス領域４３は、選択可能なその他のサービスを表す画像が表示される領域である。例えば、ユーザは、Ｗｅｂブラウザを操作して、サービス選択結果領域４２に選択済みのサービスのうちの一部を、選択可能サービス領域４３に表示された別のサービスに変更することができる。サービスの変更に応じて、合計コストが再計算されて、合計コストの表示も変更される。
【０１６２】
キャンセルボタン４４は、現在の入力内容およびサービス選択結果のキャンセルを入力するためのボタンである。例えば、ユーザは、キャンセルボタン４４を押下操作することで、現在の入力内容およびサービス選択結果をキャンセルし、別の入力内容を入力できる。
【０１６３】
確定ボタン４５は、現在の入力内容およびサービス選択結果を確定し、変換後プログラムの生成と、サービス選択結果領域４２に表示された各サービスの起動とを開発サーバ１００に指示するためのボタンである。開発サーバ１００は、確定ボタン４５の選択を受け付けると、プログラム１４２および変換ルールテーブル１４５に基づいて、選択されたサービスの組に応じた変換後プログラムを生成する。開発サーバ１００は、生成した変換後プログラムにより、選択された各サービスを起動する。
【０１６４】
次に、変換前プログラムに変換ルールを適用して変換後プログラムを生成する手順を説明する。変換ルールとして、出力画面４０で確定された各サービスに対応する変換ルールが用いられる。例えば、サービスＡ１，ＡＦ１，Ｆ１，ＦＡ１の組が選択された場合、変換前プログラムに対する適用対象の変換ルールは、図８の変換ルールＲ１，Ｒ２，Ｒ４，Ｒ５，Ｒ７である。
【０１６５】
図２２は、変換ルール適用の手順例を示すフローチャートである。
（Ｓ４０）コード生成部１３５は、変換前プログラムの抽象構文木から未適用の変換ルールの適用対象のノードを特定する。未適用の変換ルールは、図２１の出力画面４０で確定された各サービスに対応する変換ルールの中から選択される。
【０１６６】
（Ｓ４１）コード生成部１３５は、ステップＳ４０で特定したノードに対する変換ルールに含まれるテンプレートの引数を特定する。コード生成部１３５は、着目するノードの中から、特定した引数に対応する値を抽出する。抽出する値としては、例えば、変換前プログラムで使用されている変数名や関数名などが挙げられる。また、コード生成部１３５は、抽出した値を、変換後プログラムの中でユニークな値になるように変更する。
【０１６７】
（Ｓ４２）コード生成部１３５は、環境設定管理テーブル１４１から、利用するクラウドシステム２０に対応する認証情報を読み出す。コード生成部１３５は、読み出した認証情報の中から、ステップＳ４１で特定した引数に対応する値を抽出する。
【０１６８】
（Ｓ４３）コード生成部１３５は、ステップＳ４１，Ｓ４２で抽出した値をテンプレートの引数に対して代入し、変換後プログラムを生成する。例えば、コード生成部１３５は、引数を示す所定の文字列を、ステップＳ４１，Ｓ４２で抽出した値に置換する。
【０１６９】
（Ｓ４４）コード生成部１３５は、ステップＳ４３で生成した変換後プログラムを、変換後プログラム群に挿入する。なお、１つの変換前プログラムから、複数のクラウドサービスを利用するための複数の断片的プログラムが生成され得る。
【０１７０】
（Ｓ４５）コード生成部１３５は、適用対象の変換ルールを全て適用済みであるか否かを判定する。全て適用済みの場合、変換ルール適用が終了し、未適用の変換ルールがある場合、ステップＳ４０に処理が進む。
【０１７１】
次に、変換後プログラム群によるクラウドサービスの起動手順を説明する。
図２３は、起動サービスの手順例を示すフローチャートである。
（Ｓ５０）開発ＵＩ部１３１は、実行状態変更リクエストを受信する。実行状態変更リクエストは、配備リクエスト、停止リクエストまたは削除リクエストである。
【０１７２】
（Ｓ５１）起動制御部１３３は、実行状態変更リクエストが指定するサービスインスタンスに対してサービスインスタンスＩＤが既に割り当てられているか判断する。配備されたことのない新規のサービスインスタンスに対してはサービスインスタンスＩＤが未割り当てである。既存のサービスインスタンスの再配備、停止または削除の際には、実行状態変更リクエストにサービスインスタンスＩＤが含まれていてもよい。サービスインスタンスＩＤが割り当て済みである場合はステップＳ５４に処理が進み、サービスインスタンスＩＤが未割り当てである場合はステップＳ５２に処理が進む。
【０１７３】
（Ｓ５２）起動制御部１３３は、新規のサービスインスタンスＩＤを生成し、生成したサービスインスタンスＩＤを実行状態管理テーブル１４８に登録する。
（Ｓ５３）起動制御部１３３は、ステップＳ５２のサービスインスタンスＩＤに対応する実行状態を未配備（ｎｏｎｅ）に初期化する。
【０１７４】
（Ｓ５４）起動制御部１３３は、実行状態を変更するサービスインスタンスに対応する変換後プログラム群から、ＦａａＳの関数名やコンテナ名などの構成要素名を検索する。起動制御部１３３は、他のサービスインスタンスと競合しないように、その構成要素名をユニークな名称に変更する。例えば、変換後プログラム群に記載された関数名やコンテナ名の末尾に、サービスインスタンスＩＤなどのリテラルを付加する。
【０１７５】
（Ｓ５５）起動制御部１３３は、受け付けた実行状態変更リクエストが配備リクエストであるか判断する。実行状態変更リクエストが配備リクエストである場合はステップＳ５６に処理が進み、それ以外の場合はステップＳ６０に処理が進む。
【０１７６】
（Ｓ５６）起動制御部１３３は、実行状態管理テーブル１４８に登録された実行状態が未配備（ｎｏｎｅ）または停止中（ｔｅｒｍｉｎａｔｅｄ）であるか判断する。実行状態が未配備または停止中である場合、ステップＳ５７に処理が進む。実行状態がそれ以外である場合、すなわち、実行状態が実行中（ｒｕｎｎｉｎｇ）または削除済み（ｒｅｍｏｖｅｄ）である場合、ステップＳ５９に処理が進む。
【０１７７】
（Ｓ５７）起動制御部１３３は、ステップＳ５４で書き換えた変換後プログラム群を用いて、ＰａａＳシステム２１、ＦａａＳシステム２２およびストレージシステム２３と通信し、サービスインスタンスをクラウドシステム２０に配備する。例えば、起動制御部１３３は、ＰａａＳシステム２１やＦａａＳシステム２２に実行させたい変換後プログラムを送信することがある。送信された変換後プログラムはすぐに実行される場合もあるし、所定のイベントが発生したときに実行される場合もある。また、起動制御部１３３は、変換後プログラムに規定された手順を実行することで、設定情報を送信することがある。例えば、起動制御部１３３は、ストレージシステム２３にコンテナ名を含む設定情報を送信する。
【０１７８】
（Ｓ５８）起動制御部１３３は、実行状態管理テーブル１４８に登録された実行状態を実行中（ｒｕｎｎｉｎｇ）に変更する。そして、起動サービスが終了する。
（Ｓ５９）起動制御部１３３は、実行状態変更リクエストが拒否されたことを示すエラーメッセージを生成する。開発ＵＩ部１３１は、エラーメッセージを返信する。
【０１７９】
図２４は、起動サービスの手順例を示すフローチャート（続き）である。
（Ｓ６０）起動制御部１３３は、受け付けた実行状態変更リクエストが停止リクエストであるか判断する。実行状態変更リクエストが停止リクエストである場合はステップＳ６１に処理が進み、それ以外の場合はステップＳ６４に処理が進む。
【０１８０】
（Ｓ６１）起動制御部１３３は、実行状態管理テーブル１４８に登録された実行状態が実行中（ｒｕｎｎｉｎｇ）であるか判断する。実行状態が実行中である場合、ステップＳ６２に処理が進む。実行状態がそれ以外である場合、すなわち、実行状態が未配備（ｎｏｎｅ）、停止中（ｔｅｒｍｉｎａｔｅｄ）または削除済み（ｒｅｍｏｖｅｄ）である場合、ステップＳ５９に処理が進む。
【０１８１】
（Ｓ６２）起動制御部１３３は、ステップＳ５４で書き換えた変換後プログラム群を用いて、ＰａａＳシステム２１、ＦａａＳシステム２２およびストレージシステム２３と通信し、クラウドシステム２０にサービスインスタンスを停止させる。起動制御部１３３は、変換後プログラムに規定された手順を実行することで、設定情報を送信することがある。例えば、ＰａａＳシステム２１のアプリケーションやＦａａＳシステム２２の関数が消去される。
【０１８２】
（Ｓ６３）起動制御部１３３は、実行状態管理テーブル１４８に登録された実行状態を停止中（ｔｅｒｍｉｎａｔｅｄ）に変更する。そして、起動サービスが終了する。
（Ｓ６４）起動制御部１３３は、受け付けた実行状態変更リクエストが削除リクエストであるか判断する。実行状態変更リクエストが削除リクエストである場合はステップＳ６５に処理が進み、それ以外の場合は起動サービスが終了する。
【０１８３】
（Ｓ６５）起動制御部１３３は、実行状態管理テーブル１４８に登録された実行状態が停止中（ｔｅｒｍｉｎａｔｅｄ）であるか判断する。実行状態が停止中である場合、ステップＳ６６に処理が進む。実行状態がそれ以外である場合、すなわち、実行状態が未配備（ｎｏｎｅ）、実行中（ｒｕｎｎｉｎｇ）または削除済み（ｒｅｍｏｖｅｄ）である場合、ステップＳ５９に処理が進む。
【０１８４】
（Ｓ６６）起動制御部１３３は、ステップＳ５４で書き換えた変換後プログラム群を用いて、ＰａａＳシステム２１、ＦａａＳシステム２２およびストレージシステム２３と通信し、クラウドシステム２０にサービスインスタンスを削除させる。例えば、ストレージシステム２３のコンテナが消去される。
【０１８５】
（Ｓ６７）起動制御部１３３は、実行状態管理テーブル１４８に登録された実行状態を削除済み（ｒｅｍｏｖｅｄ）に変更する。そして、起動サービスが終了する。
このように、変換ルールテーブル１４５は、サービスの処理を規定する所定プログラムの書式を示すテンプレートを含む。そして、コード生成部１３５は、サービスの組が特定されると、プログラムの中のコードパターンに該当するコードに対応する処理を実行するよう規定する変換後プログラム（他のプログラム）を、特定されたサービスの組に属するサービスに対するテンプレートに基づいて生成する。起動制御部１３３は、変換後プログラム（他のプログラム）に基づいて、特定されたサービスの組に属するサービスをネットワーク経由でクラウドシステム２０に属する各サブシステム（サブシステムに属するサーバコンピュータなどの情報処理装置）に配備する。これにより、開発サーバ１００により特定されたサービスの組にて、変換前プログラムに対応する分散処理ソフトウェアが各サブシステムにより実行される。
【０１８６】
開発サーバ１００によれば、ユーザの制約条件に合う、利用対象のサービスを適切に特定できる。
例示したように、制約条件１４３として、サービス利用に伴うコストの和の上限を用いることで、ユーザが想定するコストを上回らないようにサービスを組合せてユーザに提供できる。ただし、制約条件１４３の内容は、コストの和の上限に限られない。
【０１８７】
例えば、コストに代わるパラメータとして、サービス利用に伴う性能値に関する上限値や下限値が制約条件１４３に設定されてもよい。これにより、ユーザが想定する性能を満たすようにサービスを組合せてユーザに提供できる。例えば、レスポンス時間の和の上限値を制約条件１４３として用いることが考えられる。レスポンス時間の和の上限値を下げることで（あるいは、レスポンス時間の和がより小さくなるサービスの組を選択することで）、変換後プログラム群による分散処理ソフトウェアの実行を高速化することもできる。
【０１８８】
また、例えば、稼働率の平均の下限値を制約条件１４３として用いることで、分散処理ソフトウェアにより実現される機能の信頼性を向上することもできる。稼働率あるいはサービスの信用度に関する１つの指標として、該当のサービスのプログラムに対するベンダによる更新パッチのリリース頻度が挙げられる。更新パッチのリリース頻度が高いほど、更新適用のための該当のサービスの停止頻度も上がり、稼働率が低下するためである。
【０１８９】
あるいは、コストに代わるパラメータとして、変換後プログラムのコードの見易さを示す指標（値が大きいほどが見易いことを表すとする）の下限値が制約条件１４３に設定されてもよい。例えば、コードの見易さを示す指標の和の下限値を上げることで（あるいは、指標の和がより大きくなるサービスの組を選択することで）、変換後プログラムの見易さが向上し、変換後プログラムのユーザによるメンテナンスを容易化できる。
【０１９０】
また、制約条件１４３として、コストおよび性能値などの複数の種類のパラメータそれぞれに対する条件を用いてもよい。この場合、サービス選択部１３４は、複数の種類のパラメータそれぞれに対する条件を全て満たすサービスの組を選択する。また、サービス選択部１３４は、開発ＵＩ部１３１を介して、各種のパラメータに対する優先度の入力を受け付けてもよい。そして、処理部１ｂは、制約条件１４３を満たすサービスの組が複数ある場合に、優先度が高い種類のパラメータほど条件に対する評価が優位である組を選択してもよい。例えば、制約条件１４３が、コストおよび性能値のそれぞれに対する条件を含み、かつ、コストの優先度が性能値の優先度よりも高い場合を考える。この場合、サービス選択部１３４は、コストおよび性能値のそれぞれに対する条件を全て満たすサービスの組が複数であると、当該複数の組のうち、コストが最小の組を利用対象のサービスの組として特定することが考えられる。
【０１９１】
このように、制約条件には、ユーザに対する課金額などのコスト、レスポンス時間などの性能値、あるいは、変換後プログラムのコードの見易さを示す指標など、種々のパラメータを利用可能である。サービス選択部１３４は、コードパターンに対するサービスの候補とサービスの候補に対応するパラメータの値とを示す情報を参照して、パラメータの値の組が制約条件を満たすサービスの組を特定してもよい。これにより、ユーザが重視するポリシーに応じたパラメータを利用可能になり、ユーザのポリシーに適合したサービスを適切に提供可能になる。
【０１９２】
更に、第２の実施の形態の情報処理システムによれば、コアロジック全体が１つのコンピュータ上で閉じて実行されるようなプログラムを開発者が作成すれば、そのプログラムから複数のクラウドサービスを利用し連携させるプログラム群が生成される。よって、開発者はクラウド事業者が独自に規定したＡＰＩや規約を学習しなくてもよく、学習コストを低減することができる。また、開発者は複数のクラウドサービスに分散する断片的なプログラムや設定情報を直接記述しなくてよく、コアロジックの定義に注力することができる。よって、複数のクラウドサービスを利用するアプリケーションソフトウェアの開発効率が向上する。また、複数のクラウドサービスに対するプログラムや設定情報の送信が、開発者に代わって開発サーバ１００によって一括して行われる。よって、開発者が個別にクラウドサービスにアクセスしなくてよく、サービスインスタンスの配備を効率化できる。
【０１９３】
なお、第２の実施の形態の情報処理システムは、複数の計算ノード（例えば、サーバブレードや情報処理ユニットなど）を含む大規模なコンピュータ（あるいは、コンピュータシステム）により実現されてもよい。この場合、第１の計算ノードが開発サーバ１００の機能を実行し、複数の第２の計算ノードが複数のサブシステムの機能を実行してもよい。
【０１９４】
すなわち、当該コンピュータに属する第１の計算ノードが、制約条件とプログラムとを取得し、取得したプログラムを実行する際に、プログラムに含まれるコードパターンに基づいて、サービスの複数の候補から制約条件を満たすサービスの組を特定してもよい。第１の計算ノードが、取得したプログラムから特定したサービスの組に応じた変換後プログラムを生成してもよい。また、当該コンピュータに属する複数の第２の計算ノードが、特定されたサービスの組によりプログラム（あるいは変換後プログラム）を実行してもよい。
【０１９５】
［第３の実施の形態］
以下、第３の実施の形態を説明する。前述の第２の実施の形態と相違する事項を主に説明し、共通する事項の説明を省略する。
【０１９６】
第３の実施の形態の情報処理システムの装置構成は、図２で例示した第２の実施の形態の情報処理システムの装置構成と同様である。そこで、第３の実施の形態でも、第２の実施の形態と同じ符号・名称を用いて各構成を記述する。
【０１９７】
ここで、制約条件に対するコスト関数は、利用されるサービス間の関係に応じて変わることがある。例えば、制約条件として、可用性を用いる場合を考える。可用性を表す指標の１つに、稼働率が挙げられる。稼働率のような性能に対する制約条件もコスト関数により表わされる。稼働率を表すコスト関数は、利用するサービス間の関係に応じて変わり得る。
【０１９８】
図２５は、サービス間の関係の例を示す図である。図２５では、サービスｓ１，ｓ２，ｓ３の連携方法に応じたサービスｓ１，ｓ２，ｓ３の間の関係の２つの候補を例示している。サービス間の関係（接続関係）は、サービスをノード、あるサービスから別のサービスの呼び出しをエッジとしたグラフによって表される。
【０１９９】
図２５（Ａ）は、グラフ１５１を示す。グラフ１５１は、サービスｓ１からサービスｓ２，ｓ３の何れか一方が呼び出される関係を示す。例えば、サービスｓ２，ｓ３が相互に相手のサービス処理を代替可能である場合、サービスｓ１が稼働し、かつ、サービスｓ２，ｓ３の何れか一方が稼働していれば、ユーザは、サービスｓ１，ｓ２，ｓ３の連携により実現されるアプリケーションを利用できる。
【０２００】
図２５（Ｂ）は、グラフ１５２を示す。グラフ１５２は、サービスｓ１からサービスｓ２を呼び出し、サービスｓ２からサービスｓ３が呼び出される関係を示す。この場合、サービスｓ１，ｓ２，ｓ３の全てが稼働していなければ、ユーザは、サービスｓ１，ｓ２，ｓ３の連携により実現されるアプリケーションを利用できない。
【０２０１】
例えば、稼働率として、動作可能時間（ＭＴＢＦ：Mean Time Between Failures）と動作不能時間（ＭＴＴＲ：Mean Time To Recovery）との和に対する動作可能時間の比（ＭＴＢＦ／（ＭＴＢＦ＋ＭＴＴＲ））を用いる場合を考える。この場合、グラフ１５１に対応するサービス構成での稼働率を表すコスト関数と、グラフ１５２に対応するサービス構成での稼働率を表すコスト関数は、相違する。このように、サービス間の関係に応じて、コスト関数が変わることがある。サービス間の関係は、ユーザによるプログラム１４２の記述に応じて決まる。そこで、第３の実施の形態では、開発サーバ１００は、サービス間の関係に応じて適切なコスト関数を使用して、利用するサービスの選択を支援する機能を提供する。
【０２０２】
図２６は、第３の実施の形態の開発サーバの機能例を示すブロック図である。開発サーバ１００は、図４で例示した機能に加えて、更に、コスト関数記憶部１２５およびサービス構成モデル記憶部１２６を有する。コスト関数記憶部１２５およびサービス構成モデル記憶部１２６は、例えば、ＲＡＭ１０２またはＨＤＤ１０３に確保した記憶領域を用いて実装される。
【０２０３】
コスト関数記憶部１２５は、サービス構成のパタンに対応するコスト関数を、当該パタン毎に予め記憶する。サービス構成モデル記憶部１２６は、サービス選択部１３４により以下に示す処理によって特定されたサービス構成を、ユーザ毎に記憶する。例えば、ユーザは、クライアント１１のＷｅｂブラウザを用いて、開発サーバ１００にアクセスし、既存のアプリケーションソフトウェアに対応するサービス構成を確認することができる。
【０２０４】
サービス選択部１３４は、第２の実施の形態の機能に加えて、ユーザにより入力されたプログラムに対応するサービス構成の特定と、当該サービス構成に応じたコスト関数の選択とを行う。サービス選択部１３４は、ユーザにより入力されたプログラムの抽象構文木を深さ優先探索で解析することで、サービス構成を表すグラフを生成する。サービス選択部１３４は、生成したグラフで表されるサービス構成と、コスト関数記憶部１２５に記憶されたサービス構成のパタンとを照合し、生成したグラフに対応するコスト関数をコスト関数記憶部１２５から取得する。サービス選択部１３４は、取得したコスト関数を用いて、利用するサービスを選択する。
【０２０５】
図２７は、変換前プログラムと制約条件の例を示す図である。プログラム１４２は、プログラム記憶部１２２に記憶される。プログラム１４２は、図６で例示した変換前プログラムと同じである。
【０２０６】
制約条件１４３ａは、プログラム記憶部１２２に記憶されている。制約条件１４３ａは、クライアント１１から受信された情報である。図２７では制約条件１４３ａは、パラメータとして「Ａｖａｉｌａｂｉｌｉｔｙ」を含む。「Ａｖａｉｌａｂｉｌｉｔｙ」は、プログラム１４２をクラウドサービスを用いて実行する際に許容される稼働率の下限である。図２７では、稼働率の下限は「９９％」に設定されている。
【０２０７】
制約条件１４３ａとして、稼働率を用いる場合、変換ルール記憶部１２３に記憶された変換ルールテーブル１４５のコストの項目には、各利用サービスの稼働率が予め登録される。
【０２０８】
図２８は、コスト関数テーブルの例を示す図である。コスト関数テーブル１５３は、コスト関数記憶部１２５に記憶される。コスト関数テーブル１５３は、グラフ情報およびコスト関数の項目を含む。グラフ情報の項目には、予め用意されたサービス構成のパタンを示すグラフデータが登録される。コスト関数の項目には、当該サービス構成のパタンに対応するコスト関数が登録される。例えば、コスト関数テーブル１５３には、グラフ情報「ｇｒａｐｈ１」に対して、コスト関数「ｆｕｎｃ１」が登録されている。
【０２０９】
サービス選択部１３４は、ユーザにより記述されたプログラムに対して生成したグラフが、グラフ情報「ｇｒａｐｈ１」に適合する場合、サービスの選択にコスト関数「ｆｕｎｃ１」を利用できる。すなわち、サービス選択部１３４は、生成したグラフで示されるサービス候補間の接続関係が、グラフ情報「ｇｒａｐｈ１」で示されるサービス間の接続関係に適合する場合に、サービスの選択にコスト関数「ｆｕｎｃ１」を利用できる。コスト関数テーブル１５３には、サービス構成（サービス間の接続関係）の複数のパタンに応じた複数のグラフデータが予め登録される。
【０２１０】
図２９は、サービス構成モデルの例を示す図である。グラフ１５４は、プログラム１４２に対応するサービス構成モデルを示すグラフである。グラフ１５４は、ノード１５４ａ，１５４ｂ，１５４ｃ，１５４ｄおよびエッジ１５５ａ，１５５ｂ，１５５ｃを有する。
【０２１１】
ノード１５４ａは、変換ルールテーブル１４５におけるルールＩＤ「Ｒ２」、「Ｒ３」のコンテナサービスＡ１，Ａ２に対して作成されるノードである。ルールＩＤ「Ｒ２」、「Ｒ３」は、抽象構文木１４４におけるコンテナ名「ｃｓｖ」のコンテナを作成するノードに対して適用される。このため、サービス選択部１３４は、ノード１５４ａのノード名を「Ｓ＿ｃｓｖ」とする。接頭辞の「Ｓ＿」は、コンテナ作成に対応するノードであることを示す。後述するように、サービス選択部１３４は、サービスインスタンス名をノード名とすることができる。
【０２１２】
サービス選択部１３４は、ノード１５４ａに対応する選択候補のサービスとして、コンテナサービスＡ１，Ａ２の識別情報１５６ａ（「Ｓｅｒｖｉｃｅｓ：［Ａ１，Ａ２］」）をノード１５４ａに設定する。
【０２１３】
エッジ１５５ａは、ノード１５４ａを起点とするエッジである。サービス選択部１３４は、変換ルールテーブル１４５におけるルールＩＤ「Ｒ２」、「Ｒ３」に対応するテンプレートを参照することで、選択候補のサービス（コンテナサービスＡ１，Ａ２）に対して用意されたＡＰＩを特定する。例えば、サービス選択部１３４は、ノード１５４ａに対して、ＡＰＩ「ｇｅｔＯｂｊｅｃｔ」をテンプレートから特定し、ノード１５４ａを起点とするエッジ１５５ａとして追加する。サービス選択部１３４は、ＡＰＩ情報１５７ａ（「ａｐｉ：ｇｅｔＯｂｊｅｃｔ」）を、エッジ１５５ａに設定する。
【０２１４】
ここで、ルール名「ＰｕｔＩｎＣｏｎｔａｉｎｅｒ」が適用される抽象構文木１４４のノードも、コンテナ名「ｃｓｖ」のコンテナに対する操作である。ただし、当該操作は、コンテナ名「ｃｓｖ」のコンテナに対する単なるＰＵＴ操作であるため、サービス選択部１３４は、グラフ１５４に対して新規にノードを追加しない。
【０２１５】
ノード１５４ｂは、変換ルールテーブル１４５におけるルールＩＤ「Ｒ５」、「Ｒ６」のサーバレス関数のサービスＡＦ１，ＡＦ２に対して作成されるノードである。ルールＩＤ「Ｒ５」、「Ｒ６」は、抽象構文木１４４におけるコンテナ名「ｃｓｖ」のコンテナに代入された値を用いるノードに対して適用される。このため、サービス選択部１３４は、ノード１５４ｂのノード名を「Ｆ＿ｃｓｖ」とする。接頭辞の「Ｆ＿」は、コンテナに代入された値に対する処理に対応するノードであることを示す。サービス選択部１３４は、ノード１５４ｂに対応する選択候補のサービスとして、サーバレス関数のサービスＡＦ１，ＡＦ２の識別情報１５６ｂ（「Ｓｅｒｖｉｃｅｓ：［ＡＦ１，ＡＦ２］」）をノード１５４ｂに設定する。
【０２１６】
また、サービス選択部１３４は、抽象構文木１４４またはプログラム１４２から、ルールＩＤ「Ｒ５」、「Ｒ６」の適用の前提となるコンテナのコンテナ名「ｃｓｖ」を特定する。このため、サービス選択部１３４は、エッジ１５５ａの終点にノード１５４ｂを接続する。
【０２１７】
エッジ１５５ｂは、ノード１５４ｂを起点とするエッジである。サービス選択部１３４は、変換ルールテーブル１４５におけるルールＩＤ「Ｒ５」、「Ｒ６」に対応するテンプレートを参照することで、選択候補のサービス（サーバレス関数のサービスＡＦ１，ＡＦ２）に対して用意されたＡＰＩを特定する。例えば、サービス選択部１３４は、ノード１５４ｂに対して、ＡＰＩ「ｐｕｔＯｂｊｅｃｔ」をテンプレートから特定し、ノード１５４ｂを起点とするエッジ１５５ｂとして追加する。サービス選択部１３４は、ＡＰＩ情報１５７ｂ（「ａｐｉ：ｐｕｔＯｂｊｅｃｔ」）を、エッジ１５５ｂに設定する。
【０２１８】
ノード１５４ｃは、変換ルールテーブル１４５におけるルールＩＤ「Ｒ７」、「Ｒ８」のコンテナサービスＦＡ１，ＦＡ２に対して作成されるノードである。ルールＩＤ「Ｒ７」、「Ｒ８」のコンテナサービスＦＡ１，ＦＡ２に関するルールは、抽象構文木１４４におけるコンテナ名「ｒｅｃｏｒｄ」のコンテナを作成するノードに対して適用される。このため、サービス選択部１３４は、ノード１５４ｃのノード名を「Ｓ＿ｒｅｃｏｒｄ」とする。サービス選択部１３４は、ノード１５４ｃに対応する選択候補のサービスとして、コンテナサービスＦＡ１，ＦＡ２の識別情報１５６ｃ（Ｓｅｒｖｉｃｅｓ：［ＦＡ１，ＦＡ２］）をノード１５４ｃに設定する。
【０２１９】
また、サービス選択部１３４は、抽象構文木１４４におけるコンテナ名「ｒｅｃｏｒｄ」のコンテナを作成するノードが、前段のノード１５４ｂに対応する処理のスコープ内にあることを特定する。このため、サービス選択部１３４は、ノード１５４ｂを起点とするエッジ１５５ｂの終点に、ノード１５４ｃを接続する。サービス選択部１３４は、プログラム１４２の記述に基づいて、コンテナ名「ｒｅｃｏｒｄ」のコンテナ作成処理が、前段のノード１５４ｂに対応する処理のスコープ内にあることを特定してもよい。なお、サービス選択部１３４は、後述するノード１５４ｄについても同様に、ノード１５４ｂに対応する処理のスコープ内にあることを特定することができる。
【０２２０】
エッジ１５５ｃは、ノード１５４ｃを起点とするエッジである。サービス選択部１３４は、変換ルールテーブル１４５におけるルールＩＤ「Ｒ７」、「Ｒ８」に対応するテンプレートを参照することで、選択候補のサービス（コンテナサービスＦＡ１，ＦＡ２）に対して用意されたＡＰＩを特定する。例えば、サービス選択部１３４は、ノード１５４ｃに対して、ＡＰＩ「ｉｎｖｏｋｅＦｕｎｃｔｉｏｎ」をテンプレートから特定し、ノード１５４ｃを起点とするエッジ１５５ｃとして追加する。サービス選択部１３４は、ＡＰＩ情報１５７ｃ（「ａｐｉ：ｉｎｖｏｋｅＦｕｎｃｔｉｏｎ」）を、エッジ１５５ｃに設定する。
【０２２１】
ノード１５４ｄは、変換ルールテーブル１４５におけるルールＩＤ「Ｒ７」、「Ｒ８」のサーバレス関数のサービスＦ１，Ｆ２に対して作成されるノードである。ルールＩＤ「Ｒ７」、「Ｒ８」のサーバレス関数のサービスＦ１，Ｆ２に関するルールは、抽象構文木１４４におけるコンテナ名「ｒｅｃｏｒｄ」のコンテナ作成処理からの関数呼び出しのノードに対して適用される。このため、サービス選択部１３４は、ノード１５４ｄのノード名を「Ｆ＿ｒｅｃｏｒｄ」とする。サービス選択部１３４は、ノード１５４ｄに対応する選択候補のサービスとして、サーバレス関数のサービスＦ１，Ｆ２の識別情報１５６ｄ（「Ｓｅｒｖｉｃｅｓ：［Ｆ１，Ｆ２］」）をノード１５４ｄに設定する。サービス選択部１３４は、サーバレス関数のサービスＦ１，Ｆ２が他のサービスを呼び出さないので、ノード１５４ｄを起点とするエッジを作成しない。
【０２２２】
なお、上記で示したグラフ１５４のノード名は、一例であり、他のノードと区別可能であればよい。例えば、サービス選択部１３４は、抽象構文木１４４における変換ルールの適用対象のノードに、当該変換ルールを適用して得られるコード片からリソース名（サービスインスタンス名）を抽出してグラフ１５４のノード名としてもよい。この場合、例えば、サービス選択部１３４は、図１５のサービスインスタンスの構成で例示したサービスインスタンス名を、ルール適用後のコード片から抽出してグラフのノード名とする。より具体的には、サービス選択部１３４は、プログラム１４２に対し、ノード１５４ａのノード名を「ｃｓｖ」、ノード１５４ｂのノード名を「ｓｐｌｉｔＣｓｖ」、ノード１５４ｃのノード名を「ｒｅｃｏｒｄ」、ノード１５４ｄのノード名を「ｓｅｎｄＥｍａｉｌ」のように決定してもよい。そして、サービス選択部１３４は、当該サービスインスタンス間の接続をエッジで表す。
【０２２３】
このようにして、サービス選択部１３４は、プログラム１４２に対するサービス構造モデルを表すグラフ１５４を生成する。
次に、第３の実施の形態の開発サーバ１００の処理手順を説明する。
【０２２４】
図３０は、プログラム解析の手順例を示すフローチャートである。第３の実施の形態では、図１６で例示した第２の実施の形態の手順のステップＳ２０に代えて、ステップＳ２３，Ｓ２４を含む点が異なる。ステップＳ１９  Ｙｅｓの場合に、ステップＳ２３が実行される。ステップＳ２３，Ｓ２４は、サービス選択部１３４がユーザにより入力されたプログラムからサービス構成モデルを示すグラフを作成する処理である。また、ステップＳ２２では、ステップＳ２３，Ｓ２４の結果（サービス構成モデルを示すグラフ）に応じた処理を実行する。そこで、以下では、ステップＳ２３，Ｓ２４を主に説明し、ステップＳ１０〜Ｓ２２の説明を省略する。
【０２２５】
（Ｓ２３）サービス選択部１３４は、抽象構文木１４４における該当のノードに変換ルールを適用して得られるコード片からリソースを抽出してグラフのノードとする。ここで、「抽象構文木１４４における該当のノード」とは、ステップＳ１４で選択されている抽象構文木１４４のノードを示す。例えば、サービス選択部１３４は、作成対象のサービスインスタンス名をリソースとして抽出し、当該グラフのノードのノード名に設定する。サービス選択部１３４は、元エッジがあれば当該グラフのノードを元エッジと接続する。「元エッジ」とは、今回グラフに追加したノードに対応するサービスの呼出元であるサービスに対応するノードを起点とするエッジである。なお、前述のルール名「ＰｕｔＩｎＣｏｎｔａｉｎｅｒ」が適用される処理のように、既存のノードで示されるリソースへの単なるＰＵＴ操作については、サービス選択部１３４は、新たなノードを追加せずに、ステップＳ１３に処理を進めてよい。
【０２２６】
（Ｓ２４）サービス選択部１３４は、ステップＳ２３で追加したノードに対応する変換ルールのテンプレートを参照して、当該ノードにエッジを追加する。サービス選択部１３４は、サービスインスタンス間の呼出確率、使用されたルール名、および、クラウドサービスにおけるＡＰＩの情報を、追加したエッジに設定する。なお、サービス選択部１３４は、ステップＳ２３で追加したノードにエッジを追加しない場合、ステップＳ２４をスキップしてもよい。そして、ステップＳ１３に処理が進む。
【０２２７】
ここで、ステップＳ２４では、サービス選択部１３４は、ステップＳ２３で追加したノードに対応する変換ルールのテンプレートに基づいて、次のサービスインスタンスの呼出確率を特定することが考えられる。
【０２２８】
呼出確率は、例えば、次のサービスを呼出すためのＡＰＩが複数ある場合における各ＡＰＩの利用割合である。例えば、サービス選択部１３４は、提供されている全てのＡＰＩからどのルートを使用するかに応じて計算される。あるいは、サービスインスタンスによる各ＡＰＩの利用割合の情報は、変換ルール記憶部１２３に予め格納されてもよい。この場合、サービス選択部１３４は、変換ルール記憶部１２３を参照して、グラフ中のあるノードを起点とするエッジについて、当該エッジに対応するＡＰＩの利用割合（すなわち、当該ＡＰＩを利用して次のサービスを呼出す呼出確率）を特定できる。例えば、テンプレートのコードに基づいて利用割合を特定する方法の他にも、サービスインスタンスによる各ＡＰＩの過去の利用割合の実績を変換ルール記憶部１２３に格納しておき、当該利用割合を用いることも考えられる。
【０２２９】
サービス選択部１３４は、図３０の手順により、例えば、プログラム１４２に対してサービス構成モデルを示すグラフ１５４を生成する。サービス選択部１３４は、例えば、プログラム１４２に対して作成したグラフ１５４の情報を、サービス構成モデル記憶部１２６に格納する。ステップＳ２２では、サービス選択部１３４は、グラフ１５４に基づいてコスト関数を取得し、サービスを選択する。
【０２３０】
図３１は、サービス組合せ決定の手順例を示すフローチャートである。第３の実施の形態では、図１７で例示した第２の実施の形態の手順のステップＳ３０の前に、ステップＳ２９を含む点が異なる。そこで、以下では、ステップＳ２９を説明し、ステップＳ３０〜Ｓ３４の説明を省略する。
【０２３１】
（Ｓ２９）サービス選択部１３４は、コスト関数記憶部１２５に記憶されたコスト関数テーブル１５３を参照して、図３０の手順で作成されたグラフで示されるサービス構造モデルに対応するコスト関数を選択する。例えば、サービス選択部１３４は、図３０の手順で作成したグラフと、コスト関数テーブル１５３に記憶されたグラフ情報とを照合し、作成したグラフの木構造に最も良く一致するグラフ情報を特定する。サービス選択部１３４は、特定したグラフ情報に対応付けられたコスト関数を、コスト関数テーブル１５３から取得する。そして、ステップＳ３０に処理が進む。
【０２３２】
サービス選択部１３４は、ステップＳ２９で選択したコスト関数を用いて、ステップＳ３０以降の手順を実行する。このように、サービス選択部１３４は、ユーザにより入力されたプログラムのコードパターンに基づいて、サービスの候補間の接続関係を特定し、接続関係に応じたコスト関数を決定する。
【０２３３】
なお、図３１の例では、コストとして稼働率を想定している。このため、ステップＳ３２では、利用するサービスの組合せを最大コスト（すなわち、最大稼働率）の組合せに決定する点に注意されたい。ただし、コストとして他のパラメータを用いる場合には、第２の実施の形態で例示したように、ステップＳ３２において最小コストの組合せに決定することもあり得る。
【０２３４】
また、開発ＵＩ部１３１は、クライアント１１のＷｅｂブラウザの要求に応じて、グラフ１５４の情報（ノードやエッジに付与した情報を含む）をクライアント１１に送信し、プログラム１４２に対するサービス構成モデルをユーザに提供することができる。
【０２３５】
次に、サービス構成モデルに応じたコスト関数の例を説明する。
図３２は、サービス構成モデルに応じたコスト関数の例を示す図である。コストとして、稼働率を考える。図３２（Ａ）は、サービスに対する条件の例を示す。図３２（Ａ）の条件は、図１９（Ｂ）で例示した条件と同じである。変数Ａ１，Ａ２，ＡＦ１，ＡＦ２，ＦＡ１，ＦＡ２，Ｆ１，Ｆ２の意味は、図１９で説明した意味と同じである。
【０２３６】
また、「コンテナサービスＡ１」の稼働率を「ａ１」とする。「コンテナサービスＡ２」の稼働率を「ａ２」とする。「サーバレス関数のサービスＡＦ１」の稼働率を「ａｆ１」とする。「サーバレス関数のサービスＡＦ２」の稼働率を「ａｆ２」とする。「コンテナサービスＦＡ１」の稼働率を「ｆａ１」とする。「コンテナサービスＦＡ２」の稼働率を「ｆａ２」とする。「サーバレス関数のサービスＦ１」の稼働率を「ｆ１」とする。「サーバレス関数のサービスＦ２」の稼働率を「ｆ２」とする。
【０２３７】
図３２（Ｂ）は、コスト関数の例（その１）を示す。コスト関数１６１は、サービス構成モデル１５８に対応するコスト関数である。サービス構成モデル１５８では、「コンテナサービスＡ１（またはＡ２）」、「サーバレス関数のサービスＡＦ１（またはＡＦ２）」、「コンテナサービスＦＡ１（またはＦＡ２）」、「サーバレス関数のサービスＦ１（またはＦ２）」が直列に接続される。
【０２３８】
この場合、コスト関数１６１は、（ａ１  ｏｒ  ａ２）＊（ｆａ１  ｏｒ  ｆａ２）＊（ｆ１  ｏｒ  ｆ２）＊（ａｆ１  ｏｒ  ａｆ２）＞＝Ａである。「ｏｒ」演算は、「ｏｒ」の左右に記述された稼働率の何れか一方を選択することを示す。
【０２３９】
図３２（Ｃ）は、コスト関数の例（その２）を示す。コスト関数１６２は、サービス構成モデル１５９に対応するコスト関数である。サービス構成モデル１５９では、「コンテナサービスＡ１（またはＡ２）」に対して、「サーバレス関数のサービスＦ１（またはＦ２）」と、「サーバレス関数のサービスＡＦ１（またはＡＦ２）」とが並列に接続される。また、「サーバレス関数のサービスＡＦ１（またはＡＦ２）」に対して、更に、「コンテナサービスＦＡ１（またはＦＡ２）」が接続される。
【０２４０】
ここで、「コンテナサービスＡ１（またはＡ２）」から「サーバレス関数のサービスＦ１（またはＦ２）」への呼出確率はｐ１（０＜ｐ１＜１）である。更に、「コンテナサービスＡ１（またはＡ２）」から「サーバレス関数のサービスＡＦ１（またはＡＦ２）」への呼出確率はｐ２（０＜ｐ２＜１）である。なお、ｐ１＋ｐ２＝１である。
【０２４１】
この場合、コスト関数１６２は、Ｒ１＊ｐ１＋（Ｒ２＊（ａ１  ｏｒ  ａ２））＊ｐ２＞＝Ａである。ここで、Ｒ１＝（ａ１  ｏｒ  ａ２）＊（ｆ１  ｏｒ  ｆ２）である。また、Ｒ２＝（ａｆ１  ｏｒ  ａｆ２）＊（ｆａ１  ｏｒ  ｆａ２）である。
【０２４２】
上記のように、コスト関数は、ユーザによって入力されたプログラムに対応するサービス構成モデルに応じて異なることがある。サービス選択部１３４は、ユーザによって入力されたプログラムから、当該プログラムの機能をクラウドサービスとして実装するためのサービス構成モデルを特定し、当該サービス構成モデルに応じたコスト関数を選択する。
【０２４３】
特に、サービス選択部１３４は、サービスの候補間の接続関係を特定する際に、サービスの候補間の呼出確率を取得する。そして、サービス選択部１３４は、サービスの候補間の接続関係に含まれる当該呼出確率に基づいてコスト関数を決定してもよい。例えば、サービス構成モデル１５９に対してサービス選択部１３４がコスト関数テーブル１５３から抽出したコスト関数には、呼出確率を設定可能なパラメータが予め用意される。サービス選択部１３４は、当該パラメータに対して今回のサービス候補における呼出確率を代入することで、サービス選択に用いるコスト関数を決定する。
【０２４４】
なお、上記のコスト関数は一例であり、サービス構成モデル１５８，１５９に対して他のコスト関数を用いてもよい。
このように、第３の実施の形態の開発サーバ１００によれば、サービス構成モデル（サービス候補間の接続関係）に応じた適切なコスト関数によりユーザにより利用されるサービスを選択することができる。その結果、ユーザが所望するコストや性能などの条件を満たす適切なサービスの選択が可能になる。
【０２４５】
また、第１の実施の形態の情報処理は、処理部１ｂにプログラムを実行させることで実現できる。また、第２，第３の実施の形態の情報処理は、ＣＰＵ１０１にプログラムを実行させることで実現できる。プログラムは、コンピュータ読み取り可能な記録媒体１１３に記録できる。
【０２４６】
例えば、プログラムを記録した記録媒体１１３を配布することで、プログラムを流通させることができる。また、プログラムを他のコンピュータに格納しておき、ネットワーク経由でプログラムを配布してもよい。コンピュータは、例えば、記録媒体１１３に記録されたプログラムまたは他のコンピュータから受信したプログラムを、ＲＡＭ１０２やＨＤＤ１０３などの記憶装置に格納し（インストールし）、当該記憶装置からプログラムを読み込んで実行してもよい。
【符号の説明】
【０２４７】
１  情報処理装置
１ａ  記憶部
１ｂ  処理部
２，３，４  サーバ
５  クライアント
６  ネットワーク
７  制約条件
８  プログラム
８ａ，８ｂ  コード
９  ルールテーブル
Ｕ１  ユーザ
【図１】
2019109874.tif 000003
【図２】
2019109874.tif 000004
【図３】
2019109874.tif 000005
【図４】
2019109874.tif 000006
【図５】
2019109874.tif 000007
【図６】
2019109874.tif 000008
【図７】
2019109874.tif 000009
【図８】
2019109874.tif 000010
【図９】
2019109874.tif 000011
【図１０】
2019109874.tif 000012
【図１１】
2019109874.tif 000013
【図１２】
2019109874.tif 000014
【図１３】
2019109874.tif 000015
【図１４】
2019109874.tif 000016
【図１５】
2019109874.tif 000017
【図１６】
2019109874.tif 000018
【図１７】
2019109874.tif 000019
【図１８】
2019109874.tif 000020
【図１９】
2019109874.tif 000021
【図２０】
2019109874.tif 000022
【図２１】
2019109874.tif 000023
【図２２】
2019109874.tif 000024
【図２３】
2019109874.tif 000025
【図２４】
2019109874.tif 000026
【図２５】
2019109874.tif 000027
【図２６】
2019109874.tif 000028
【図２７】
2019109874.tif 000029
【図２８】
2019109874.tif 000030
【図２９】
2019109874.tif 000031
【図３０】
2019109874.tif 000032
【図３１】
2019109874.tif 000033
【図３２】
2019109874.tif 000034