[UiPath] Cloud Orchestrator (Enterprise Edition)のモダンフォルダー移行機能

# はじめに
https://twitter.com/oshigoto_nakao/status/1572886781829476353?s=20&t=h-dKDasQCnOm6vfQ3N1Lgw

先週（2022/09/22）クラウドのOCを触っていたところ、テナントの設定画面に新しいボタンが現れているのに気づきました。↓コレ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2254418/f35ff61c-020d-d965-a3be-e6cec38a443e.png)

クラシックフォルダーをアクティブ化しているユーザーに対して、「いい加減モダンフォルダーを使え～～～」と言わんばかりのGUIです。
クラシックフォルダーの非推奨化が間近[^1]ということもあってか、このタイミングで新たに追加されたのかもしれません。

これまでクラシックフォルダーをモダンフォルダーに移行するには、OrchestratorManager[^2]というツールを使うのが定石でしたが、この機能の出現でOrchestratorManagerは御役御免となるのでしょうか。

本記事では、こちらの新機能によって、どのくらい簡単に／どのくらい自由に移行ができるのか、実際に触ってみてレビューしていきます。

# 実際に触ってみた
### まずは適当なクラシックフォルダーを用意
フォルダーの移行方針が分かりやすいように、とりあえず２つ作っておきます。
| 種類 | フォルダー名 |
|:------------:|:------------:|
| Classic    | Folder A |
| Classic    | Folder B |

そして、「Folder A」の中身を下図のようにセットします。
（A1、P1とか書いてあるのは、そのリソースの名前です。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2254418/48934eac-52d3-f892-7260-6876f288f5de.png)[^3]
完成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2254418/84d0e4bc-6506-81ed-c00b-4db3b467bf3f.png)

### いざ移行開始
##### はじめに
[テナント]>[設定]>[全般]から、「移行を開始」ボタンを押下すると、次の画面に移ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2254418/de0de035-7f16-e534-b3dc-be8c484604e7.png)
- あなたが割り当てられているフォルダーのみが移行対象になるよ。
- プロセスの依存関係のバージョンを v2019.10.1 以降にアップグレードしてね。
- ロボット グループに含まれるロボットのみが移行されるよ。

といった注意事項が書いてあります。

##### 有人プロセスを実行するユーザー
クラシックフォルダーでは、「マシン＋ユーザーのWindowsアカウント」をキーにロボットを作成していましたが、モダンフォルダーでは、「ユーザーのEmailアドレス」をキーにロボットを作成することになります。[^4]
キーがまるっきり異なるので、このように移行先のユーザーアカウント（のEmailアドレス）を指定する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2254418/1e53e57b-ee54-1923-4e5e-6f08a539938d.png)

##### 無人プロセスを実行するユーザー
無人プロセスの場合、「ユーザーのWindowsアカウント」をキーにロボットが作成されます。
そのため、旧ロボットの「ユーザーのWindowsアカウント」を、あらかじめ新規作成したロボットアカウントに登録しておき、ここでそのロボットアカウントをマッピングします。

ただしAttendedロボットと異なり、Unattendedロボットは基本的に、旧ロボットに登録されたWindowsアカウントを、そのまま新ロボットのWindowsアカウントにスライドすればいいだけです。そのため、右上の「一括処理」というところで「対象のロボットアカウントを自動的に生成」することもできるようになってますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2254418/ff13d0e9-f506-2fa0-b739-5aa3e63f4622.png)

##### 最終確認
ここまでできたら、あとは「移行を開始」を押すだけ。
なんと簡単な・・・。逆に言うと、ロボットの移行以外カスタムができませんでしたが、果たして想定通りの移行になるのでしょうか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2254418/7cf6828f-7c3d-c7c0-7f63-317802d0d242.png)

##### 実行！
リソースが少ないのもありますが、そこまで時間はかかりません。（今回だと1分もかからないくらい。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2254418/30e528c8-7fc6-5581-f014-5ce22da58c15.png)

### 結果の確認
##### フォルダー
まず、フォルダーはこうなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2254418/fa8b915a-9a3a-5b6c-445f-ff4419367e1a.png)
クラシックフォルダー（組織単位）が、そのままモダンフォルダーになってますね。
そして、その中にロボットグループ単位でサブフォルダーが作られています。

| 組織単位（旧） | ロボットグループ（旧） | rootフォルダー（新） | subフォルダー（新） |
|:------------:|:------------:|:------------:|:------------:|
| Folder A    | E1 | Migrated Folder A | E1 |
| Folder A    | E2 | Migrated Folder A | E2 |
| Folder A    | E3 | Migrated Folder A | E3 |
| Folder B    | E4 | Migrated Folder B | - |

「Folder A」には、「E1」「E2」「E3」という３つのロボットグループが含まれていたので、それがサブフォルダーになりました。
一方で、「Folder B」には「E4」という１つのロボットグループしか含まれていなかったため、サブフォルダーは作成されませんでした。

:::note info
以下のように、rootという空っぽのフォルダーを最上位に持ってくるやり方もあります。このようにしておくことで、フォルダー共通で見に行くリソース（アセット、キューなど）を「root/Common」にまとめて配置することができます。
移行機能を使った後に、このようなフォルダー体系に組み替えることも可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2254418/e09a9df5-dd0f-7b82-7b17-70348d45bad2.png)

:::

##### フォルダーとアカウントの紐付け
「ロボットグループ（旧）＝サブフォルダー（新）」という対応関係なので、「ロボットグループ（旧）」に属していたロボットの移行先アカウント（[ここ](https://qiita.com/nakawodayo/items/a7afb6282287da67dd40#%E6%9C%89%E4%BA%BA%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC)と[ここ](https://qiita.com/nakawodayo/items/a7afb6282287da67dd40#%E7%84%A1%E4%BA%BA%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC)でマッピングされたやつ）が、「サブフォルダー（新）」に割り当てられます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2254418/3a74889b-f5a0-4c45-50b9-6775e7f7de9e.png)

##### フォルダーとマシンの紐付け
マシンの移行先は、下記の情報をもとに導出されます。

| ロボット（旧） | ロボットグループ（旧） | マシン | モダンフォルダー（新） |
|:------------:|:------------:|:------------:|:------------:|
| R1    | E1 | M1 | Migrated Folder A/E1 |
| R2    | E1 | M2 | Migrated Folder A/E1 |
| R3    | E2 | M3 | Migrated Folder A/E2 |
| R4    | E3 | M4 | Migrated Folder A/E3 |

旧ロボットから、そのロボットと紐づいていたロボットグループとマシンの組み合わせが特定できるので、それをモダンフォルダーとマシンの組み合わせに変換しています。[^5]

:::note info
経験上、モダンフォルダー移行をする際は、新しくUR用のマシンテンプレートを発行して、古い標準マシンは使わないようにすることがほとんどなので、そうしたい場合は、移行後に自分で修正する必要がありそうです。
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2254418/3c883164-4f5f-3e92-d9c0-820915a04cd2.png)

##### プロセス
プロセスは、紐づいているロボットグループから、移行先のモダンフォルダーが決定されます。

| プロセス | ロボットグループ（旧） | モダンフォルダー（新） |
|:------------:|:------------:|:------------:|
| P1    | E1 | Migrated Folder A/E1 |
| P2    | E1 | Migrated Folder A/E1 |
| P3    | E2 | Migrated Folder A/E2 |
| P4    | E2 | Migrated Folder A/E2 |
| P5    | E3 | Migrated Folder A/E3 |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2254418/ad9ac3c6-d199-920c-d18a-c1a9222c3a27.png)

##### トリガー
トリガーは、プロセスと紐づいているので、プロセスと同じフォルダーに移行されます。[^6]

| トリガー | プロセス | ロボットグループ（旧） | モダンフォルダー（新） |
|:------------:|:------------:|:------------:|:------------:|
| T1    | P1    | E1 | Migrated Folder A/E1 |
| T2    | P2    | E1 | Migrated Folder A/E1 |
| T3    | P3    | E2 | Migrated Folder A/E2 |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2254418/049e9785-b2e3-2f58-51ec-ba14216f9c66.png)

##### アセット
アセットは、もともとロボットグループと関係を持っていないので、とにかく全部のサブフォルダーに移行されます。

| アセット | モダンフォルダー（新） |
|:------------:|:------------:|
| A1    | Migrated Folder A/E1<br>Migrated Folder A/E2<br>Migrated Folder A/E3 |
| A2    | Migrated Folder A/E1<br>Migrated Folder A/E2<br>Migrated Folder A/E3 |
| A3    | Migrated Folder A/E1<br>Migrated Folder A/E2<br>Migrated Folder A/E3 |
| A4    | Migrated Folder A/E1<br>Migrated Folder A/E2<br>Migrated Folder A/E3 |
| A5    | Migrated Folder A/E1<br>Migrated Folder A/E2<br>Migrated Folder A/E3 |

移行のされ方がやや独特で、クラシックフォルダー側の旧アセットをソースとして、モダンフォルダー側にリンクが貼られます。その際、ロボットごとの値を持つアセットについては、リンク機能を使えない制約があるので新規作成されるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2254418/6c1d1e54-30cf-4819-94a0-e939edb13058.png)
上図の「A4」は、もともとロボットごとの値を持つアセットだったため、このフォルダー内の対応するユーザーにマッピングされて、新規作成されました。
| アセット | ロボット（旧） | ユーザー（新） |
|:------------:|:------------:|:------------:|
| A4    | R1    | migrated folder a_r1 |
| A4    | R2    | migrated folder a_r1 |

「A5」も、もともとロボットごとの値を持つアセットでしたが、このフォルダー内には対応するユーザーがいなかったため、Global値だけのアセットとして新規作成されました。
| アセット | ロボット（旧） | ユーザー（新） |
|:------------:|:------------:|:------------:|
| A5    | R3    | N/A（E1にはマッピングされたユーザーがいない） |
| A5    | R4    | N/A（E1にはマッピングされたユーザーがいない） |

##### キュー
キューも、もともとロボットグループと関係を持っていないので、とにかく全部のサブフォルダーに移行されます。
アセットと同様、クラシックフォルダー側の旧キューをリソースとして、モダンフォルダー側にリンクが貼られます。

| キュー | モダンフォルダー（新） |
|:------------:|:------------:|
| Q1    | Migrated Folder A/E1<br>Migrated Folder A/E2<br>Migrated Folder A/E3 |
| Q2    | Migrated Folder A/E1<br>Migrated Folder A/E2<br>Migrated Folder A/E3 |
| Q3    | Migrated Folder A/E1<br>Migrated Folder A/E2<br>Migrated Folder A/E3 |
| Q4    | Migrated Folder A/E1<br>Migrated Folder A/E2<br>Migrated Folder A/E3 |
| Q5    | Migrated Folder A/E1<br>Migrated Folder A/E2<br>Migrated Folder A/E3 |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2254418/e266d4ae-37ff-2c58-1836-13fdb16e40e7.png)


# 感想
- UiPath公式の移行方針を知れたので、いい勉強になりました。
- 今までモダンフォルダー移行するときは、まず空っぽのrootフォルダーを作って、その下に組織単位ごとのサブフォルダー、さらにその下にロボットグループごとのサブフォルダーとしていたので、そこはどっちがいいのか悩みました。（今も悩み中。）
- アセットやキューを、クラシックフォルダーからリンクしてくる仕様だったので、クラシックフォルダー削除されたらどうなるんだよ！と一瞬思いましたが、リンク機能の仕様を確認したところ、リンク元を削除したからと言って全部消えるわけではないみたいです。
- 当たり前ですが、モダンフォルダー移行に伴って、フォルダーの構成を見直したい等の要件がある場合は、今まで通りOrchestratorManagerを使って移行するしかないですね。（この機能を使うと、全部自動的に移行されちゃうので・・・。）
- ただ、とにかく今あるリソースを全部モダンフォルダーにいい感じに持ってって！という感じであれば、設定も楽ちんでしたし、使える機能なんじゃないかと思いました。

以上です！
最後まで読んでくださった方、ありがとうございました。

[^1]:クラシックフォルダーは、2022年10月をもって正式に非推奨化される予定。なお、「非推奨とは、機能がより優れた代替機能に置き換えられている段階を指します。機能を非推奨としている場合、UiPath ではその機能の使用をお勧めしませんが、機能は引き続き利用することができます。」とのこと。
参照：https://docs.uipath.com/overview-guide/lang-ja/docs/deprecation-timeline#upcoming-deprecations-1

[^2]:OrchestratorManagerは、Orchestrator APIを使用したStudioのプロジェクトで、Orchestratorから一括でデータを落としてきたり、作成したりできる優れもの。データは、リソース毎に分けられたExcelのブックで管理される。
参照：https://marketplace.uipath.com/listings/orchestrator-manager

[^3]:"Orchestrator Manager Manual.pdf", p. 54 より抜粋。
参照：https://marketplace.uipath.com/listings/orchestrator-manager

[^4]:これはクラウド版の話です。オンプレ版のモダンフォルダーだと、「ユーザーのWindowsアカウント」がキーになります。

[^5]:この移行方針について、若干いまいちかなと思うのは、Attendedロボットと紐づいているマシンも、自動的にモダンフォルダーに割り当てられてしまうという点です。そもそも、モダンフォルダーとマシンを紐付けるのは、Web画面上からUnattended実行するために必要だからです。多めに割り当てられたからと言って困ることは特にないと思うのですが、個人的には若干冗長な気がします。
とはいえ、ユーザーがライセンス数の関係で、本来Unattendedのものを一時的にAttendedに切り替える運用をしている可能性もあるので、自動で移行させるのであれば、このやり方が安牌なんだろうなとは思います。

[^6]:ちなみに、OC2020/2021までは、トリガーのマシン指定ができなかったので、もしクラシックフォルダーで「すべてのロボット」を指定しているトリガーがあった場合、上手く移行できませんでした。ただ、今は以下のように「すべてのロボット」を「すべてのユーザーとマシンのマッピング」に読み替えてくれるので、特に問題ありません。
参照：[[UiPath] よくわかるモダンフォルダ(ジョブ/スケジュール設定OC2022.4編)](https://qiita.com/masatomix/items/83deaea6d841e8e51315#%E5%8F%82%E8%80%83%E3%82%AF%E3%83%A9%E3%82%B7%E3%83%83%E3%82%AF%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%81%8B%E3%82%89%E3%81%AE%E7%A7%BB%E8%A1%8C%E3%81%AE%E8%A6%B3%E7%82%B9)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2254418/703ca831-3b35-faa5-1e3d-2263e4230413.png)