[UiPath] オンプレ版Orchestratorのデータベースを別サーバーに移行する手順

# 前提
| 使用した環境 | バージョン　|
| -------     | -----      |
|       IIS      |     Windows Server 2019 Standard Edition        |
|    SQLServer         |  Windows Server 2012 Standard Edition / SQL Server 2016 Standard Edition(64-bit)           |
|   Orchestrator          |      2020.10.11       |

# イントロ
- 今回想定するのは、例えば下記のようなケースです。本記事では、このうち4.の手順を説明します。
    1. 開発環境に新規でIISサーバ[^1]とSQLサーバ[^2]を構築する。
    1. 構築したIISサーバに、Orchestratorを新規インストールする。
    1. 開発環境のIISサーバを、本番昇格させる。[^3]
    1. 本番に上がった新IISサーバに、現行のDB[^4]を繋げる。**←ここを説明します。**
- これを試すまで、OCに出自の異なる（別のインストーラーで作られた）DBを繋げるってできるのかな？と思ってましたが、できました。
- やることは、おおまかにいうと下記の３つです。
    1. OCの設定ファイルから、繋ぎ先のDBを変更する。
    1. DBのOAuth関連のテーブルを修正し、RedirectUriを新IISサーバのURLに合わせる。
    1. OCの設定ファイルに書かれたOAuthのClientIdを、現行DBで設定された値に合わせる。
   
# 関連するドキュメント
- [【OC】Orchestratorのデータベースを別サーバーに移行する手順を教えてください](https://forum.uipath.com/t/oc-orchestrator/488822)
- [Orchestrator/Identity Server の URL を変更する](https://docs.uipath.com/ja/orchestrator/standalone/2020.10/installation-guide/changing-the-orchestrator-identity-server-url)
- [[UiPath] オンプレ版OrchestratorでURL変更＆証明書差し替え](https://qiita.com/nakawodayo/items/2dfac6e4714201f7f6b0)

# 手順
### OCの設定ファイルから、繋ぎ先のDBを変更する。
1\. IISを停止する。

2\. UiPath.Orchestrator.dll.config (C:\Program Files (x86)\UiPath\Orchestrator) を修正する。ConnectionString(SQL database 名や SQL ホスト名)を移行先データベースサーバのものに修正。

```
<connectionStrings>
<add name="Default" providerName="System.Data.SqlClient" connectionString="Data Source=DatabaseServerName;Initial Catalog=UiPath;User ID=********;Password=******" />
</connectionStrings>
```

:::note info
"DatabaseServerName"は、IPアドレスでも可。（RDSの場合、エンドポイントを記述する。）
:::

3\. appsettings.Production.json（C:\Program Files (x86)\UiPath\Orchestrator\Identity）を修正する。同じく、ConnectionStringを移行先データベースサーバのものに修正。

4\. appsettings.Production.json（C:\Program Files (x86)\UiPath\Orchestrator\Webhooks）を修正する。同じく、ConnectionStringを移行先データベースサーバのものに修正。

### DBのRedirectUriを、新IISサーバのURLに合わせる。
5\. SSMSでidentity.ClientRedirectUris テーブルを開き、https://**[OldOrchestratorAddress]**/signinsystemopenidconnect の値を持つ [RedirectUri] フィールドを探す。
   ⇒デフォルトだと、Id=2,5の2件。（Id=2は「http://」なので、手順的には変えなくてもいいのかもしれませんが、今回は変えました。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2254418/5758bef1-a543-6177-5fc0-c91926eeb9c4.png)

6\. 下記のクエリを実行し、https://**[NewOrchestratorAddress]**/signinsystemopenidconnect に変更する。

	UPDATE [UiPath].[identity].[ClientRedirectUris] SET RedirectUri = 'http://[NewOrchestratorAddress]/signinsystemopenidconnect' WHERE Id = 2;
	UPDATE [UiPath].[identity].[ClientRedirectUris] SET RedirectUri = 'https://[NewOrchestratorAddress]/signinsystemopenidconnect' WHERE Id = 5;

7\. 値が正しく書き換わっていることを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2254418/997b015c-882e-969a-c3eb-2465f5b3b611.png)

8\. identity.ClientPostLogoutRedirectUris テーブルを開き、https://**[OldOrchestratorAddress]**/ の値を持つ [PostLogoutRedirectUri] フィールドを探す。
⇒デフォルトだと、Id=3,4,5,8の4件。（Id=5は「http://」なので、手順的には変えなくてもいいのかもしれませんが、今回は変えました。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2254418/86868d60-1a06-ff71-49ca-0f8290f3c635.png)

9\. 下記のクエリを実行し、https://**[NewOrchestratorAddress]**/ に変更する。

	UPDATE [UiPath].[identity].[ClientPostLogoutRedirectUris] SET PostLogoutRedirectUri = 'https://[NewOrchestratorAddress]' WHERE Id = 3;
	UPDATE [UiPath].[identity].[ClientPostLogoutRedirectUris] SET PostLogoutRedirectUri = 'https://[NewOrchestratorAddress]/' WHERE Id = 4;
	UPDATE [UiPath].[identity].[ClientPostLogoutRedirectUris] SET PostLogoutRedirectUri = 'http://[NewOrchestratorAddress]/' WHERE Id = 5;
	UPDATE [UiPath].[identity].[ClientPostLogoutRedirectUris] SET PostLogoutRedirectUri = 'https://[NewOrchestratorAddress]/account/login' WHERE Id = 8;

10\. 値が正しく書き換わっていることを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2254418/43db1829-4df6-8b1d-e3a9-d58f3581fdfe.png)

### OAuthのClientIdを、現行DBで設定された値に合わせる。
:::note warn
ポイント
OCに出自の異なる（別のインストーラーで作られた）DBを繋げる場合、この手順が必要です。
:::
11\. identity.Clients テーブルを開き、ClientName = "Orchestrator.OpenId"のClientIdを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2254418/fc25e526-378b-2914-ad7f-3a749c603ed3.png)

12\. UiPath.Orchestrator.dll.config (C:\Program Files (x86)\UiPath\Orchestrator) を修正する。"ExternalAuth.System.OpenIdConnect.ClientId"で検索し、valueを11で確認したClientIdに修正する。

13\. IISを起動する。

## トラブルシューティング
- dll.config上のClientIdと、DB上のClientIdが一致していないと、下記のエラーが発生します。

>  {"Error":"unauthorized_client", "ErrorDescription":"Unknown client or client not enabled", "RequestId":"xxxxxxxxxx", "ClientId":"xxxxxxxxxx"}

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2254418/56988a17-26be-114d-3d60-427b36446858.png)


[^1]: 今回はAWS EC2上に構築。
[^2]: 同じくAWS EC2。
[^3]: EC2なのでAMIから複製しました。
[^4]: 今回はAWS RDSで試しました。EC2上のデータベースをRDSに移行する手順はまた後日まとめます・・・。