UiPath Orchestratorに接続されたRobot のライセンシングについて備忘(Unattended版)。

## 概要

UiPathのOrchestrator(以下Orch)導入でいつもややこしい、ライセンスの種類の件について:
https://robot.uipath.com/lang-ja/v2018.4/docs/about-licensing
このサイトの情報の備忘です。

[前回](https://qiita.com/masatomix/items/c7948dd9470abfaa4a79)は Attended Roboについて書きましたので、今回は、Unattended Roboについて。


この情報は2019/06/30時点のモノであり、誤りもあるかもしれません。したがって信頼性のある情報が必要な場合は、UiPathの中のヒトにお問い合わせください。また対象バージョンは、UiPath 2018.4.5 です。


## TL;DR

- Unattended なロボットは購入したライセンス数分と同数のマシン上で稼働させることが可能で、そのマシン上に複数のロボット(Windowsアカウントをわけるってこと)を作成することは可能
- たとえば業務ごとにロボットグループを作って、それぞれにWindowsアカウントを用意し、ある1PC上に複数ロボットを作成して、いろんなワークフローを運用することが可能
- 2ライセンス購入して3台のPCで同時利用、などはできない
- ジョブを実行中に他のジョブを投入すると、保留中でキューに入る。そのキューはロボット・プロセスごとに1つだけ保留になる
- 大量にキューさせるためには、動的に割り当てを用いる
- 1ロボ内では、処理順番は投入順になっているように見えるが、複数ロボが稼働する場合は注意が必要(後述)


## 備忘メモ

- Unattended なロボットには、2018.4には「同時接続ランタイム (Concurrent Runtime)」というライセンス形態しかなさそう。Node Locked などはないようです。
- Unattended は「ロボット」を作成した時点でライセンスが消費される。でも消費は「ロボット」ごとではなく「マシン」ごと。つまり、同じマシン内にいくつものユーザで「ロボット」を作っても、消費されるライセンスは一つ[^1]。
下記は、おなじマシンにいくつもUnattendedなロボットを作成している図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/115646ba-7c3b-9b5d-b7bd-6b76b1288b3a.png)
1ランタイムに、ロボットが3つぶら下がっていますと書いてある
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/583ef163-b7e2-652d-fae1-2ca0befb0fc6.png)

- さらに、ライセンスを消費ずみでもライセンス数を超えるマシン数のロボット作成が**可能**。
下記の図は、このテナントはUnattendedのライセンスは1つなのですが、複数のマシンにロボットを作成できている図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/bbb1854f-bcc5-7497-f78e-0cc8b548ab27.png)
ただし、右肩メニューから、ライセンス>> Unattended >> 詳細を確認 、で見られる下記のページにはオレンジの「ライセンスなし」表示となっていて、マシンは利用できない状態になっています。。**実際、このライセンスなしのロボットにジョブを割り当てようとすると、ジョブの投入まではできてしまって、さらにずっと「保留中」になってしまうのでご注意。基本、このような状態にしちゃダメってことみたいですね。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/3043041e-2fc4-aaed-7436-76650f9fbb30.png)
- ロボットはいくらでも作れちゃうので「じゃあいつ、つかえるのか」って考えてみると、タスクトレイのロボットアイコンからの「接続」が済んでる前提で、上記のように**ライセンス状態が緑**のとき、といえそう。Attended RoboのとくにConcurrent Userライセンスの場合は、ライセンスの消費・解放のためにロボットアイコンの「起動・終了」をこまめにやったりするわけですが、そもそもUnattendedはログアウト状態でリモートでワークフローを実行するわけで、ライセンスの消費・解放は、タスクトレイのロボットアイコンの起動・終了などには依存しないようです。

さてここまでを整理すると、 **Unattended なロボットは購入したライセンス数分と同数のマシン上で稼働させることが可能で、そのマシン上に複数のロボット(Windowsアカウントをわけるってこと)を作成することは可能** となります。たとえば業務ごとにロボットグループを作って、それぞれにWindowsアカウントを用意し、ある1PC上に複数ロボットを作成していろんなワークフローを運用することはできますが、2ライセンス購入して3台のPCで同時利用、などはできない構成になってます。


## TIPS

### 結局マシン分のライセンスが必要？

そのようです。

一方、マシンごとにわりあてる「ランタイム数」というのがあり「ライセンス>> Unattended >> 詳細を確認」で表示される画面から、さらにマシンごとの「ランタイムを編集」を選ぶと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/626c2430-1b20-74a6-6170-acf02ec606d7.png)
このマシンに割り当てる「ランタイム数」を制御することが出来ます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/31c971dc-8b57-bd90-da6b-c6e8167b441d.png)

これは、ジョブが複数投入されたときに「並行に稼働する」プロセス数を制御するようで、実際に2以上を割り当てるとジョブを同時に処理しようとします。。が、Windows Serverなどではない普通のWindowsマシンは通常ログイン出来るユーザが1ですので、実際にはうまく動きません(むしろ同時に起動することでエラーになりましたorz)。。。

このランタイム数の設定は[「高密度ロボットについて」](https://robot.uipath.com/lang-ja/v2018.4/docs/about-high-density-robots) ココにあるようにWindows Serverなどをロボ稼働環境として準備した場合に使用するパラメタのようです。


いままで「ロボット実行PCとしてWindows Serverを準備しています」ってケースに出会ったことがないので、実質「UnattendedのライセンスはPCの台数分だけご購入ください」となりそうです。。[^2]



### キュー(保留する)の考え方

Unattended ロボを導入するって事は、目の前にあるPCではないところ、でジョブを実行したいわけで、とすると他の人がジョブを実行しようとしているか分からない状況だけど「とりあえず混んでるかもだけどジョブの投入だけしておく(空いたら実行しといてね)」なんて使い方になるわけですね。

なのですが、Unattendedロボの仕様について、微妙なキューの仕様が。。あるジョブを投入して実行中のとき「同じプロセス」を「同じロボット」にジョブとして投入しようとすると「保留中」のステータスになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/4c9c7bde-5cb5-861a-8db2-e5fbae191c72.png)
さらにもう一つ「同じプロセス」を「同じロボット」にジョブとして投入しようとすると下記の「保留中があるからもうダメ」というエラーが。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/8c287c48-f7a1-c6cd-7c8a-35d355ceb8da.png)

つまり **あるプロセスとあるロボット、ごとにキュー出来るジョブは一つだけ** という仕様であることが分かります。

ためしに、あるロボット(下記キャプチャのROBO_01)に同じプロセス(app01)を投入して保留状態をつくり、、、別ロボット(ROBO_02)に同じプロセスを投入すると、、同時ランタイムが1なので、実行はもちろんされませんがこちらのジョブも保留中に。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/714dc24a-dae6-38c0-ee0b-e7ceda7fe309.png)

さらに一応ですが、ROBO_02についても保留中で、さらに同じプロセスをジョブ投入すると、このロボットはこのプロセスでほかで保留中ですというエラーが。。(利用可とでるのはたぶんバグでしょう)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/3d110523-758d-3bb6-e57e-cecc5493a1f7.png)


さらにさらにですが、この状況下で「別の」プロセスを入れてみたらどうでしょうか。。

やってみました。プロセス「app01」を「ROBO_01」で実行中。さらに「app01」を「ROBO_01/ROBO_02」でジョブ投入してそれらを保留中に。これ以上は「ROBO_01/ROBO_02」には「app01」を投入出来なかったのですが、別のプロセス「other01」は、「ROBO_01/ROBO_02」へ投入できました。。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/d20a0649-cea4-f3d8-91ef-fb8dd98f6a3d.png)

繰り返しですが、エラーメッセージにもありますが **あるプロセスとあるロボット、ごとにキュー出来るジョブは一つだけ** という仕様があることが分かりました。 

とにかく無限にキューしてくれればいいのに、、、とはなっていないことにご注意ください。



### 「動的に割り当てる」をつかうことで回避する

ジョブを実行時に、上記ではロボット指定でジョブを投入していましたが、ロボットを指定しないで「動的に割り当てる」というオプションがあります。これは、ロボット・プロセスごとに一つキューする上記の仕様とはちがい、どこか別にジョブをキューしといて、空いたロボットをアサインしてプロセスを実行してくれる機能です。コレを用いると、、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/1b1e7d67-4372-4064-2381-281ef34491fd.png)
下記の通り、ロボットの割り当て待ちという状況で、ジョブを投入することが出来ました。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/71bf4b95-4383-c7a9-6b12-0842f3d90549.png)

プロセスを実行する回数を指定することで、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/f33a2cc4-8c76-a1d0-ce53-fb7d9dd02bff.png)
このようにジョブを大量に投入することが可能です。Orchestratorの「キュー機能(保留のキューではなく)」に大量に投入されたデータをたくさんのロボットでガシガシ処理するなど、そんな場合を想定してる感じですかね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/a8d6678b-cd21-fa8f-edb3-7e1fe0576bf7.png)

## 具体例

### 具体例1。複数ロボ、1マシンでプロセス実行の場合。

さいごに具体例。

- 1PC上にロボットを2台(ROBO_01,ROBO_02)作成
- それぞれのロボをGroup 01,Group 02というロボットグループで分割
- それぞれのロボットグループで、異なるワークフロー(app01,app02)を実行する
- どちらのグループ利用者も、相手を気にしないでジョブ投入したい

などが普通に実現できるかやってみようと思います。図示するとこうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/1fa26dde-34af-b5b2-c47f-000c517f4d75.png)

結果は以下のよう、、、。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/2ff8f8eb-4efc-afbe-580e-68104d22c8b7.png)

画面は投入した順番に並んでるのですが、、うーん、**投入した順番にかかわらずapp01を入れたロボットグループの処理が優先されている**ように見えます、、、。

app02を先に投入してみましたが、結果はやっぱりapp01優先。。プロセス名順もしくはロボット名順に見えますね、、。[^3]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/be8b2540-403b-0578-2910-2bbfe02ac2b6.png)


### 具体例2。1ロボ、1マシンでプロセス実行の場合。

では、同じロボに複数プロセスを並ばせてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/b5bdb818-4d1b-5c74-2851-25ab418522bc.png)

おお、順次実行。。あるべき実行結果が得られました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/f2b7910a-379a-836a-3cde-34901c16d809.png)

このことから**動的割り当てのキューの処理順番は、(プロセス名順ではなく)ロボット名順であることが濃厚** といえそうです。**1ロボット内での処理順番は、投入したとおりになっている** と見えますね。


以上、おつかれさまでした。


## 関連リンク

- [ライセンシングについて](https://robot.uipath.com/lang-ja/v2018.4/docs/about-licensing)
- [Orchestrator Community版](https://platform.uipath.com/)
- [2つの製品の違い UiPath Platform VS UiPath Community Edition](https://www.uipath.com/ja/freetrial-or-community)

[^1]: AttendedのNamed UserはWindowsアカウントごとに消費されたりしてましたね。[参考](https://qiita.com/masatomix/items/c7948dd9470abfaa4a79#%E5%82%99%E5%BF%98%E3%83%A1%E3%83%A2)
[^2]: VDIとかの環境だと、話は別かもしれませんね

[^3]: ロボ名を変更しても結果は変わらず、、とすると、内部で付番されているRobotId の可能性が高いです。