【UiPath】ストレージバケットとAWS S3を連携する

#はじめに
UiPath Orchestratorの「ストレージバケット」機能は、AWS S3と連携するができるのですが、設定方法だったり、細かい仕様が分からなかったので、調べてみました。

#ストレージバケットとは
ストレージバケットとは、Orchestratorのファイルストレージ機能で、様々なファイルをアップロード、ダウンロードすることができます。
Orchestratorの画面上からでも、Robotからでもファイルを操作することができ、ワークフローが参照するパラメータファイルの置き場に使用したり、アウトプットファイルの置き場としても使用可能です。
また、Action Centerフォームと連携もでき、フォームからファイルをアップロードした際の保存場所や、フォームに画像やPDFファイルなどを埋め込む際のデータの保存先としても使用できます。

##プロバイダー
ストレージバケットは、Orchestratorサーバのストレージを使用できる他、AzureやAWSなどのパブリッククラウドの外部ストレージとも連携することができます。Orchestratorのオンプレとクラウドで使用できるプロバイダーは異なります（下の画像はオンプレ版です）。
オンプレの場合は、UiPath.Orchestrator.dll.configを修正し、使用可能なプロバイダーを有効化します。
![ストレージバケット.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/c16ee365-28b5-4aa3-502f-62980a389bd9.png)

##S3を使うメリット
プロバイダーは、Orchestratorを使用する方が設定が簡単なのですが、S3など外部のマネージドサービスを使う方が優れているポイントもあります。

* ストレージの空容量を気にしなくていい
* バックアップが簡単
* 世代管理や自動削除などのルールを設定できる

#つかうもの
今回は以下の使用して検証を行っています。クラウドは2022年2月時点のもの。

* UiPath Studio v2021.10.4（UiPath.System.Activities 21.10.3）
* UiPath Orchestrator Cloud
* AWS S3

#ストレージバケットを設定する
##手順1. AWSの設定
###S3バケットの作成
S3のバケットを作成します。特に気にする必要もなく、普通に作ればいいです。
![S3バケット.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/ba3be189-a2c0-ef14-2f3f-2ff6b95ab143.png)

###IAMユーザの作成
OrchestratorがS3へアクセスするための認証用アカウントを作成します。
今回のIAMユーザは、AWSマネージメントコンソールは使用する必要はなく、アクセスキーだけが必要なので、「アクセスキー・プログラムによるアクセス」にチェックを入れます。
![IAMユーザ追加1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/2d9b8d96-efe3-636c-4103-205e63584d1d.png)

権限は、S3のフルアクセスを付与します。
![IAMユーザ追加2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/02da55f5-eb7d-2ffc-6523-39f3ec3f46c6.png)

ユーザが作成されるとアクセスキーIDとシークレットアクセスキーが発行されます。シークレットは外部に流出しないよう扱いには注意します。万が一、流出したら即時無効化してください。
![IAMユーザ追加3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/8ce72265-0671-ecb8-b20d-cd96758c978a.png)

アクセス元のOrchestratorに絞る（IPアドレスで制限を付ける）とか、特定のS3バケットしかアクセスできないなどの制約を追加したい場合は、別途IAMユーザにポリシーを追加します。

##手順2. ストレージバケットの設定
Orchestratorのバケット追加画面にて、「Amazon S3」を選択し、必要な情報を入力します。
![ストレージバケット設定1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/9262ec84-f98a-cf1d-e9bf-aa572fa8af18.png)

入力情報が間違っていたり、IAMユーザの権限が間違っていたりしてS3へ正常にアクセスできなかった場合は、ストレージバケット追加後、以下のようなエラーとなります。
![ストレージバケット設定2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/01c9e766-f9c4-4217-4a8d-a86a888b7b4a.png)

#ストレージバケットを使用する
##パターン1. Robotからファイルを操作する
アクティビティツリー「Orchestrator」>「ストレージ」にあるアクティビティを使用します。
![ロボットからアップロード1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/e8d51148-93d9-88f5-6f9b-cddb05216f82.png)
ファイルをアップロードするときは、「ストレージ ファイルをアップロード（Upload Storage File）」アクティビティを使います。
![ロボットからアップロード2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/0f0bca21-b388-c290-b89d-bc8cd8c98cf3.png)
「A\Book1.xlsx」のようにパスを指定してファイルがアップロードすると、S3ではフォルダ「A」の中にファイル「Book1.xlsx」が保存されます。
![ロボットからアップロード3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/5bf24c2f-cebe-18cb-ae03-6fbba174ca39.png)
![ロボットからアップロード4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/0c3c552c-21a3-1626-778b-7647f1d3137c.png)

##パターン2. Orchestratorからファイルを操作する
Orchestratorの画面からもファイルのアップロード、ダウンロードができます。
ファイルをアップロードする場合は、「\B\Book1.xlsx」のようにプルパスを指定すると、S3にもフォルダ「B」が作成され、その中にファイル「Book1.xlsx」が保存されます。
![OCからアップロード1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/7510f5df-ba8d-7408-adfa-6548a164c1fb.png)
![OCからアップロード2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/dd528f68-9f02-ecef-f933-ca176097c1ba.png)

###ファイルアップロードまたは削除が失敗する場合
Orchestratorからファイルをアップロードしたり、削除したりする際、エラーになることがあります。
![OCからアップロード3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/9020a983-5318-1c1a-2cdb-9d52be55aea4.png)
エラーが出た際は、S3のCORS設定を直すと解決します。オンプレOCを使っている場合は「AllowedOrigins」を使用しているOCのURLにします。
![OCからアップロード4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/dfacc446-5e45-02d3-d7e2-9a83e59c7b7f.png)

```
[
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "PUT",
            "DELETE"
        ],
        "AllowedOrigins": [
            "https://cloud.uipath.com"
        ],
        "ExposeHeaders": []
    }
]
```

##パターン3. S3からファイルを操作する
S3からフォルダとファイルを作成してみます。
フォルダ「C」にファイル「Book1.xlsx」を入れると、Orchestratorには、フォルダ「C」とファイル「C\Book1.xlsx」が追加されました。
![S3からアップロード1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/d7e14fe2-1649-ed86-9e91-7070c4ad77c5.png)
![S3からアップロード2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/ef90d6b2-59d6-3f6a-5b48-c972f922e182.png)
ロボット、Orchestratorからアップロードする方法と違い、フォルダだけのレコードがストレージバケットに作られてしまうみたいです（実質、ゴミのようなレコードが残ってしまいます）。Orchestratorからフォルダをダウンロードをしようとすると、当然エラーになります。削除もOrchestratorからはできませんでした。
![S3からアップロード3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/eaf406fa-c880-3cdb-bbdd-d874df822712.png)

#さいごに
特定のS3バケットだけ使用できるようにしたりするには、IAMポリシーのカスタマイズなど更に勉強しないといけないことはありますが、デフォルトで使用するだけなら簡単に設定できました。
S3と連携することで、ログのS3保管などの機能が簡単に実現できそうだと思いました。