【UiPath】Linux Robotを使ってみよう！

# はじめに
本記事は UiPath (produced with UiPath Friends) Advent Calendar 2024 の第12日目です。

https://qiita.com/advent-calendar/2024/uipath

今回は **UiPath Robot for Linux (以下Linux Robot)** を使ったUnattended Robotの利点と環境構築手順について説明します。

Linux Robotは2021年10月頃にリリースされ、クロスプラットフォームのワークフローの実行環境として一般利用が可能になりましたが、あまり知られていない気がしますのでこの場でメリットや利用手順について宣伝してみたいと思います。

Linux RobotはDockerコンテナとして動作しますので、Dockerの使い方については少々知識が必要ですが、Linuxの操作はほとんど不要です。LinuxやmacOSでも動作しますが、今回は **Docker for WindowsとAWS/Azureのコンテナサービスを使ってLinux Robotをデプロイする方法** についてご紹介したいと思います。

# Linux Robotのメリット
ほとんどのケースではWindowsマシンが自動化処理の実行環境として使用されますが、Linux Robotを利用すると良いのはどのようなケースでしょうか？

まずLinux Robotの利用前提として、Studio WebやStudioのクロスプラットフォームとしてワークフローを開発する必要があります。その上で下記のようにLinux Robotを利用すると良い場面があります。
- ワークフローの実行環境の利用コストを極力削減したい場合
- 実行環境のデプロイを簡単に行いたい場合
    - 後述の [Linux Robotの利用手順](#linux-robot%E3%81%AE%E5%88%A9%E7%94%A8%E6%89%8B%E9%A0%86) で解説しますが、コマンド一つでデプロイできます
- Windowsマシンのパッチ適用などのメンテ作業を削減したい場合
- ワークフローの実行時間が **15分以上** かかる場合
    - ※ [サーバーレスロボット](https://docs.uipath.com/ja/orchestrator/automation-cloud/latest/user-guide/executing-unattended-automations-with-serverless-robots) では15分を超過するとタイムアウトが発生するという制限があるため

# クロスプラットフォームワークフローで出来ること
クロスプラットフォームのワークフローでは次のオートメーションを実現できます。
- ユーザー操作を必要としない自動化処理
- Chromeを使用したWebブラウザー操作の自動化処理

詳細は [Webガイド](https://docs.uipath.com/ja/studio/standalone/2024.10/user-guide/about-automation-projects#designing-cross-platform-projects) をご参照ください。

# Linux Robotの利用手順
1. [ワークフロー作成](#1-%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC%E4%BD%9C%E6%88%90)
1. [Orchestrator設定](#2-orchestrator%E8%A8%AD%E5%AE%9A)
1. [Linux Robotのデプロイ](#3-linux-robot%E3%81%AE%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4)
1. [ワークフロー実行](#4-%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC%E5%AE%9F%E8%A1%8C)

## 1. ワークフロー作成
Studio WebまたはStudioの対応OS「クロスプラットフォーム」にてワークフローを作成してOrchestratorのテナントプロセスフィードにパブリッシュします。

- Studio Webワークフローのサンプルとして入力引数に質問文を渡し、GenAIアクティビティを使用して `gpt-4o` モデルからの回答を出力引数として返しています。

    ![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/faaaf633-edc7-c854-5261-e4d74801600a.png)

- StudioクロスプラットフォームワークフローのサンプルではChromeにて https://www.uipath.com/ja にアクセスし、トップページのテキスト (`UiPath is "AI at Work".`) を取得します。

    ![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/78ec55e0-9a03-744f-d51d-8ed50ac1c1d9.png)

- GenAIアクティビティの利用方法の詳細についてはこちらの記事をご参照ください。
    - [生成AIサービスとの連携まとめ](https://qiita.com/hidecha/items/8adb863b4ea336997c9e#2-uipath-genai-%E3%82%A2%E3%82%AF%E3%83%86%E3%82%A3%E3%83%93%E3%83%86%E3%82%A3)
    - [AI Trust LayerによるContext-Grounding機能のメリットと利用手順](https://qiita.com/hidecha/items/6aba3e50e9c3797fc92b)
    - [マルチモーダル対応アクティビティで画像分析や文字抽出をする](https://qiita.com/hidecha/items/bc98571ab8efa375fb21)

## 2. Orchestrator設定
次にOrchestratorにてワークフローを実行できるように設定します。
- [Automation Cloud](https://cloud.uipath.com) のOrchestratorにて先ほど作成したワークフローをSharedフォルダーにてプロセスとしてそれぞれ追加します。
    ![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/cfb29b2f-7f74-00fa-3376-ec2e296277b0.png)

- テナント > マシンにてマシンテンプレートを作成し、Production (Unattended) ライセンスを1割り当ててプロビジョニングします。
    ![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/47226980-28e7-5d84-b45f-cdfcc7b8fe52.png)

- クライアントIDとクライアントシークレットをそれぞれコピーしてメモします。

    ![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/04e73dad-bbfb-c280-41ac-4939ab6d6627.png)

- ロボットアカウントまたはユーザーにて無人オートメーションの設定をします。資格情報は不要です。
    ![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/3052172d-a885-b039-10ee-314803f0759c.png)

- Sharedフォルダーにアカウントを割り当てます。
    ![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/0537e20c-e201-dae1-892b-5f847a5fb195.png)

- Sharedフォルダーにマシンを割り当てます。
    ![08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/431c52e8-cee6-54f2-d763-85a0fc8b30ad.png)

Orchestratorの設定は以上です。

## 3. Linux Robotのデプロイ

いよいよLinux Robotをデプロイします！
Dockerが利用可能な環境に応じて次のいずれかの手順を選択して実行します。

### Docker for Windows
Windows環境にDockerをインストールします。
- まずDocker Desktopのシステム要件とインストール手順について次のサイトをご参照ください。

https://docs.docker.jp/docker-for-windows/install.html

- Docker Desktopのインストーラーをダウンロードして実行します。
    ![09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/9ff30298-54d5-a44c-2bc9-62fe32b80658.png)

- インストールが成功しましたらDocker Desktopを起動し、"Engine running"と表示されることを確認します。
    ![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/3ad1e71d-2f8e-0ab2-4077-f754aa91eefe.png)

- コマンドプロンプトにて次のDockerコマンドを環境に応じて実行します。コマンドの詳細は [Webガイド](https://docs.uipath.com/ja/robot/standalone/2024.10/admin-guide/docker-installation) を参照してください。
    ```
    docker run -e LICENSE_AGREEMENT=accept -e ORCHESTRATOR_URL="https://cloud.uipath.com/{組織名}/{テナント名}/orchestrator_" -e CLIENT_ID="{クライアントID}" -e CLIENT_SECRET="{クライアントシークレット}" -tid registry.uipath.com/robot/uiautomation-runtime:<tag>
    ```
    - `<tag>` はRobotバージョンに応じて設定します。現時点での最新版は `24.10.95.24248-robot24.10.0` です。なお一般的に使用される `latest` は残念ながらLinux Robotのデプロイには使用できません。
    - `{クライアントID}` と `{クライアントシークレット}` はマシンテンプレート作成時にメモしたものを使います。
    ![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/059e0e2a-d8ec-2b93-9e81-705c91a31560.png)

- Docker Desktopまたはコマンド `docker ps -a` にてLinux Robotのコンテナが実行中であることを確認します。
    
    ![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/c752db49-86e6-4517-281a-a02d1deb73b3.png)

    ![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/c6324850-2954-7fb3-c555-d5216eacee30.png)

- Orchestrator > テナント > 監視 > 無人セッションにて、Linux Robotマシンのステータスが **接続済み** と表示されていることを確認します。

    ![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/ef61358c-2a01-38ca-9af9-9a06aa78e17b.png)

以上でDocker for WindowsにてLinux Robotをデプロイする手順は完了です。

### Amazon ECS
AWSのコンテナサービスであるECSを利用してLinux Robotをデプロイすることもできます。

- AWSマネジメントコンソールにログインし、Amazon Elastic Container Service > タスク定義 > 新しいタスク定義の作成 > **新しいタスク定義の作成** をクリックします。

    ![23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/92d2e6c8-1cbd-a069-d23d-c0cd510317fa.png)

- タスク定義ファミリー名を入力し、起動タイプとして **AWS Fargate** のみが選択されていることを確認します。コンテナのCPUやメモリなども指定できますが、ひとまず既定値を使用します。

    ![24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/4b2d1985-7f1e-d719-3175-099b5ae238bc.png)

- コンテナの詳細にて名前を入力し、イメージURIとして `registry.uipath.com/robot/uiautomation-runtime:24.10.95.24248-robot24.10.0` を指定します。ポートマッピングは不要なため **削除** をクリックします。

    ![25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/d893884c-258c-8d2c-ebf4-39f7e2c01fd4.png)

- 環境変数にて次のキーと値のペアを追加します。
    - **LICENSE_AGREEMENT**: `accept`
    - **ORCHESTRATOR_URL**: `https://cloud.uipath.com/{組織名}/{テナント名}/orchestrator_`
    - **CLIENT_ID**: `{クライアントID}`
    - **CLIENT_SECRET**: `{クライアントシークレット}`

    ![26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/b99f7a75-5905-d05f-308b-efe9d09b5a42.png)

- 画面下までスクロールし、**作成** をクリックします。

    ![27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/e490654f-607a-6102-e43e-cb98c5d2632a.png)

- 次に Amazon Elastic Container Service > クラスター > **クラスターの作成** をクリックします。

    ![28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/276d9729-0ad2-ad35-ef47-688833070b4f.png)

- クラスター名を指定し、インフラストラクチャとして **AWS Fargate** のみが選択されていることを確認し、 **作成** をクリックします。

    ![29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/a8a63791-8bff-6645-ab2a-b4349b433d70.png)

- クラスター作成が完了しましたら、クラスターをクリックし、タスク > **新しいタスクの実行** をクリックします。

    ![30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/c136ecf5-fb2e-fd07-99b7-74400d81a343.png)

- デプロイ設定にて先ほど作成したタスク定義ファミリーを選択し、画面下の **作成** をクリックします。

    ![31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/39787cfa-d176-a512-360a-1a4a0e7d24a0.png)

- タスク > 前回のステータスが実行中となることを確認します。

    ![32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/bfe76e6d-d53b-fb5a-a9bf-6e35c1254743.png)

- Orchestrator > テナント > 監視 > 無人セッションにてステータスが **接続済み** と表示されていることを確認します。

    ![33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/dd554271-29ee-c6b8-31bc-388936841d87.png)

以上でAmazon ECSにてLinux Robotをデプロイする手順は完了です。
なお今回はAWSマネジメントコンソールを使用しましたが、AWS CLIにてデプロイすることも可能です。詳細は [AWSのWebガイド](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ECS_AWSCLI_Fargate.html) をご参照ください。

### Azureコンテナーインスタンス
Azureのコンテナサービスであるコンテナーインスタンスを利用してLinux Robotをデプロイすることもできます。
- [Azureポータル](https://portal.azure.com) にログインし、リソースグループを作成します。
    
    ![34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/6c7afed8-cadc-f7b4-1dc6-a892193e2c21.png)

- 次に **Azure Cloud Shell** を起動し、Bashを選択します。次の画面では **ストレージアカウントは不要です** を選択します。

    ![35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/05f33dbf-a97f-6b74-63dd-56d703143f04.png)

- Azure Cloud Shellにて次のコマンドを実行します。`{変数}` は環境に応じて適宜変更します。

    ```
    az container create \
        --resource-group {リソースグループ名} \
        --name {コンテナ名} \
        --image registry.uipath.com/robot/uiautomation-runtime:24.10.95.24248-robot24.10.0 \
        --restart-policy OnFailure \
        --environment-variables 'LICENSE_AGREEMENT'='accept' 'ORCHESTRATOR_URL'='https://cloud.uipath.com/{組織名}/{テナント名}/orchestrator_' 'CLIENT_ID'='{クライアントID}' 'CLIENT_SECRET'='{クライアントシークレット}'
    ```
    ![36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/46b62c55-d648-342b-85d1-fbcf6d35c6cd.png)

- しばらくしてコマンド実行が成功しましたら、コンテナーインスタンスに移動し、コンテナの状態が実行中であることを確認します。

    ![37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/62b6cfa9-9457-5fc5-2d1e-85b08098f8c0.png)

- Orchestrator > テナント > 監視 > 無人セッションにてステータスが **接続済み** と表示されていることを確認します。

    ![38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/5ecf28a2-2d6b-7b42-08dd-0d1058d736d5.png)

以上でAzureコンテナーインスタンスにてLinux Robotをデプロイする手順は完了です。

## 4. ワークフロー実行
- Linux Robotが利用可能になりましたらワークフローを実行してみましょう。Sharedフォルダー > オートメーション > プロセスにて実行ボタンをクリックします。

    ![17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/37c826e3-bdbc-eaf7-3d8c-e1e49066b2c7.png)

    - 必要に応じて入力引数を指定して実行します。

        ![18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/f95118ef-3c27-e678-1898-db31ec40de79.png)

    - Linux Robot上でジョブが実行され、ステートが成功となることを確認します。また出力値や実行ログなども確認します。

        ![19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/9b967873-66d0-bc19-2f2a-462b1b345ce1.png)
       
- Chrome自動化をデバッグする際には、**ジョブの記録** を使用すると実行時の動作を動画で記録してくれるので便利です。ジョブの記録を有効にするには、プロセス > **その他の設定** から行います。

    ![20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/4f267e9e-f731-177a-8074-9107bf981f7b.png)

    - この状態でジョブを実行すると、ジョブ > **ビデオタイムライン** よりジョブ実行時の動画を再生することができます。

        ![21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/baab5ca2-ea9c-b22d-d8e0-0ee4ee928d25.png)

# 注意事項など

Linux Robot 運用上の注意点について説明します。

## ロボット診断ログの確認方法
Linux RobotがOrchestratorに接続できない場合などは [ロボット診断ログ](https://docs.uipath.com/ja/robot/standalone/2024.10/admin-guide/understanding-robot-logs#robot-diagnostic-logs) を確認します。
- Dockerではコマンド `docker logs {コンテナ名}` を実行します。コンテナ名はあらかじめ `docker ps -a` で確認します。コンテナ名の代わりにコンテナIDを指定することもできます。

    ![15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/61a822e6-eac4-9728-2f02-361397c1965d.png)

- Amazon ECSではクラスター内のタスクをクリックし、ログを確認できます。

    ![39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/db69c270-da6f-56c6-bd61-fc8fc5a9256e.png)

- Azureコンテナーインスタンスでは、コンテナー > ログ よりログを確認できます。

    ![40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/0d372077-4612-79dc-b396-2d9619a2eae7.png)

## ワークフロー内でのファイル読み書き
Linux Robotでファイルを読み書きする際にはストレージバケットを使用します。
- あらかじめOrchestratorにストレージバケットを作成します。

https://docs.uipath.com/ja/orchestrator/automation-cloud/latest/user-guide/managing-storage-buckets

- ワークフローにてストレージバケット関連のアクティビティを利用してファイルへの読み書きを行います。
	- [ストレージ テキストを読み込み](https://docs.uipath.com/ja/activities/other/latest/workflow/read-storage-text)
	- [ストレージ テキストを書き込み](https://docs.uipath.com/ja/activities/other/latest/workflow/write-storage-text)
	- [ストレージ ファイルをダウンロード](https://docs.uipath.com/ja/activities/other/latest/workflow/download-storage-file)
	- [ストレージ ファイルをアップロード](https://docs.uipath.com/ja/activities/other/latest/workflow/upload-storage-file)
	- [ストレージ ファイルのリストを取得](https://docs.uipath.com/ja/activities/other/latest/workflow/list-storage-files)
	- [ストレージ ファイルを削除](https://docs.uipath.com/ja/activities/other/latest/workflow/delete-storage-file)

## コンテナ削除・バージョンアップ
- Dockerにてコンテナを削除するには次の手順を実行します。
    - `docker ps -a` にてコンテナ名を確認します。
    - `docker stop {コンテナ名}` にてコンテナを停止します。
    - `docker rm {コンテナ名}` にてコンテナを削除します。
    - ※ コンテナ名の代わりにコンテナIDを使用することもできます。

    ![16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/7dcc0664-282b-accd-0725-97e20ac0b90b.png)

- Amazon ECSとAzureコンテナーインスタンスではそれぞれの管理画面でリソースを削除します。
- 新しいバージョンのRobotにバージョンアップするには一旦既存のコンテナを削除し、新しいバージョンの `<tag>` を指定してコンテナを再作成します。Amazon ECSとAzureコンテナーインスタンスではそれぞれのリソース作成時に新しいバージョンの `<tag>` を指定します。

    ```
    docker run -e LICENSE_AGREEMENT=accept -e ORCHESTRATOR_URL="https://cloud.uipath.com/{組織名}/{テナント名}/orchestrator_" -e CLIENT_ID="{クライアントID}" -e CLIENT_SECRET="{クライアントシークレット}" -tid registry.uipath.com/robot/uiautomation-runtime:<tag>
    ```

## 古いセッション情報の削除
- Linux Robotコンテナは再起動するたびに内部的なホスト名が異なります。このため Orchestrator > テナント > 監視 > 無人セッション の画面では古いセッション情報が残ります。ステータスが **切断** の不要なセッション情報は選択して削除することができます。

    ![22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178312/d6c65869-2bae-009b-6d58-2c083169a788.png)

# おわりに
今回はLinux Robotのメリットと利用手順についてご説明しました。ワークフローをクロスプラットフォームで作成する必要がありますが、マシンのデプロイはコマンド一つで容易に実行できます。Unattended Robot実行環境の選択肢として検討していただけると幸いです。最後までお読みいただき有難うございました！

🎄 それでは皆さま、良いクリスマスと良いお年をお迎えください！ 🎍