(1)第1の実施の形態
以下図面について、本発明の一実施の形態を詳述する。本実施の形態では、プログラムの開発支援、特に、ITシステム全体をソースコードとして記述し、ソースコードを用いてシステムを構築する方法(IaC)の開発を支援する技術に関して説明する。本実施の形態は、一例であって、本実施の形態に示す要素(構成、対象、用途等)以外の要素に適用してもよい。
図1において、100は全体として本実施の形態によるパッケージシステムを示す。
図1は、パッケージシステム100に係る構成の一例を示す図である。パッケージシステム100は、リポジトリ110と、CI(Continuous Integration)システム120と、マーケットプレイスシステム130と、実行環境140と、パッケージ化支援システム150とを含んで構成される。
パッケージをマーケットプレイスシステム130に登録する提供者101は、マーケットプレイスシステム130に登録するパッケージのもとになるパッケージソースコード111を指定されたリポジトリ110に登録する。リポジトリ110の例としては、クラウドサービスでは、GitHub(https://github.com/)、OSSでは、GitLabといったものである。パッケージソースコード111の例については、図2を用いて後述する。
なお、図1では、マーケットプレイスシステム130に含まれる複数のパッケージのパッケージソースコード111を、1つのリポジトリ110で管理する例を示しているが、パッケージに対応するパッケージソースコード111ごとにリポジトリ110が分かれている構成であってもよい。
ここで、パッケージとは、マーケットプレイスシステム130に登録する単位であり、パッケージ単位に対応したシステムが構築されるものである。なお、詳細は後述するが、パッケージは、マーケットプレイスシステム130で管理したり表示したりするための各種の情報、システムを構築するためのインストールイメージ131の実体または参照、システム上で動作するアプリケーションのアプリイメージ132の実体または参照等からなるものである。
登録されたパッケージソースコード111は、CIシステム120によりパッケージのビルド(作成)が行われる。パッケージのビルド(ビルド処理)とは、パッケージソースコード111から、インストールを実行するためのインストールイメージ131、仮想サーバ、コンテナ等で実行されるアプリインスタンス141のアプリイメージ132、マーケットプレイスシステム130で表示したり管理したりするためのパッケージ管理情報133等を生成する処理のことである。
インストールイメージ131としては、インストール処理を実行するバイナリ情報、CNAB(Cloud Native Application Bundles、https://cnab.io/)が定めるインストールのためのコンテナイメージ、パッケージソースコード111の一部または全部、パッケージソースコード111の一部または全部をtar等でアーカイブ(圧縮)した情報、パッケージソースコード111をコンパイルしたバイナリ等が挙げられる。同様に、アプリイメージ132としては、アプリインスタンス141を実行するためのバイナリ、仮想サーバのイメージ、コンテナイメージ等である。なお、パッケージ管理情報133については、図7を用いて後述する。
ビルド処理は、パッケージソースコード111の登録等を契機として自動的に開始することが一般的である。本実施の形態では、CIシステム120がビルド処理を行う。CIシステム120の例としては、Jenkins(https://jenkins.io/)、GitLab−CI(https://docs.gitlab.com/ee/ci/)等、有償無償問わず、様々な資源(ソフトウェア、サービス等)が提供されている。ビルド処理の指定方法については、選択する資源により異なり、CIシステム120内部に情報を持つ場合、パッケージソースコード111の一部に含まれる場合等がある。
ビルド処理により作成されたインストールイメージ131、アプリイメージ132およびパッケージ管理情報133は、マーケットプレイスシステム130の記憶装置(レジストリ134等)に登録される。レジストリ134は、便宜上、マーケットプレイスシステム130の内に含まれるように記述しているが、マーケットプレイスシステム130の外側に設けられていてもよい。また、マーケットプレイスシステム130は、パッケージ管理情報133等を用いて、マーケットプレイスシステム130の利用者102に対してポータル画面135を表示装置に表示する。ポータル画面135の例については、図3を用いて後述する。
利用者102は、ポータル画面135を用いて今回、利用したいパッケージを選択する。利用者102がパッケージを選択すると、マーケットプレイスシステム130は、選択されたパッケージのインストールイメージ131を用いて実行環境140にデプロイ処理を実施する。実行環境140は、パッケージを動作させるための環境である。実行環境140は、例えば、パブリッククラウドサービス、プライベートクラウドサービス、OpenStack、Kubernetes等のオーケストレーションツールで管理されるITリソースのクラスタ等である。また、利用者102が選択したパッケージを動作させる実行環境140については、利用者102が指定する形式であってもよいし、マーケットプレイスシステム130が自動的に選択する形式であってもよい。加えて、マーケットプレイスシステム130は、複数の利用者102で共用されることが一般である。このとき実行環境140は、利用者102毎に異なる実行環境であってもよいし、1つの実行環境を共用する形であってもよい。
マーケットプレイスシステム130によるデプロイ処理が行われた結果、実行環境140には、アプリイメージ132の実行状態であるアプリインスタンス141、アプリインスタンス141の動作を規定した設定ファイルであるConfig142等からなる、パッケージに対応したシステム(以下、インスタンス143)が構築される。ここで、アプリインスタンス141は、Config142の記述に応じて、1または複数であってよい。
そして、利用者102は、構築されたインスタンス143に必要な変更を加え、利用者102の用途にあった開発(インスタンス143に対する変更)を行う。パッケージとして再度登録できるものが開発できた利用者102は、パッケージ化支援システム150を用いて、開発したITシステム(例えば、インスタンス143)のパッケージ化を行う。
パッケージ化支援システム150は、パッケージ化部151と、利用者102からの入出力を受け付けるパッケージ化支援画面152とを備え、利用者102が開発したインスタンス143のパッケージの登録等を支援する。
なお、以降の図および説明では、実行環境140としては、Kubernetes、デプロイ処理としては、Helm、インストールイメージ131としては、Helmを内包したCNABに従うコンテナイメージを例に挙げて説明する。しかしながら、本実施の形態は、上述の構成に限られるものではない。例えば、実行環境140としては、パブリッククラウドサービスのIaaS(Infrastructure as a Service)、実行環境140に構築する対象としては、コンテナではなく仮想サーバ、デプロイ処理としては、Terrafromといった組合せを採用してもよい。
図2は、パッケージソースコード111のディレクトリ構成の一例を示す図である。本例は、コンテナによるインストールイメージ131と、アプリインスタンス141が入ったコンテナとしてアプリイメージ132を作成するものである。
パッケージソースコード111には、実行環境140への実際のデプロイ処理を行うためのツールを格納したbinディレクトリ201、Config142を作成するためのひな型のファイル群であるchartディレクトリ202、インストールイメージ131を作成するためのDockerfile203、パッケージ管理情報133を作成するためのデータ、メタデータ等を記述したbundle.json204、アプリイメージ132を作成するためのファイル群を格納したappsディレクトリ205等が含まれる。
パッケージソースコード111を用いてCIシステム120がビルド処理を行うこととなる。より具体的には、インストールイメージ131の作成として、実行環境140への実際のデプロイ処理を行うツールであるhelmコマンド206、chartディレクトリ202等を含んだコンテナイメージが作成される。この場合、実際のデプロイ処理は、コンテナイメージの実行を経由してhelmコマンド206がchartディレクトリ202を伴って実行されることでデプロイ処理が行われる。chartディレクトリ202には、ひな型のファイル群(一例がdeploy.yaml207)、ひな型のファイル群に与える変数および当該変数のデフォルト値を指定する変数ファイル(一例がvalues.yaml208)等が含まれる。deploy.yaml207およびvalues.yaml208については、図4を用いて後述する。また、appsディレクトリ205の情報等を用いてアプリイメージ132も同様に作成される。
以降、ひな型のファイル群であるchartディレクトリ202全体をテンプレート情報、deploy.yaml207のようなひな型のファイルをテンプレートファイル、values.yaml208のような変数およびデフォルト値を含むファイルを変数ファイルと呼ぶこととする。
図3は、ポータル画面135の一例を示す図である。
ポータル画面135では、デプロイ処理するパッケージが利用者102により選択される画面を示している。この他、ポータル画面135は、デプロイ処理により構築されたインスタンス143の情報、当該情報を管理するための画面等を備えていてもよい。
ポータル画面135におけるパッケージの選択では、例えば、パッケージをフィルタするためのキーワードを表示するペイン310、パッケージの一覧を表示するペイン320、選択しているパッケージの情報331、デプロイ処理を実行するためのデプロイボタン332等を表示するペイン330等が含まれる。1つのパッケージを示すパッケージ表示321には、パッケージの識別子、パッケージの名称、パッケージのバージョン等が表示される。さらに、パッケージ表示321を押下することにより、別画面にて詳細情報、例えば、より詳細な説明、使い方、使用上の注意事項、問合せ先等の情報が表示されるような機能を備えていてもよい。
図4は、デプロイ処理に係るデータの一例を示す図である。図4を用いて、インストールイメージ131に含まれるテンプレート情報(deploy.yaml207、values.yaml208等)と、テンプレート情報からデプロイ処理によって生成されるConfig142との関係を説明する。
テンプレート情報は、一般に、Config142のひな型であるdeploy.yaml207のようなテンプレートファイル群と、Config142のひな型に与える変数および当該変数のデフォルト値が定義されたvalues.yaml208のような形式である変数ファイルとを含む。
例えば、記述401(「image:{{.Values.image}}」)は、values.yaml208に定義された記述411(「image:NodeRED:1」)を読み込むことを意味している。以降、例えば、「image:{{.Values.image}}」のうち「image:」(特にimage)をkeyと呼び、{{.Values.image}}」の部分をvalueと呼ぶ。特に、上述のようにkeyに対するvalueが変数(本例では、{{}}で表記)となっている場合は(keyが)「変数化」されている、と呼ぶこととする。また、例えば、変数化を示す「{{.Values.image}}」のうち、「.Values.」は変数ファイルに記述されたKeyを参照することを示す接頭語であり、変数ファイルにおける変数のデフォルト値(読み込み箇所)を特定可能な表記である「image」を変数key(変数識別子)と呼ぶ。
そして、デプロイ処理時に、変数key「image」の変数に値を指定しなければ、デフォルト値である「NodeRED:1」が用いられ、この場合、Config142の記述421が生成される。なお、デプロイ処理時に、別の値、例えば、変数key「image」の変数に値「FlowEditor:1」を指定すれば、記述421は、「image:FlowEditor:1」のように生成される。
さらに、テンプレートファイルには、プログラム的な要素、例えば、記述402のような要素(例えば、if文)を含んでいてもよい。これによって、対応する変数である記述412が「true」である場合に、Config142上に記述422のように現れ、逆に「false」の場合は、現れないような制御を行うことができる。
以上のようにしてアプリインスタンス141の動作等を規定するConfig142が生成される。Config142は、一般に、表現する動作の概念に対応付いた階層構造で表現されることが多い。例えば、「image:NodeRED:1」は、「spec」を親として持つオブジェクトの要素の1つであることを意味している。この特徴を用い、ルートからの階層を「.」を用いてつなげることで、特定の要素を一意に表すこととする。この表現においては、記述421は、「spec.image:NodeRED:1」のように表現される。テンプレートファイルが複数存在(deploy.yaml207以外も存在)するような場合には、最初にファイル名を付加する等で対応することができる。
以上は、helmの流儀に従い、YAMLと呼ばれるkeyとvalueとの形式で表現されるが、YAML以外の形式、例えば、JSON等、別の形式であってもよい。ここで、keyとvalueとは、例えば、記述421の例では、「image」、「spec.image」がkeyであり、「NodeRED:1」がvalueのことである。
図5は、パッケージ化支援システム150に係る構成の一例を示す図である。
図5に示すように、リポジトリ110と、CIシステム120と、マーケットプレイスシステム130と、実行環境140と、パッケージ化支援システム150と、開発者(例えば、利用者102)が開発等に使用する端末501との各構成要素は、ネットワーク511を介して通信可能に接続されている。
各構成要素は、CPU(Central Processing Unit)、メモリ、ハードディスク等を備える計算機で動作(機能)する。各構成要素の動作は、それぞれ物理的に異なる計算機上で動作していてもよいし、仮想サーバと呼ばれる物理的な計算機を論理的に分割された計算機の単位で動作していてもよい。また、各構成要素の動作は、1台の計算機または複数の計算機のクラスタ上で実行されるタスク(プロセス、コンテナとも呼ばれる)単位であってもよい。
また、ネットワーク511は、インターネット、ローカルエリアネットワーク(LAN: Local Area Network)、専用の通信網、VLAN(Virtual Local Area Network)等に代表される仮想的なネットワークであってもよい。各構成要素と、端末501および実行環境140の間のネットワークは、利用する利用者102の違いから、ネットワークセグメントが異なっていたり、ファイアウォール等で論理的に通信制御されていたりすることが一般的である。さらに、端末501および実行環境140も、利用者102の手元にある計算機とパブリッククラウドサービスとのように異なることもある。
リポジトリ110は、パッケージソースコード111を1または複数記憶する。リポジトリ110は、マーケットプレイスシステム130にインストールイメージ131、アプリイメージ132およびパッケージ管理情報133を追加するに十分な情報を備えているならば、複数のリポジトリ110からなっていてもよい。また、パッケージソースコード111が複数の単位、例えば、インストールイメージ131、アプリイメージ132、パッケージ管理情報133といった構成要素単位にソースコードが分かれていてもよい。
CIシステム120は、CI管理情報521を用いてパッケージソースコード111をビルドし、マーケットプレイスシステム130にインストールイメージ131とアプリイメージ132とを登録するとともに、パッケージ管理情報133にパッケージ情報を追加する。なお、本実施の形態において、CIシステム120は、必須ではなく、ビルド処理とマーケットプレイスシステム130への各種情報の登録とを人が手作業で行い、CI管理情報521をデータベース等に登録するといった形態であってもよい。
マーケットプレイスシステム130は、インストールイメージ131およびアプリイメージ132を格納したレジストリ134と、パッケージ管理情報133と、インスタンス管理情報531と、ポータル情報出力部532と、デプロイ部533とを備える。
インストールイメージ131、アプリイメージ132、パッケージ管理情報133、インスタンス管理情報531等の各種の情報、ポータル情報出力部532、デプロイ部533を実現するためのプログラム等は、図示は省略する1以上の記憶装置に記憶されている。
なお、マーケットプレイスシステム130の機能(ポータル情報出力部532、デプロイ部533等)は、例えば、CPUがプログラムをメモリに読み出して実行すること(ソフトウェア)により実現されてもよいし、専用の回路等のハードウェアにより実現されてもよいし、ソフトウェアとハードウェアとが組み合わされて実現されてもよい。
ポータル情報出力部532は、ポータル画面135を、端末501または図示は省略する表示装置に表示し、デプロイ部533等に指示を渡す処理を行う。デプロイ部533は、ポータル情報出力部532からの指示を受け、実行環境140へのデプロイ処理を行う。デプロイ部533の処理については後述する。パッケージ管理情報133は、ポータル画面135に表示する情報、デプロイ部533が用いる情報を保持する。インスタンス管理情報531は、パッケージと、パッケージをデプロイした実行環境140で実際に動作する実体(インスタンス143)とを管理する情報である。なお、インスタンス管理情報531については、図9を用いて後述する。
レジストリ134は、インストールイメージ131およびアプリイメージ132を記憶する。レジストリ134は、便宜上1つとしているが、パッケージ管理情報133と結びつくのであれば、複数であってもよい。レジストリ134の例は、インストールイメージ131およびアプリイメージ132が何れもコンテナイメージである場合は、DockerRegistry等に代表されるコンテナレジストリであり、バイナリである場合は、バイナリを配布する機能を有した各種レジストリである。さらには、異なる複数種類のイメージ(例えば、バイナリおよびコンテナ)が混在する場合は、レジストリ134は、複数の異なる種類のレジストリ134からなるものであってもよい。レジストリ134は、その他、オブジェクトストレージ装置等、ネットワーク経由で利用できるストレージ装置等であってもよい。
実行環境140は、デプロイ処理されたパッケージのインスタンス143が動作する環境である。実行環境140としては、クラウドサービスでもよいし、物理サーバのクラスタ等であってもよい。また、実行環境140については、便宜上1つで表現しているが、パッケージによっては複数かつ異なる環境(例えば、仮想サーバが動作する環境と、SaaS(Software as a Service)と呼ばれるアプリケーションをクラウド型で提供するサービス)が混在するようなものであってもよい。
パッケージ化支援システム150は、対応関係情報541と、変換ルール情報542と、変更差分情報543と、パッケージ化部151と、イメージ化部544と、開発支援画面を利用者102に表示するための支援情報出力部545とを備える。
対応関係情報541、変換ルール情報542、変更差分情報543等の各種の情報、パッケージ化部151、イメージ化部544、支援情報出力部545等を実現するためのプログラム等は、図示は省略する1以上の記憶装置に記憶されている。
なお、パッケージ化支援システム150の機能(パッケージ化部151、イメージ化部544、支援情報出力部545等)は、例えば、CPUがプログラムをメモリに読み出して実行すること(ソフトウェア)により実現されてもよいし、専用の回路等のハードウェアにより実現されてもよいし、ソフトウェアとハードウェアとが組み合わされて実現されてもよい。付言するならば、パッケージ化支援システム150の各構成要素の詳細については後述する。
端末501は、利用者102がマーケットプレイスシステム130を用いてパッケージを選択したり、デプロイ処理の指示を行ったり、デプロイ処理されたパッケージのインスタンス143を管理したり、インスタンス143を変更(開発)したり、パッケージ化支援システム150を用いてパッケージを作成したりする作業用の端末である。
なお、ポータル情報出力部532が提供する画面、支援情報出力部545が提供する画面等には、例えば、端末501がブラウザによりアクセスして利用する形態がある。この他、ポータル情報出力部532および支援情報出力部545は、API(Application Program Interface)を提供し、描画処理を行うプログラムが、端末501に事前にダウンロードされてインストールされ、設定が行われた上で使うものであってもよい。また、実行環境140等が端末501と同等の機能を備える場合は、端末501は、構成要素としてなくてもよい。
図6は、CI管理情報521の一例を示す図である。
CI管理情報521は、パッケージソースコード111を一意に識別するための識別子であるソースID601、パッケージを一意に識別するための識別子であるパッケージID602、インストールイメージ131を一意に識別するための識別子であるインストーラID603、アプリイメージ132を一意に識別するための識別子であるアプリイメージID604等の情報を保持する。
ソースID601は、例えば、パッケージソースコード111が格納されたリポジトリ110上のURL(Uniform Resource Locator)等である。パッケージID602は、パッケージ管理情報133内と共通の識別子であり、一意にパッケージを識別するための識別子である。パッケージID602の発行は、CIシステム120が行ってもよいし、マーケットプレイスシステム130が行ってもよいし、提供者101が指定する形態であってもよい。インストーラID603は、インストーラを識別するためのIDであり、例えば、インストールイメージ131が格納された場所のURL等である。インストールイメージ131がインストールのためのコンテナイメージである場合は、当該コンテナイメージが格納されたレジストリ134上のパスおよびバージョン等のタグ情報(例えば、registry-url/pathto/image:tag)、コンテナイメージを特定するためのハッシュ値等である。アプリイメージID604も同様にアプリイメージ132へのURL等である。
ID群(ソースID601、パッケージID602、インストーラID603およびアプリイメージID604)の関係は、パッケージID602を主キーとして(1つに対して)、ソースID601、インストーラID603およびアプリイメージID604の各々は、1または複数であってもよい。また、アプリイメージID604は、CI管理情報521に直接含まれず、インストーラID603が指すインストールイメージ131の中に含まれるような形態であってもよい。
図7は、パッケージ管理情報133の一例を示す図である。
パッケージ管理情報133は、CI管理情報521に含まれるパッケージID602と同じ意味であるパッケージID701と、同じくインストーラID603と同じ意味であるインストーラID702との情報を保持する。
さらに、パッケージ管理情報133は、マーケットプレイスシステム130の管理上の情報と、ポータル画面135に表示するための情報とを含むメタデータ703(Metadata)の情報を保持する。例えば、メタデータ703は、ポータル画面135に表示する際のタイトル704(Title)、説明文705(Description)、その他、当該パッケージが使用できるエリア706(Region)、使用できる言語707(Language)、使用が想定される分野708(Field)、使用可能な国等、利用者102の属性に応じてパッケージの表示有無等を制御するため情報等である。メタデータ703は、提供者101が入力することを想定しており、対応するパッケージソースコード111の情報に含まれることが一般的である。この他、利用者101がマーケットプレイスシステム130を用いて入力する形態であってもよいし、推定可能な情報については、CIシステム120、マーケットプレイスシステム130の中で補完するような形態であってもよい。
なお、1つのパッケージID701に対してインストーラID702が複数であってもよく、対応するインストールイメージ131に実行順序がある場合は、実行順序の情報を含んでいてもよい。また、マーケットプレイスシステム130としてインストール時に標準で指定するパラメータがある場合(例えば、標準で使用するアプリイメージ132が格納されたレジストリ134のURL等)がある場合は、その値をパッケージ管理情報133が保持するようにしてもよい。
図8は、インスタンス管理情報531の一例を示す図である。
インスタンス管理情報531は、実行環境140にデプロイ処理したパッケージの実体(インスタンス143)の一意な識別子であるインスタンスID801、デプロイ処理したパッケージを識別するためのパッケージID802、成功、失敗等のデプロイ処理の結果の情報であるステータス803(Status)、デプロイ処理を実施したりデプロイ処理を管理したりする利用者102を一意に識別する利用者ID804(UserID)、実行環境140を特定するための情報であるプラットフォーム805(Platform)、プラットフォーム805にアクセスするための認証情報であるクレデンシャル806(Credential)、デプロイ処理時に利用者102が入力してインストールイメージ131に設定された入力値807(InputValues:デフォルト値)等の情報を保持する。
インスタンスID801は、マーケットプレイスシステム130上でデプロイ処理したパッケージの実体を一意に識別して管理するものであり、例えば、マーケットプレイスシステム130が自動的に発行するようなものである。インスタンスID801については、一意性が担保されるUUID(Universal Unique Identifier)、パッケージIDおよび通し番号等で生成することができる。利用者ID804は、利用者102を一意に識別するためのものであり、例えば、ポータル画面135にログインする際に入力するものである。
さらに、実際のデプロイ処理では、デプロイ先である実行環境140の情報(アクセス先等)であるプラットフォーム805とプラットフォーム805にアクセスするための情報(アクセスキー、シークレットキー、パスワード等)であるクレデンシャル806が必要であることから、インスタンス管理情報531は、こうした情報を保持している。利用者ID804、プラットフォーム805およびクレデンシャル806については、利用者102が実行環境140を準備する場合は、デプロイ処理時に、ポータル画面135から入力を受け付けることで、マーケットプレイスシステム130は、取得することができる。
また、マーケットプレイスシステム130自体が実行環境140を用意する場合は、マーケットプレイスシステム130自身がデプロイ処理時に、プラットフォーム805およびクレデンシャル806の情報を補完することができる。なお、クレデンシャル806は、秘密情報であることから、何らかの暗号化処理等が実施されていることが一般的である。また、入力値807は、values.yaml208のような変数ファイルのデフォルト値から変更した値の集合である。なお、インスタンス管理情報531を用いたデプロイ処理については、後述のフローチャートを用いて説明する。
図9は、対応関係情報541の一例を示す図である。
対応関係情報541は、インスタンスID901、パッケージID902、ソースID903、差分ID904(DiffID)、イメージ変更Flag905等の情報を保持する。
インスタンスID901、パッケージID902およびソースID903は、CI管理情報521、パッケージ管理情報133等の同名のIDと同じ意味であり、CI管理情報521およびパッケージ管理情報133の情報を組み合わせて生成されるものである。
差分ID904およびイメージ変更Flag905は、デプロイ処理されたインスタンス143に対して利用者102が行った変更に関する情報である。差分ID904は、Config142に対して利用者102が行った変更の内容を一意に識別するための識別子である。差分ID904が指す内容については、図11を用いて後述する。
また、イメージ変更Flag905は、デプロイ処理されて実行環境140で動作するアプリインスタンス141のアプリイメージ132に対して変更が行われたかを判断するための情報である。イメージ変更Flag905では、変更がある場合は「true」、変更がない場合は「false」として管理される。ここで、イメージ変更Flag905とは、アプリインスタンス141に対して、もとになったアプリイメージ132から変更があったか否かを判断するフラグ情報である。アプリイメージ132の変更の例としては、アプリインスタンス141が備えるインターフェースを用いた設定の変更、設定ファイルの変更、アプリインスタンス141に含まれるバイナリに対するパッチ適用等いったものである。
イメージ変更Flag905が必要となるのは、開発したインスタンス143をパッケージ化する場合、もとになったアプリイメージ132に対する変更も、新たに作成するパッケージに反映したい場合が多々あるためである。そこで、現在、実行環境140内で動いているアプリインスタンス141を新たなアプリイメージ132とし、新たなパッケージに含めることで上述のニーズに対応するものとする。
なお、イメージ変更Flag905の設定(値)は、例えば、利用者102がパッケージ化支援システム150を利用するときに入力する形で取得してもよいし、もとになったアプリイメージ132との差分から自動的に判断するような形であってもよいし、利用者によるアプリインスタンス141への操作ログから判断するような形であってもよい。また、インスタンス143が複数のアプリイメージ132からなる場合は、イメージ変更Flag905は、アプリイメージ132ごとに変更の有無が記載されるような形態であってもよい。対応関係情報541の生成および利用については、フローチャートを用いて後述する。
図10は、変換ルール情報542の一例を示す図である。
変換ルール情報542は、優先度を意味するプライオリティ1001(Priority)、変換ルールの対象となるkeyを意味するターゲットキー1002(TargetKey)、対応を分岐するためのフラグ情報としての値変更Flag1003および変数化Flag1004等の情報を保持する。変換ルール情報542は、実行環境140で動作するインスタンス143のConfig142等をパッケージ化する際に、どのように変更するかを定めたものであり、変換ルール情報542の1行が1つの変更ルールを示している。
プライオリティ1001は、優先度情報であり、適用する優先度を意味し、本例では、「1」が優先度が最も高く、数が大きいほど優先度が低いことを意味する。また、変換ルール情報542に定義されないものという意味で末尾に「default」といった概念を含んでいてもよい。
ターゲットキー1002(TargetKey)は、Config142内に含まれるkey(例えば、記述421の「image」)に対応する。なお、ここでは、keyの単体のみで記述しているが、これ以外の記述として正規表現による記載、階層構造を含んだ記述(例えば、記述421では「spec.image」)であってもよい。
値変更Flag1003と変数化Flag1004とは、Config142のもとになったパッケージのテンプレート情報から、新たなパッケージのテンプレート情報を生成する際に、どのように変更するかを制御するためのフラグである。当該フラグの具体的な用法についてはフローチャートを用いて後述するが、当該フラグは、keyの特性に応じて変数化するか否かと、今回のインスタンス143の値を採用するか否かと、を判断するための情報である。
例えば、以下のような場合に用いることを想定するものである。「secret」、「password」等のように、インスタンス143毎に固有かつ秘密にすべき情報に対応するkeyである場合、もとのパッケージから変更しない(値変更Flag1003が「false」)、かつ、仮に変数ファイルになくテンプレートファイルに直接記載されている(例えば、deploy.yaml207に記載されている)場合には、次のパッケージでも変数として扱わない(変数化Flag1004も「false」)、といった処理を行うものである。この他、「volume」、「ipaddress」のように、インスタンス143に固有ではある(すなわち、インスタンス143毎に変更となる)が、変数化されていないのであれば、変数化すべきようなものもある。この場合には、インスタンス143の値が有用とならないため、値変更Flag1003を「false」、変数化Flag1004を「true」と表現する。
変換ルール情報542は、提供者101、マーケットプレイスシステム130およびパッケージ化支援システム150の管理者等により、利用者102がパッケージ化支援システム150を利用するより前に定義が行われるものである。
図11は、変更差分情報543の一例を示す図である。
変更差分情報543は、対応関係情報541の差分ID904と対応付く識別子である差分ID1101(DiffID)、Config142のkeyの値を特定するための情報であるターゲットキーパス1102(TargetKeyPath)、変更前の値である変更前1103(Before)と、変更後(すなわちパッケージ化の開始時)の値である変更後1104(After)等の情報を保持する。変更前1103および変更後1104は、ターゲットキーパス1102毎に保持される。
例えば、図11において、「spec.resource.request.cpu」で特定されるConfig142上の値は、利用者102により、「2」から「4」へ変更されたことを示している。また、変更前1103が「−」とは、利用者102等によって追加されたことを示し、同じく変更後1104が「−」とは、利用者102等によって削除されたことを示している。また、変更前1103と変更後1104との両方に値がある場合は、値が変更されたことを示している。
変更差分情報543の具体的な生成方法および用法については、フローチャートを用いて後述する。
図12は、デプロイ処理に係るフローチャートの一例を示す図である。デプロイ処理は、基本的には、デプロイ部533が行う処理である。
デプロイ部533は、指示待ち状態で待機し、ポータル情報出力部532から、利用者102がポータル画面135において選択したパッケージIDおよび入力値(デフォルト値から変更する値)、デプロイ処理に必要なその他の情報(デプロイ先、すなわちプラットフォーム805、クレデンシャル806)等を受け取る(ステップS1201)。なお、ポータル情報出力部532がインスタンス管理情報531に入力値等を更新(追加)し、デプロイ部533は、今回対象となるインスタンスIDを受け取った上で、デプロイ処理に必要な情報をインスタンス管理情報531から参照する形態であってもよい。
続いて、デプロイ部533は、パッケージ管理情報133を参照し、選択されたパッケージに対応するインストーラID702を特定し、特定したインストーラID702を用いて、対応するインストールイメージ131をレジストリ134から取得する(ステップS1202)。インストールイメージ131の取得の例としては、例えば、コンテナ型である場合は、コンテナイメージのpull処理に対応する。
続いて、デプロイ部533は、ステップS1202で取得したインストールイメージ131に、ステップS1201で取得した入力値を伴ってデプロイ処理を実行する(ステップS1203)。例えば、コンテナ型のインストールイメージ131である場合、デプロイ部533は、入力値を環境変数としたうえでrun処理を行う。また、デプロイ先の実行環境140によって処理が変わる場合、デプロイ先に伴う分岐処理については、インストールイメージ131内で選択する方法であってもよいし、インストールイメージ131がデプロイ先ごとに分かれており、デプロイ先に合わせてインストールイメージ131を選択するような方法であってもよい。
なお、デプロイ先の実行環境140が、例えば、kubernetesのようにデプロイ処理されたConfig142に基づいて自動的にConfig142に記載されたアプリインスタンス141に対応するアプリイメージ132を取得するものではない場合、デプロイ部533は、Config142に含まれるアプリインスタンス141に対するアプリイメージ132をレジストリ134から取得し、デプロイ先の実行環境140に登録(配信)するといった処理を合わせて行ってもよい。これは、仮想サーバをITリソースとして提供するサービスであるIaaS等の場合によく見られるものである。
続いて、デプロイ部533は、デプロイ処理の完了後、デプロイ先の実行環境140から実行結果を取得し、インスタンス管理情報531を更新し、ポータル情報出力部532に通知する(ステップS1204)。デプロイ処理が同期処理の場合は、デプロイ部533は、ステップS1203およびステップS1204を連続して行うことができるが、仮に非同期処理の場合は、一定間隔でデプロイ先の実行環境140から状態を取得する(ポーリングする)ことを行ってもよい。
また、デプロイ部533は、インスタンス管理情報531のステータス803を、デプロイ処理の状態に合わせて、Waiting→Deploying→Success(またはFailed)等のように更新していってもよい。
なお、デプロイ部533は、デプロイ先の実行環境140からの実行結果を取得する理由は、デプロイ先の実行環境140がConfig142の情報に基づいて自動的に決まるパラメータではあるが、ポータル画面135に結果として表示したいものも存在するためである。例えば、内部的な管理ID、プライベートネットワークのIPアドレス、アクセス先のURL等が、よく見られる要素である。
デプロイ部533は、以上の処理を行ったのち、ステップS1201(指示待ち状態)に処理を戻す。
図13は、利用者102がデプロイ処理されたインスタンス143を用いて開発した新たなインスタンス143(アプリケーション、ソリューションとも呼ばれる)を、パッケージとしてマーケットプレイスシステム130に登録するためのパッケージ化支援処理に係るフローチャートの一例を示す図である。パッケージ化支援処理は、基本的には、パッケージ化部151が行う処理である。
パッケージ化部151は、利用者102による、支援情報出力部545が表示するパッケージ化支援画面152からの指示に基づいて処理を開始する。パッケージ化部151は、パッケージ化支援画面152へ入力として、パッケージ化の対象となるインスタンス143のインスタンスIDを入力として受け付ける。さらに、パッケージ化部151は、当該インスタンス143が動作する実行環境140から必要な情報を取得するため、実行環境140にアクセスするためのクレデンシャルを入力として受け取ってもよい。なお、クレデンシャルについては、パッケージ化部151は、入力されたインスタンスIDをkeyとして、後述のステップS1301の処理の過程でインスタンス管理情報531から取得してもよい。
以降、ステップS1301〜ステップS1303では、対応関係情報541のレコード(1行)が生成される。
まず、パッケージ化部151は、入力されたインスタンス143のインスタンスIDと、当該インスタンス143のもとになったパッケージのソースIDとの関係を取得する(ステップS1301)。より具体的には、パッケージ化部151は、マーケットプレイスシステム130からインスタンス管理情報531を取得し、インスタンスID801を参照し、入力されたインスタンスIDに対応するパッケージID802を特定する。さらに、パッケージ化部151は、CIシステム120からCI管理情報521を取得し、パッケージID602を参照し、特定したパッケージID802に一致するソースID601を特定する。以上の処理により、パッケージ化部151は、入力されたインスタンスID、特定したパッケージID802およびソースID601を、対応関係情報541のインスタンスID901、パッケージID902およびソースID903とする。
続いて、パッケージ化部151は、利用者102による、Config142に関する変更の差分を作成(変更差分情報543を更新)する(ステップS1302)。パッケージ化部151が作成したものの一例が、変更差分情報543の1つの差分ID1101に示されるような情報の集合である。
変更の差分を生成する方法の一例としては、次のようなものがある。まず、パッケージ化部151は、今回対象とするインスタンス141のインスタンスID901に対応付けられたソースID903から、テンプレート情報を取得し、デフォルト値(すなわち、変数ファイルに記述された、変更していない変数の値)で生成されるConfig142(以下、デフォルトConfig)を作成する。この処理は、例えば、dry run機能のような形でインストールイメージ131、インストールイメージ131の中に含まれるデプロイ処理を行うツールを用いることで実行してもよい。
そして、パッケージ化部151は、利用者102が変更したConfig142を実行環境140から取得し、デフォルトConfigとの差分をとる(例えば、diffコマンドを発行する)ことにより、変更部分の行を特定する。パッケージ化部151は、特定した変更部分の各行のkeyについて、親をたどることでルートからのパス(例えば、ターゲットキーパス1102の「spec.resource.request.cpu」)を特定する。
そして、パッケージ化部151は、変更の種類が値の更新(すなわちkey自体はデフォルトConfigにも変更後のConfig142にも存在し、値のみが変更)である場合、変更前1103にデフォルトConfigの当該行の値(value)を設定し、変更後1104にConfig142の当該行の値(value)を設定する。パッケージ化部151は、変更の種類が追加(すなわち、デフォルトConfigには存在しない)である場合、変更前1103に存在しないこと意味する「−」を設定し、変更後1104にConfig142の当該行の値(value)を設定する。パッケージ化部151は、変更の種類が削除(すなわち、デフォルトConfigのみに存在)である場合、変更前1103にデフォルトConfigの当該行の値を設定し、変更後1104に存在しないこと意味する「−」を設定する。
以上のように、パッケージ化部151は、変更されたkey(ターゲットキーパス1102)に対する変更の前後の値(変更前1103および変更後1104)を作成し、変更差分情報543を更新する。
さらに、パッケージ化部151は、利用者102による、アプリイメージ132に関する変更があるかを特定する(ステップS1303)。一例としては、パッケージ化支援画面152の入力として、変更を加えた(または、別のアプリイメージ132としたい)アプリインスタンス141(表示上はもとになったアプリイメージ132でもよい)を利用者102自身に入力してもらい、入力された情報を使うことである。
また、パッケージ化部151は、Config142から実行環境140で動作するアプリインスタンス141を特定し、アプリインスタンス141のアプリイメージ132と、もとになったレジストリ134に格納されたアプリイメージ132との差分をとることで変更されたアプリイメージ132を特定してもよい。差分のとり方としては、全比較のほか、コンテナ型ではハッシュ値を用いた比較を行うことができる。また、パッケージ化部151は、一律(すなわち全て)の実行環境140で動くアプリインスタンス141のアプリイメージ132を変更ありとして扱ってもよい。このようにして特定したアプリイメージ132の変更の有無を対応関係情報541のイメージ変更Flag905の値(変更ありなら「true」、変更なしなら「false」)に設定する。
以降で、パッケージ化に伴うイメージ化の処理(ステップS1304とステップS1305)、パッケージソースコード111(Config142のもとになるテンプレート情報)への反映処理(ステップS1306)について説明する。なお、これらら2つの処理は、イメージ化の処理により生成される新しいアプリイメージIDも反映処理に用いることから、この順として記載して説明している。
まず、イメージ化の処理について説明する。パッケージ化部151は、パッケージ化の対象となるインスタンス143に対するイメージ変更Flag905を参照し、アプリイメージ132に変更が発生したか否かを判定する(ステップS1304)。パッケージ化部151は、変更が発生したと判定した場合(イメージ変更Flag905が「true」である場合)、ステップS1305に処理を移し、変更が発生していないと判定した場合(イメージ変更Flag905が「false」である場合)、ステップS1306に処理を移す。なお、パッケージ化部151は、インスタンス143に複数のアプリインスタンス141が含まれる場合、アプリイメージ132ごとに本処理を実施する。
そして、パッケージ化部151は、変更が発生したと判定した場合、イメージ化部544に当該アプリインスタンス141のアプリイメージ132の生成(イメージ化)を指示する(ステップS1305)。イメージ化部544によるイメージ化処理については、図14に示すフローチャートを用いて後述する。
その後、パッケージ化部151は、パッケージソースコード111(テンプレート情報)への反映処理を実施する(ステップS1306)。反映処理(テンプレート情報生成処理)については、図15および図16に示すフローチャートを用いて後述する。
パッケージ化部151は、以上の処理結果を支援情報出力部545に渡し、支援情報出力部545がパッケージ化支援画面152に結果を表示する(ステップS1307)。なお、パッケージ化支援画面152の表示例については、図17を用いて後述する。
そして、パッケージ化部151は、パッケージ化支援処理を終了する。なお、パッケージ化部151は、パッケージ化支援処理の終了の前に、パッケージ化支援画面152において利用者102に提示した結果でパッケージを登録するか否かを判断するダイアログを表示し、利用者102が登録を選択した場合に、今回生成した結果一式(テンプレート情報、パッケージソースコード111、およびアプリイメージ132)を新たなパッケージとしてリポジトリ110、レジストリ134等に格納する、といった処理を行ってもよい。
なお、ステップS1302では、パッケージ化部151は、ソースID903からテンプレート情報を取得すると説明したが、これ以外の情報、バイナリ(例えば、binディレクトリ201に含まれるバイナリ、appsディレクトリ205に含まれる情報、その他、テストコード等)、すなわちパッケージソースコード111一式、および、対象のパッケージIDに関連付けられた一式をまとめて取得してもよい(以下、これら情報をパッケージ関連情報と呼ぶ)。
そして、パッケージ化部151は、ステップS1307の利用者102への結果表示に合わせてパッケージ関連情報を表示させ、さらには、新たなパッケージの登録において、パッケージ化支援処理で作成したテンプレート情報と合わせて、取得したパッケージ関連情報も登録する、といった処理を行ってもよい。
図14は、イメージ化処理に係るフローチャートの一例を示す図である。イメージ化処理は、基本的には、イメージ化部544が行う処理である。
イメージ化部544は、実行環境140上で動作するアプリインスタンス141のうちイメージ化するもの(ステップS1305でパッケージ化部151によりイメージ化が指示されたアプリイメージ132)について処理を開始する。
まず、イメージ化部544は、実行環境140がアプリイメージ132の取得のインターフェース(I/F)を備える等により、実行環境140から取得したいアプリインスタンス141をアプリイメージ132として取得可能であるか否かを判定する(ステップS1401)。イメージ化部544は、アプリイメージ132を取得可能であると判定した場合、ステップS1402に処理を移し、アプリイメージ132を取得可能でないと判定した場合、ステップS1403に処理を移す。
ここで、「アプリイメージ132として取得可能」とは、例えば、以下のようなものである。
(例1)実行環境140が備えるAPIとして、取得したいアプリインスタンス141のID等をkeyとして、アプリイメージ132の実体を取得する機能を備える場合
(例2)(例1)に示す方法、関連するツールを組み合わせることでアプリイメージ132を取得できる場合
具体例としては、コンテナエンジンがdockerであるkubernetesであり、かつ、管理権限でこれらを管理できる場合、kubectlコマンド(kubernetesの管理CLI(Command Line Interface))を用いて取得したいアプリインスタンス141が動作するNode(kubernetesクラスタを構成する仮想サーバ)を特定し、特定したNodeに対してssh(Secure Shell)等の手段によりログインし、dockerコマンド(dockerの管理CLI)によりイメージ化(docker commit)を実施する方法等である。
(例3)(例2)に類似する方法として、実行環境140上で、イメージ化処理用のAgentを動作させ、Agentを経由してアプリインスタンス141に対応するアプリイメージ132を取得できる場合
例えば、kubernetesでdind(docker in docker)コンテナをAgentとして動作させ、dindコンテナ内でdockerコマンドによりイメージ化する方法である。
なお、上記の手段については、イメージ化部544が、実行環境140の種類(すなわちプラットフォーム805の種類)ごとに異なる方法を保持し、使い分ける形であってもよい。
アプリイメージ132を取得する手段がある場合は、イメージ化部544は、上述の手段を用いて、アプリイメージ132を取得する(ステップS1402)。
一方、アプリイメージ132が直接は取得できない場合は、イメージ化部544は、代替処理として、アプリインスタンス141内のデータをコピー(フルバックアップ)する(ステップS1403)。例えば、イメージ化部544は、kubernetesである場合は、対象とするアプリインスタンス141に対して「kubectl cp {source_path}{target_path}」({}内は変数)コマンドを使うことにより、実行中のアプリインスタンス141内のデータを全て吸い出すことができる。また、こうしたバックアップを行うためのツール等をアプリインスタンス141内、実行環境140上で動作させておき、それを用いるものであってもよい。
なお、以上は、アプリインスタンス141内の全てのデータをコピーすることを前提に説明しているが、Config142等により利用者102が自由に変更できる場所が特定できる場合は、イメージ化部544は、その範囲に絞ってコピーを行ってもよい。一例としては、kubernetesのConfig142である場合は、PV(Persistent Volume)として当該アプリイメージ132にマウントされた記憶領域のみをコピーすれば、基本的には十分である。
イメージ化部544は、コピーしたのち、もとになった(すなわちオリジナル)のアプリイメージ132を(イメージ化部544が動作する場所において)アプリインスタンス141として実行し、コピーしたデータを上書きした上で当該アプリインスタンス141をイメージ化することにより、利用者102が変更を加えたアプリイメージ132を再現することができる。
イメージ化部544は、このように取得したアプリイメージ132の実体に対して、もとになったアプリイメージ132のアプリイメージID604とは別のIDを付与し、レジストリ134に新たに付与した別のIDで保存を行う(ステップS1404)。ここで、別のIDとは、全体で一意なIDであり、例えば、もとになったアプリイメージ132のアプリイメージID604に利用者102の識別子、インスタンスID等の情報をもとにした識別子、UUID等である。
なお、レジストリ134への保存は、このタイミングではなく、パッケージ化部151のステップS1307が終了し、利用者102に結果の提示および利用者102の登録の承諾をもって実施するような形態であってもよい。ステップS1307の後にステップS1404を実施する場合、利用者102による変更の結果も反映することができるメリットがある。
そして、イメージ化部544は、今回対象とするインスタンス143に対応する変更差分情報543に変更を追記する。すなわち、イメージ化部544は、対象のインスタンス143に一致する差分ID1101に対して、取得または生成されたアプリイメージ132を指し示す場所(例えば、「spec.image」等)をターゲットキーパス1102に設定し、変更前1103にもとになったアプリイメージID604を設定し、変更後1104に新たに付与したアプリイメージIDを設定する。
イメージ化部544は、以上の処理を行い、結果の成否、実行結果等をパッケージ化部151に通知し、イメージ化処理を終了する。
図15および図16は、テンプレート情報生成処理に係るフローチャートの一例を示す図である。テンプレート情報生成処理は、基本的には、パッケージ化部151が行う処理である。
まず、パッケージ化部151は、対応関係情報541を参照し、パッケージ化の対象とするインスタンス143のソースID903を用いてリポジトリ110からパッケージソースコード111の実体(以下、元ソースコード)取得する(ステップS1501)。
なお、パッケージ化部151は、ステップS1501と合わせて、インスタンス管理情報531から対象とするインスタンス143の入力値807を取得し、ステップS1501で取得したパッケージソースコード111の変数ファイル(例えば、values.yaml208)の値を上書きしてもよい。ただし、ステップS1302で述べたように、入力値807の変更も変更差分情報543に含まれるはずであることから、通常は入力値807の変数ファイルへの反映は不要である。
次に、パッケージ化部151は、対象とするインスタンス143の変更である、変更差分情報543のインスタンス143に対応する差分ID1101が示す変更の集合(例えば、「diff1」に含まれる{ターゲットキーパス1102、変更前1103、変更後1104}の集合)を用いて、元ソースコードに対して、以降の書き換え処理を実施する(ステップS1502〜ステップS1510)。
まず、パッケージ化部151は、変更の集合における処理対象とするターゲットキーパス1102について、階層構造を利用し、元ソースコード上での場所(行、すなわち変更部分)を特定する(ステップS1503)。
次に、パッケージ化部151は、当該ターゲットキーパス1102に対応する変更前1103と変更後1104との値から変更の種別を判別する(ステップS1504)。より具体的には、パッケージ化部151は、変更前1103が「−」である場合は「追加」と判断してステップS1505に処理を移し、変更後1104が「−」である場合は「削除」と判断してステップS1506に処理を移し、それ以外(両方ともに値がある)の場合は、「更新」と判断してステップS1507に処理を移す。
パッケージ化部151は、変更の種別が追加である場合、ターゲットキーパス1102が追加の場合(すなわち、元ソースコードのテンプレートファイル上には存在しない場合)、親keyの直後に、ターゲットキーパス1102および変更後1104の値を挿入する(ステップS1505)。例えば、パッケージ化部151は、ターゲットキーパス1102の値が「spec.name」であり、変更後1104の値が「4」であるとき、deploy.yaml207に挿入する場合、「spec:」の次の行に「spec.name:4」を挿入する。親keyの直後に挿入する理由は、そうしないと(例えば、deploy.yaml207で「resource:」に挿入してしまうと)以降の行の親子関係が変わってしまい、本来の意味をなさなくなるためである。
この挿入処理について、パッケージ化部151は、値変更Flag1003を考慮した値の変更処理を行ってもよい。詳細は、ステップS1507で説明するが、値変更Flag1003とは、今回使用した値(ターゲットキーパス1102をキーと見たときの値)をパッケージに反映するか否かを判定するフラグである。この意味を挿入処理でも採用する。パッケージ化部151は、ターゲットキーパス1102に対応するターゲットキー1002の値変更Flag1003が「true」である場合は、変更後1104の値をそのまま利用し、「false」である場合は、空(null)、変更前1103の値(本例では、「−」)、変更後1104ではないダミー値等に書き換えるといった処理を行ってもよい。
また、パッケージ化部151は、利用者102によるConfig142の修正では、利用者102自身が新規に作成、または既存のアプリイメージ132に関する設定をConfig142に追加し、アプリインスタンス141として動作させる場合がある。例えば、実行環境140がkubernetesである場合、sidecarと呼ばれるデザインパターン等を実現するため、Config142にアプリイメージ132を追記することでアプリインスタンス141を追加するということは、一般的に行われる操作である。このため、ターゲットキーパス1102がアプリインスタンス141の追加によるアプリイメージ132の追加である場合(例えば、keyに「image」を含む場合)、利用者102が追加したアプリインスタンス141のイメージ化として、イメージ化部544の一連の処理を実施してもよい。
また、パッケージ化部151は、変更の種別が削除である場合、元ソースコードのターゲットキーパス1102に該当する行(変更内容)を削除する(ステップS1506)。
また、パッケージ化部151は、変更の種別が更新である場合、ターゲットキーパス1102に対応する値部分を変更前1103から変更後1104に変更、または変数化したうえで変数ファイルに追記する、という処理を行う(ステップS1507)。詳細については図16を用いて後述する。
基本的には、ターゲットキーパス1102は、テンプレートファイルで1箇所であるが、特定の条件下では複数の箇所がマッチする場合(例えば、以下に示す場合)がある。パッケージ化部151は、特定の条件に合致する記述があるか否か(ターゲットキーパス1102が他にも存在するか否か)を判定する(ステップS1508)。パッケージ化部151は、ターゲットキーパス1102が他にも存在すると判定した場合、ステップS1509に処理を移し、ターゲットキーパス1102が他にも存在しないと判定した場合、未処理の変更があるときは、ステップS1503に処理を移し、未処理の変更がないときは、テンプレート情報生成処理を終了する。
(例1)ターゲットキーパス1102が正規表現、配列等により記述されている場合
(例2)テンプレートファイルがプログラム的な条件分岐(if/else、while、swich/case等)を含み、処理が分岐している場合
(例えば、{{if.Values.flag}}spec.image:A{{else}}spec.image:B{{end}}では、「spec.image」は、同じ意味で2か所に表れる)
そして、パッケージ化部151は、上記のように、合致する記述が複数ある場合は、以上までの処理で書き換えていない各部分(テンプレートファイルの未書き換えである各行)それぞれについて同種の書き換え処理、すなわちステップS1504以降の処理を実施する(ステップS1509)。
パッケージ化部151は、以上の処理を、差分ID1101に含まれるターゲットキーパス1102全てについて行い、テンプレート情報生成処理を終了する。
図16を用いて、ステップS1507の詳細を説明する。
まず、パッケージ化部151は、更新の対象となるターゲットキーパス1102に一致するkeyに対する値(すなわち「key:value」のvalue部分)が変数化されているか否かを判定する(ステップS1601)。パッケージ化部151は、今回の対象が変数化されていると判定した場合、ステップS1604に処理を移し、今回の対象が変数化されていないと判定した場合、ステップS1602に処理を移す。
ここで、変数化とは、変数ファイルで指定する形になっているという意味である。例えば、deploy.yaml207の「{{.Values.name}}」等が該当する。
変数化されていない場合、パッケージ化部151は、変換ルール情報542を参照し、対象のターゲットキーパス1102のターゲットキー1002に合致する変数化Flag1004を取得する。ここで、ターゲットキー1002に合致とは、例えば、ターゲットキーパス1102が「spec.image」である場合に、末尾のキーである「image」に合致するものを、プライオリティ1001が高いものから順に調べる、という意味である。なお、ターゲットキー1002が正規表現で記述されている場合は、親keyを含めての合致となってもよい。
そして、パッケージ化部151は、初めて条件に合致した(すなわち一番優先度が高いターゲットキー1002に合致した)変数化Flag1004が「true」であるか否かを判定する(ステップS1602)。パッケージ化部151は、「true」であると判定した場合、ステップS1603に処理を移し、「false」であると判定した場合、ステップS1604に処理を移す。
変数化Flag1004が「true」である場合、変数化してよいという意味であり、パッケージ化部151は、更新の対象となるターゲットキーパス1102の変数化を行う。より具体的には、パッケージ化部151は、変数ファイルに含まれる変数keyに存在しない新たな変数keyを1つ決定し、対象のターゲットキーパス1102の値(value)部分を決定した変数keyが意味する変数で置き換える、という処理を行う。
例えば、パッケージ化部151は、ターゲットキーパス1102がdeploy.yaml207の「spec.resource.request.cpu」であり、values.yaml208に含まれないkeyとして「req−cpu」が利用できる場合、同deploy.yamlの値が「2」であるものを「{{.Values.req−cpu}}」とし、values.yaml208に「req−cpu:」を挿入する。このとき、values.yaml208に記載するデフォルト値については、パッケージ化部151は、ステップS1604〜ステップS1606の結果をもとに決定する。
変数keyについては、values.yaml208に含まれない(かつ、デプロイ処理で用いるツールが定める変数の規則に反しない)限り、何でもよい。しかしながら、より適切な決め方としては、ターゲットキー1002またはターゲットキーパス1102ごとに、対応する変数keyとしてよく使われている文字列を用いることである。これを実現するため、現在リポジトリ110内に存在する全パッケージソースコード111における全テンプレートファイルを調査し、ターゲットキーパス1102ごとに使われている変数keyの頻度を算出し、最も頻度が高いものを優先的に用いることである。例えば、リポジトリ110に含まれる全パッケージソースコード111およびテンプレートファイルを調査したところ、「spec.resource.request.cpu:{{.Values.req−cpu}}」が5回、「spec.resource.request.cpu:{{.Values.req.cpu}}」が2回である場合、「req−cpu」を変数keyとして優先的に使用することを意味する。
なお、パッケージ化部151は、変数化するか否かの判断として、他のパッケージのパッケージソースコード111のテンプレートファイルでよく変数化されている場合は変数化する、といった処理を行ってもよい。より具体的には、今回対象とするパッケージ以外のパッケージのパッケージソースコード111のテンプレートファイルにおいて、当該ターゲットキーパス1102で特定される箇所が一定(しきい値)以上の変数化されている場合、今回の処理でも変数化する、といった処理を行うというものである。例えば、全パッケージのパッケージソースコード111に含まれるテンプレートファイルのターゲットキーパス1102「spec.resource.request.cpu」に対応する値が、変数となっているか(すなわち図3の例で「{{.Values.req−cpu}}」等となっているか)否か(すなわち図3の例で「2」等の固定値となっているか)をカウントする。そして、ターゲットキーパス1102に一致する値が変数化されている数が一定回数以上(例えば、2回以上)または一定割合以上(例えば、50%以上)である場合、今回も変数化する、といった処理を行うものである。
ステップS1602で行った処理と同様に、パッケージ化部151は、更新の対象となるターゲットキーパス1102に合致する値変更Flag1003を取得し、取得した値変更Flag1003の値が「true」であるか否かを判定する(ステップS1604)。パッケージ化部151は、「true」であると判定した場合、ステップS1605に処理を移し、「false」であると判定した場合、ステップS1606に処理を移す。
値変更Flag1003の値が「true」である場合、今回の値を採用する(デフォルト値を変更する)という意味であり、パッケージ化部151は、ターゲットキーパス1102に対応する値として変更後1104の値に書き換える(ステップS1605)。変数化を行っている場合は、パッケージ化部151は、変数ファイルの今回追加した変数のデフォルト値として変更後1104の値を用いる。
値変更Flag1003の値が「false」である場合、もとのパッケージソースコード111の値(変更前1103の値)をそのまま利用するという意味であり、パッケージ化部151は、ターゲットキーパス1102に対応する値として変更前1103をそのまま利用する(ステップS1606)。変数化している場合は、パッケージ化部151は、同じくデフォルト値として変更前1103の値を用いる。
パッケージ化部151は、以上の処理を行って、ステップS1508以降の処理を行う。
以上、本実施の形態では、パッケージ化の対象となるConfig142は、テンプレート情報および利用者102による入力を元にデプロイで生成され、利用者102による変更が行われる、としていた。しかしながら、オーケストレーションツール、実行環境140等により、利用者102が意図しない変更がConfig142に発生する場合がある。例えば、Kubernetesでは、内部管理のため、デプロイされた時刻(keyの例:TimeStamp)、Kubernetes上での一意な識別子(keyの例:UUID)等が自動的にデプロイしたConfig142に挿入(追記)される場合がある。こうした自動挿入のkeyは、インスタンス143固有のものであり、パッケージ化の対象から除外すべきものである。よって、Config142において、こうした自動挿入されたkeyを、次に述べるような方法で除外する処理を行ってもよい。
一例としては、一般に自動挿入される箇所(key)は決まっていることから自動挿入のため変更と判定しない箇所とを事前に定義しておき、変更差分情報の更新(ステップS1302)において自動挿入の箇所を変更と判定しない、すなわち変更差分情報543から除外する、という方法である。また、別の一例としては、変更差分情報543としては自動挿入部分も変更として考慮しておき、変更内容の反映挿入処理(ステップS1505)において、事前に定義された自動挿入の箇所の情報をもとに自動挿入ならば除外する、すなわち自動挿入の箇所は挿入しない、という方法である。
図17は、パッケージ化支援画面152の一例を示す図である。
パッケージ化支援画面152は、利用者102から今回対象とするインスタンス143の識別子1701、実行環境140にアクセスするための情報1702等を受け取り、パッケージ化の結果を利用者102に表示する。
このうち、結果として表示される情報が、パッケージ化部151の行った処理の結果である(新たなテンプレートファイルがテンプレートファイル1710であり、新たな変数ファイルが変数ファイル1720である)。さらに、変数化を行った部分1711、イメージ化を新たに行ったことによる新たなイメージID1721、値を変更した部分1722等、パッケージ化部151によって変更が行われた箇所は、変更を強調表示するような表示がなされてもよい。
さらに、イメージ化部544がイメージ化を行っている場合は、新たにイメージ化したアプリイメージIDやその処理の概要を合わせて表示し、利用者102に確認、修正等を行わせるようなインターフェースを備えてもよい。また、新たなパッケージのメタデータ703の作成、もとのパッケージに含まれていた付加情報(テストケース、管理情報等)を編集するため、利用者102が編集可能な形式で、もとになったパッケージのメタデータ703、付加情報等もパッケージ化支援画面152に表示する、といったことを行ってもよい。
本実施の形態では、例えば、マーケットプレイスの利用者が、登録されたパッケージを用いて新たなシステムを開発し、新たなシステムを再度マーケットプレイスに登録するユースケースにおいて、もとになったパッケージの情報と開発されたシステムの情報とから、今回登録するシステムのパッケージの内容が提案される。これにより、パッケージ化に関して十分な知識を有しない利用者であっても、新たなパッケージの登録が容易となる。
(2)第2の実施の形態
第1の実施の形態では、実行環境140がイメージ化のAPIを備えない場合の代替処理として、データをコピーする処理(ステップS1403)を例示した。しかしながら、コピーする方法は、処理のオーバーヘッド、アプリイメージ132の再現性の観点から充分でない場合がある。一方、利用者102がアプリインスタンス141を変更する方法の1つとして、利用者102側でCIシステムを用意し、CIシステムにより、もとのアプリイメージ132を用いて新たなアプリイメージ132を作成し、新たに作成したアプリイメージ132をアプリインスタンス141として動作させる場合もある。このとき、上述の特徴を利用することにより、ステップS1403の問題を解決できる場合がある。本実施の形態では、この点ついて主に説明する。
図18は、本実施の形態のパッケージ化支援システム150に係る構成の一例を示す図である。
図18に示すように、パッケージシステム1800は、図5に示すパッケージシステム100の構成に加えて、利用者用リポジトリ1810と利用者用CIシステム1820とを含んで構成される。
利用者用リポジトリ1810には、アプリイメージ132を変更するためのソースコード1811が格納されている。一例としてアプリイメージ132がコンテナ型である場合は、修正内容をアプリイメージ132に反映するもとになる設定ファイルおよびスクリプト、アプリイメージ132をビルドするためのビルドファイル(例えば、Dockerfile)等である。このうちビルドファイルのイメージ指定(DockerfileではFROM)に、今回対象とするアプリインスタンス141のもとになったパッケージに含まれるアプリイメージ132のアプリイメージID604を指定する。
そして、利用者用CIシステム1820は、ソースコード1811の情報から、CIシステム120が行ったのと同様の処理を行い、利用者102が変更したアプリイメージ132を生成(ビルド)する。なお、利用者用CIシステム1820は、アプリイメージ132のビルドに加えて、実行環境140のインスタンス143内に含まれるアプリインスタンス141を、今回新たにビルドしたアプリイメージ132の実行状態であるアプリインスタンス141への差し替える処理を行ってもよい。
また、パッケージシステム1800では、上述の差し替えを行うための要素として、利用者102が作成したアプリイメージ132を登録し、保持するための利用者用レジストリを備えていてもよい。また、利用者用レジストリの代わりにレジストリ134に利用者用の領域を持ち、ここに利用者102が変更したアプリイメージ132を登録して保持するような構成であってもよい。
このようなパッケージシステム1800において、イメージ化部544は、アプリイメージ132の作成の2種類の方法(例えば、ステップS1402に示す取得による方法、ステップS1403に示すコピーによる方法)に加えて、以下に示すビルドによる方法を実施してもよい。なお、優先する順番としては、再現性が高く処理のコストが低いという観点からは、取得による方法(ステップS1402)、ビルドによる方法(後述)、コピーによる方法(ステップS1403)の順が好適である。
以降でビルドによる方法について説明する。
イメージ化部544は、利用者102がアプリイメージ132の変更のために作成したソースコード1811を特定するためのソースIDを入力として処理を行う。このソースIDの入手は、例えば、パッケージ化支援画面152において利用者102からの入力、Config142にメタ情報(例えば、自由に記載できるメタデータ領域上のコメント、独自拡張ラベル等)として記述(Config142で記入された情報がある場合)、実行環境140および利用者用CIシステム1820のログから判定(何れもログが取得可能な場合)、によって実施することができる。
そして、イメージ化部544は、ソースコード1811に含まれるビルドファイルをもとに、利用者102のアプリイメージ132を再現(ビルド)し、これを新たなアプリイメージ132とする。この他、CIシステム120、利用者用CIシステム1820が利用可能な場合は、その処理を用いてアプリイメージ132を取得(またはアプリイメージ132が格納されたレジストリ134のアプリイメージID604)によりアプリイメージ132の作成の代わりとしてもよい。
本実施の形態によれば、実行環境からアプリイメージを取得できない場合であっても、利用者用CIシステムを用いてアプリイメージを作成することができる。
(3)第3の実施の形態
第1の実施の形態で示したパッケージ管理情報133において、パッケージID701とインストーラID702との紐付けと、ポータル画面135に表示するため等に利用するメタデータ703およびパッケージID701の関係とは、更新のタイミングの違い、実装上の都合等から別々の情報(以下、パッケージID701とインストーラID702とからなるデプロイ管理情報と、メタデータ703とパッケージID701とからなるポータル表示情報)に分かれていることもある。
さらには、ポータル表示情報は、ソースコード111から生成するのではなく、ポータル画面135を用いて提供者101が記載するような形態も考えられる。
このように、パッケージ管理情報133が、デプロイ管理情報とポータル管理情報とのように2つの情報に分かれる場合であっても、パッケージ化の支援(本アイデアの提供)は可能である。パッケージ化部151は、本質的には、デプロイ管理情報があるならば、処理を実施可能であるため、パッケージ管理情報133の代わりにデプロイ管理情報を取得すればよい。さらに、パッケージ化の支援という意味において、パッケージ化部151がマーケットプレイスシステム130からポータル管理情報を取得し、参考情報としてパッケージ化支援画面152に表示する等してもよい。
(4)他の実施の形態
なお、上述の実施の形態においては、本発明をパッケージ化支援システムに適用するようにした場合について述べたが、本発明はこれに限らず、この他種々のシステム、装置、方法、プログラムに広く適用することができる。
また、上述の実施の形態において、各テーブルの構成は一例であり、1つのテーブルは、2以上のテーブルに分割されてもよいし、2以上のテーブルの全部または一部が1つのテーブルであってもよい。
また、上述の実施の形態において、説明の便宜上、XXテーブル、XXファイルを用いて各種のデータを説明したが、データ構造は限定されるものではなく、XX情報等と表現してもよい。
また、上記の説明において、各機能を実現するプログラム、テーブル、ファイル等の情報は、メモリや、ハードディスク、SSD(Solid State Drive)等の記憶装置、または、ICカード、SDカード、DVD等の記録媒体に置くことができる。
上述した実施の形態は、例えば、以下の特徴的な構成を有する。
ソースコード(例えば、パッケージソースコード111)を管理する第1の管理部(例えば、リポジトリ110)と、ソースコードもとに作成されるパッケージを管理し、利用者(例えば、利用者102)が操作する端末から指示されたパッケージをインスタンス(例えば、インスタンス143)として所定の実行環境(例えば、実行環境140)において利用可能にするマーケットプレイスシステム(例えば、マーケットプレイスシステム130)と通信可能なパッケージ化支援システム(例えば、パッケージ化支援システム150)であって、パッケージを識別可能な識別情報(例えば、パッケージID902)と、上記パッケージのもとになるソースコードを識別可能な識別情報(例えば、ソースID903)と、上記パッケージのインスタンスを識別可能な識別情報(例えば、インスタンスID901)とが対応付けられた対応関係情報(例えば、対応関係情報541)を記憶する記憶装置と、利用者が操作する端末(例えば、端末501)から所定のインスタンスのパッケージ化の指示を受信したことに基づいて、上記対応関係情報をもとに上記所定のインスタンスと対応付けられている所定のソースコードを上記第1の管理部から取得して出力するパッケージ化部と、を備える。
上記構成では、利用者は、パッケージ化を所望するインスタンスを指定することで、インスタンスと対応付けられているソースコードが出力される。よって、ユーザは、例えば、出力されたソースコードを用いることができ、つまり利用者自身でソースコードを特定して取得する必要がなくなるので、インスタンスのパッケージ化を容易に行うことができるようになる。
上記パッケージ化部は、上記所定のソースコードから生成されるインスタンスの動作を規定した第1の設定ファイル(例えば、デフォルトConfig)と、上記所定のインスタンスの動作を規定した第2の設定ファイル(例えば、パッケージ化時点のConfig142)と、を比較し、上記第1の設定ファイルから変更された値を抽出し、抽出した値を上記所定のソースコードに反映して出力する。
上記構成によれば、インスタンスに対する変更が反映されたソースコードが出力されるので、例えば、利用者は、変更した内容を自身でソースコードに反映する手間を省くことができ、インスタンスのパッケージ化をより容易にかつ適切に行うことができるようになる。
上記第1の管理部により管理されているソースコードは、上記ソースコードから生成されるインスタンスの動作を規定した設定ファイルのひな型であり、予め定められた値である固定値と値を代入するための変数とを含むひな型情報(例えば、テンプレートファイル、deploy.yaml207)と、上記変数に代入する値を含む変数情報(例えば、変数ファイル、values.yaml208)とを含んで構成され、上記パッケージ化部は、抽出した値が変数に代入される値であるか否かを判定し、抽出した値が変数に代入される値でないと判定した場合、抽出した値を代入するための変数を上記所定のソースコードのひな型情報に追加する。
上記構成によれば、変更された値については変数化することで、例えば、変更される可能性が高いものを変数として次の利用者に提案することができるようになる。
上記パッケージ化部は、上記第1の管理部により管理されているソースコードから、上記変数を識別するためのターゲットキーパスにおいて用いられている変数識別子の出現頻度を算出する。
上記構成では、例えば、出現頻度および変数識別子を利用者が見比べて変数識別子を決定したり、出現頻度が最も高い変数識別子をパッケージ化部が設定したりすることができるので、インスタンスのパッケージ化をより容易にかつ適切に行うことができるようになる。
上記第2の設定ファイルには、上記所定のインスタンスとして実行される1以上のアプリインスタンスのイメージ(例えば、アプリイメージ132)のイメージ識別子(例えば、「NodeRED:1」、アプリイメージID604)が含まれ、上記パッケージ化部は、上記イメージに変更があったか否かを判定し、上記イメージに変更があったと判定した場合、上記イメージを管理する第2の管理部(例えば、レジストリ134)において変更後のイメージを一意に識別可能なイメージ識別子を決定し、決定したイメージ識別子を上記所定のソースコードに反映して出力する。
上記構成では、変更後のイメージのイメージ識別子がソースコードに反映されるので、例えば、利用者が、ソースコードのどこを変更すればよいのか、イメージ識別子として何を用いてよいかわからない事態を回避することができる。
上記パッケージ化部は、上記所定の実行環境から上記変更後のイメージを取得する。
上記構成によれば、例えば、変更後のイメージを作成する利用者の手間を省くことができる。
上記パッケージ化部は、上記所定の実行環境が上記変更後のイメージを取得するためのインターフェース(例えば、イメージを取得するためのAPI、SSH、エージェント等)を備えるか否かを判定し、上記インターフェースを備えないと判定した場合、上記変更後のイメージの実行状態であるアプリインスタンス(例えば、アプリインスタンス141)に含まれるデータをコピーして上記変更後のイメージを作成する。
上記構成によれば、例えば、変更後のイメージを作成する利用者の手間を省くことができる。
上記所定のインスタンスとして実行されるアプリインスタンスのイメージを変更するためのソースコード(例えば、ソースコード1811)を管理する第3の管理部(例えば、利用者用リポジトリ1810)と通信可能であり、上記パッケージ化部は、上記所定の実行環境が上記変更後のイメージを取得するためのインターフェースを備えるか否かを判定し、上記インターフェースを備えないと判定した場合、上記第3の管理部が管理するソースコードをもとに上記変更後のイメージを作成する。
上記構成によれば、例えば、変更後のイメージを作成する利用者の手間を省くことができる。
ひな型情報の値を変数とするか否かが規定された変換ルール情報(例えば、変換ルール情報542)を記憶する記憶装置を備え、上記パッケージ化部は、抽出した値が変数に代入される値でないと判定し、かつ、上記変換ルール情報をもとに、抽出した値を変数とすると判定した場合、抽出した値を代入するための変数を上記所定のソースコードのひな型情報に追加する。
上記構成では、意味があるものを変数にすることができるので、例えば、パスワード等、変数とする必要がないものを変数としてしまう事態を回避することができる。
インスタンスの動作を規定した設定ファイルの値を用いるか、上記インスタンスのもとになったソースコードの値を用いるかが規定された変換ルール情報を記憶する記憶装置を備え、上記パッケージ化部は、上記変換ルール情報をもとに、抽出した値について上記第2の設定ファイルの値を用いると判定した場合、抽出した値を上記所定のソースコードに反映して出力する。
上記構成によれば、例えば、IPアドレス等、システムに固有な値を設定するような値を設定してしまう事態、パスワード等、利用者に固有な値を設定してしまう事態を回避することができる。
上記パッケージ化部は、抽出した値を上記所定のソースコードに反映した結果を表示装置に表示する。
上記構成では、生成されたソースコードが表示されるので、例えば、利用者は、ソースコードを容易に確認することができる。
また上述した構成については、本発明の要旨を超えない範囲において、適宜に、変更したり、組み替えたり、組み合わせたり、省略したりしてもよい。