検証環境としての RFS インストール・フリー構築法 ～ 超簡単 ～

## はじめに

以前紹介した Tomcat9 と MySQL8 、Management Console（以降、MC）の構築を前提にして、今回は ロボット・ファイル・システム（以降、RFS）の構築と設定について紹介します。

https://qiita.com/ParakeetOnTheHead/private/317598fb34af24633867

https://qiita.com/ParakeetOnTheHead/items/ec3821d2bc1f9c905716

https://qiita.com/ParakeetOnTheHead/items/c346c00bee24b59468c3

:::note 
本ブログは、BizRobo! v11.3.0.2 の利用を前提に解説します。
:::


## 環境の準備

RFSの構築に必要なファイルやリソースを準備します。細かい調達方法は省略します。

### RFS 構築のための調達リソース

| # | リソース | 準備方法 |
|:-:|:-|:-|
| 1  | rfs.war  | BizRobo!のインストールフォルダ配下の `📁WebApps` から `rfs.war` をコピー |


### 環境構築におけるパラメータ一覧

以下を前提として構築作業を実行。設定値は各自適当に判断してください。

| パラメータ | 設定値 |補足|
|:-|:-|:-|
| mc-path  |  http://192.168.3.13:8080/mc | RFS と連携する MC の URL を指定します。[^1]|
|  data-path |  C:/RFS | RFS のルートフォルダを設定します。|
|  RFS の URL | http://192.168.3.13:8081/rfs | MC からアクセスする RFS の URL を設定 します。|

[^1]: 自己署名証明書を使用した HTTPS 経由の Robot File System へのアクセスはサポートされていません。

### 構築する環境のサーバー構成

ちょっとした検証作業用に、単体のPC（local IP：`192.168.3.13`）へ一式セットアップします。
MC も RFS も Tomcat 上で動作するシステムなので、同居させてもいいのですが、 RFS に絞った検証をする際に同居環境がノイズにならないよう、下記の通り独立したWebコンテナ上に構築します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090491/c4adfda4-b030-27a9-e471-74785015d513.png)


:::note
単一端末上に複数の `Tomcat` を起動する場合、待ち受けポートについてはバッティングしないように `8080` と `8081` に変更しますが、それとは別にシャットダウンポートとして利用されている `8005` についても `8006` に変更します。（起動エラーとなるため）
:::

### 構築環境のフォルダ構成

```bash
📁 apache-tomcat-9.0.x
 ├─ 📁 webapps     # TomcatにデプロイするWebアプリケーションが格納されています。
 │  ├─ 📁 rfs
 │  │  └─ 📁 WEB-INF
 │  │     └─ 📄 web.xml
 │  └─ 📄 rfs.war
 ├─ 📁 logs  
 │  └─ 📄 rfs.log
 :
```

## 環境構築の流れ

RFSサーバを構築するには以下の３ステップを実施します。

1. アプリケーションファイルのサーバへの配置
1. `web.xml` の設定
1. MC の設定

## 構築手順

### サーバ状態の確認

Tomcat9 サーバーが**停止**していることが望ましいですが、`WEB-INF/web.xml` を編集するだけであれば Tomcat は自動的に変更を感知して設定ファイルをリロードするので、**起動**したままでも構いません。

:::note
`conf/context.xml` に `WatchedResource` として設定されているファイルは Tomcat が自動的にその変更を監視しつつ、変更を感知したら再読み込みするため、サーバ自体の再起動は不要です。

```xml:conf/context.xml
<!--The contents of this file will be loaded for each web application-->
<Context>

    <!--Default set of monitored resources. If one of these changes, -->
    <!--the web application will be reloaded.                        -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <WatchedResource>WEB-INF/tomcat-web.xml</WatchedResource>
    <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
    ：
</Context>
```
:::

***

### 1．Web Application aRchive（war）ファイルの配置

`📁 webapps` 配下に `📄 rfs.war` を配置し、ファイルを解凍/展開します。

***

### 2．`web.xml` への必要事項設定

展開した `📁 WEB-INF` 配下の `📄 web.xml` をエディタで開き、以下の通り編集します。

```diff_xml:webapps/rfs/WEB-INF/web.xml
<?xml version="1.0" encoding="utf-8"?>
:
    <servlet>
        <servlet-name>RFSSessionManager</servlet-name>
        <servlet-class>com.kapowtech.robotfilesystem.SessionManager</servlet-class>
        <init-param>
            <param-name>mc-path</param-name>
-            <param-value>http://url-for-mc</param-value>
+            <param-value>http://192.168.3.13:8080/mc</param-value>
        </init-param>
        <init-param>
            <!-- the path to where local data is stored -->
            <param-name>data-path</param-name>
-            <param-value>/data</param-value>
+            <param-value>C:/RFS</param-value>
        </init-param>
        <init-param>
            <!-- the create local folders for static shares -->
            <param-name>create-folders</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            :
            <param-name>allow-absolute-paths</param-name>
            <param-value>false</param-value>
        </init-param>

    </servlet>
:
```
#### その他の項目

- **create-folders** ： 
`true（default）`とした場合、初回ロボット実行時に `data-path` に指定したフォルダが自動生成され、併せて MC のレポジトリで設定した各ロボットファイルシステムのフォルダも生成されます。[^2]

- **allow-absolute-paths** ： 
`false（default）`とした場合、`パス` で指定できる領域が  `data-path` を頂点としたその配下に制限される代わりに、MC のレポジトリで `パス` の値を相対パスで指定可能になります。
`true` とした場合、MC のレポジトリに設定する `パス` の値に `C:\Other\外部`といった絶対パスを指定して、`data-path` 外の場所に連携フォルダを指定することが可能になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090491/7aaf3ef4-489b-7fed-b9e0-a4c4ed6d4792.png)

:::note
RFSで連携する先が外部のFTPサーバ（`ftps://ftp.box.com:21`など）やネットワークドライブ（`\\san-server\remote-rfs` など）の場合 `allow-absolute-paths` は **false** のままで問題ありません。
:::

[^2]: false にした場合、MC のレポジトリに設定したパスのフォルダが生成されないため、手動で作成しない限りはロボット実行時にエラーになります。敢えてレポジトリからの登録を制限したい場合以外に必要性は感じられません。

***

#### Tomcat の開始

Tomcat を起動して RFS が動作していることを確認します。

`📁 logs` 配下に `📄 rfs.log` ファイルが生成されていればOKです。

***

### 3. MCの設定

MC の `設定` > `一般` > `ロボット ファイル システムサーバー` 画面から、ロボットが接続する RFS サーバのURL を設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090491/f5f7ef0e-be07-3ce0-2234-d3eed2acd42c.png)

### その他の環境設定

[オンラインヘルプ](https://docshield.kofax.com/RPA/ja_JA/11.3.0_5cdzhlgb3t/help/rpa_help/help_main/mgmtconsole/c_robot_file_system.html?h=100%20MB)によると ~~`ロボット ファイル システムにアップロードできるファイルの最大サイズは 100 MB です。`~~[^5] が、RFSサーバローカルでの移動であれば、「400MB強のファイルをロボットの中に読み込み、そのまま別のRFSフォルダを指定して書き出す」ことができたので、この制限がどこに聞いてくるのかはちょっと不明です。[^4]

[^4]: ちょっとした検証の目的で、`BOX` に対して FTPS接続で 以下400MB強のファイルをRFS経由でアップロードしてみましたが、問題なく処理できてしまいました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090491/7fa55cf7-1c9b-d38e-3968-691fddd65784.png)
ちなみに、BOXへのftps接続には `990` ポートと `21` ポートが用意されていますが、RFSにおいては `21` ポートを利用してください。その際、間違ってプロトコルを `ftp://` にしないよう気を付けましょう。 `ftps://` にしないと暗号化されません。

[^5]: その後開発チームに確認したところ、`現在（少なくとも v11.3.0.2）においてはこの制限は撤廃しているということで、今後参照のオンラインドキュメントに関しても修正していく.`とのことでした。


また、RFSは Tomcat上で動作する仕組みなので、同様に `maxPostSize` の設定が必要なのかな？とも思いましたが、`server.xml` 内の値を 1KB に設定してみても、10MB以上のファイルを RFS で読み書きできたので、設定ファイルの編集は必要ないでしょう。（マニュアルにも記載なかったので）

```xml:server.xml
<Connector port="8081" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8444"
           maxParameterCount="1000"
           maxPostSize="1024"　…　★
           />
```

## ロボットファイルシステムのレポジトリ設定

RFS の環境設定が完了したので、具体的にロボットから利用するためのレポジトリ設定をしていきます。

RFS 自体はファイルアクセスのための窓口にすぎず、実際に**誰**が**どの範囲**で、**どこに**アクセス可能かについては、プロジェクトごと・ロボットごとにリポジトリを設定することで、以下のように権限のあるロボットだけが安全に指定のリソースにアクセスできるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090491/0bc74452-1244-e750-62ee-359e8b0842dc.png)
まぁ、このあたりの交通整理が面倒臭いと言われがちではありますが、一定の規模を超えたロボットの基盤を運用するのであれば、必須の機能だと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090491/0f146824-76e7-84a2-9334-43f1eee490f2.png)
それでは、以下順番にレポジトリを設定していきます。
- **一般情報**：RFSのリソース定義情報一式
- **ロボットマッピング**：RFS リソースにアクセス可能なロボットの指定
- **認証されたアクセストークン**：RFS リソースにアクセス可能なロボットや環境の設定

:::note
**ロボットマッピング** と **認証されたアクセストークン** については、どちらかを設定すればよく、両方設定する必要はありません。
また、**一般情報** の設定において `プロジェクト範囲` のチェックボックスを「ON」にすることで、指定したプロジェクト内の全ロボットから当該 RFSリソースにアクセスが可能となります。
:::

### 一般情報の設定

以下の情報を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090491/fe433389-385a-a6dc-e249-56147994b8ac.png)

|項目| 内容 |
|:-|:-|
| プロジェクト | プロジェクトを指定します。 | 
| プロジェクト範囲 | RFSを指定したプロジェクト内の全てのロボットと共有する場合にチェックを入れます。  | 
| ファイルシステム名  | 任意の名称。ロボット内から指定する際に使用する文字列。  | 
| パス  | ファイルシステム上の指定場所 。 `data-path` で指定したパスを起点に指定します |
| ユーザー名  | リモートドライブやFTPサーバなど、指定した `パス` へのアクセスに認証が必要な場合に設定。（通常は空でOK）   |
|パスワード|同上|

### ロボットマッピング

指定したプロジェクト内のロボット一覧の中から、当該 RFS へのアクセスを許可するロボットを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090491/18f19d00-7f8d-476b-2a83-389c5546b219.png)

### 認証されたアクセストークン

`レポジトリ` > `ロボット` から MC に登録されたロボットの「リソース アクセストークン」をコピーして、アクセスコードを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090491/dc41724c-5eb0-4825-2f7e-faea07daea44.png)
もしくは、ロボット開発中に DS から RFS へアクセスする場合には、DS のメニューバーから `ヘルプ（H）` > `製品について …` を選択し、表示されるダイアログ内の「Design Studio アクセストークン」の中の文字列をコピーしてアクセスコードを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090491/2e359e57-29b5-e671-3be4-8d7b496950ca.png)

:::note warn
レポジトリに登録されたロボットから個別に「リソース アクセストークン」を取得しますが、アクセストークンはロボットの中身が少しでも変更されると変わってしまいます。

ロボットの不正な入れ替えやなりすましを防ぐための重要なセキュリティ機能であり、使いどころも絞られてきます。

具体的には **プロジェクト外のロボットにアクセスを許可する場合** ですね。RFS自体はプロジェクト単位で管理されるものですが、部署間連携でロボットの処理済みファイルをプロジェクト間でやり取りする場合などは担当窓口（ロボット）を固定したうえでファイルのやり取りをするという方法がセキュリティ的にも安全です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090491/789f678c-893b-2f9e-9303-316dcbe3c91c.png)
:::

## ロボットからの利用設定

ロボットから RFS を利用する形態には 2 つの種類があります。

1. サーバ local（サーバ上）で**集中処理**をする
1. DAS （クライアント端末上）で**分散処理**をする

本項ではロボットからの疎通確認が目的なので、より簡単に試せる `サーバ local` からの処理を実施します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090491/979114b3-f779-1c41-64a3-1a1d2052ceef.png)

### ロボットファイルの作成

1. ロボットファイルを開き、`ファイルシステム` > `ファイルの読み取り` を選択します。
1. `ファイル アクセス` を 「RFS 経由」に変更し、ファイル名に MC のリポジトリで設定した `名前` と読み込む `ファイル名` を `/`（スラッシュ）を区切り文字として設定します。
1. `変数` には バイナリ型 の変数を指定します。

必要なデータを設定したら、ステップオーバーし、変数にファイルがバイナリ値として設定されれば完成です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090491/2bc19084-d515-1f90-7537-986a3a70e7b9.png)



:::note warn
設定値は正しいはずなのに以下のようなエラーが出る場合、DS が向いている MC の設定が間違っている可能性があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090491/93b827b2-e902-c7b2-1939-abbf046d379a.png)
環境によっては複数の MC を DS 内に設定している人もいると思います。メニューバーから `設定` > `Design Studio の設定（S）…` を選択し、`Management Consoles` タブから RFS の設定がしてある MC を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090491/b1b311f5-9234-41a8-373d-8436399b951a.png)
「**プライマリとして使用**」にチェックを入れ、「OK」ボタンでウィンドウを閉じます。

これにより DS から RFS にアクセス可能になります。
:::


## まとめ

セキュリティの重要性が叫ばれている昨今、エンタープライズ用途におけるBizRobo!のいち推し機能はRFSだと思っています。何気に**RFSを通じたファイルのやり取りは全て `rfs.log` 内に監査ログとして記録されます**し[^3]、運用者目線ではログが残るというのは大きいですよね。

運用観点で RFSは有用な仕組みですが、ロボットを作るだけの人にとっては「単なる面倒ごとの一つ」に映ってしまうかもしれません。

とはいえ、ロボットの利用規模が増えるほど外部ファイルのロボットからの取り扱いは複雑になり、アクセス権限含めどこか一か所で管理したいなぁ。。と思うようになると思います。 `net use` を前提とした開発も大変でしょう。

導入当初から必要な機能ではないだけに途中から導入しようとすると最初は苦戦するとは思いますが、是非長い目で見て有用なものと考え、徐々にでも使ってもらえればと思います。



[^3]: ログの例（以下）
    ```log4j:rfs.log
    2023-06-06 08:47:51 INFO  SessionManager:140 - Session created 559BCB7FF281FD682128EFAF5BADFBA5
    2023-06-06 08:47:51 INFO  SessionManager:140 - Session created 3747144CB990571C70D493B56A470648
    2023-06-06 08:47:51 INFO  SessionManager:329 - File system session '3747144CB990571C70D493B56A470648' created
    2023-06-06 08:47:51 INFO  RFS:39 - [Audit] OK Read C:\RFS\週報\aa.msi: main_BridgePJ (3747144CB990571C70D493B56A470648)
    2023-06-06 08:48:00 INFO  RFS:39 - [Audit] OK Write C:\RFS\共有レポート\bridge.msi: main_BridgePJ (3747144CB990571C70D493B56A470648)
    2023-06-06 08:48:00 INFO  SessionManager:359 - Explicit deletion of session 3747144CB990571C70D493B56A470648
    2023-06-06 08:48:00 INFO  SessionManager:151 - Session deleted 3747144CB990571C70D493B56A470648
    2023-06-06 08:49:50 INFO  SessionManager:151 - Session deleted 559BCB7FF281FD682128EFAF5BADFBA5
    ```