ELB(SSL)の内側に配置したEC2のUiPath Orchestrator(IISサーバ)をポート80で運用したい→ 妥協


目次

概要

EC2で構築したUiPath Orchestrator サーバを、自己署名じゃない証明書でSSLで公開する で注記していた件です。

現状

いま時点の構成は以下の通りです。 ELBからUiPath Orchestratorサーバ(IISです)へのルーティングは、ポート443のHTTPSとなっています。

理想

しかし、UiPath OrchestratorサーバはELBの内側に配置されています。したがってパフォーマンスの観点からも、ELBでSSLをほどくことでIISはポート80だけで待ち受けるようにしたいですよね。。

つまり、理想はこうです。

今回のテーマはコレです。結果うまくいかなくて妥協案に落ち着くのですが (´Д`;)。。

やってみる

ELBでSSLをほどいて IISにはHTTPのポート80で流すということですが、以下の制約というか前提が。。

  • UiPath OrchestratorのインストーラがIIS上にSSLで構築してくれてしまう
  • URL Rewrite機能を用いて HTTPアクセスをHTTPSにリダイレクトしてくれる

したがって、これらもふまえて以下の対応を行います。

さてやってみます。

IISのバインド設定を 443 → 80へ変更

RDPでIISサーバにログインし、スタートメニューで「IIS」といれて、設定画面を開きます。

「バインドの編集」を選択し、

追加をクリック

種類が「http」であることを確認し、ホスト名を「*」にしてOKをクリックし、ポート80をバインドします。(タイトルは 443→80へ変更すると書いてるんですが、あとのことをかんがえて、443も残しておきましょう :-))

ポート80が追加されました。

IISを再起動して作業完了です。

URL Rewrite機能をDisableにしてしまう

つづいてポート80に来たら443に転送するという機能、URL Rewriteの機能を停止します。

URL Rewiteを右クリックし「機能を開く」を選択

まずはInboundのルールを右クリックし、「Disable Rule」をクリック。

色が薄くなって、Disableされたことがわかります。つづいてOutbound側も同様に。

2つありますが、どちらもDisableにしましょう。

一応、IISサーバを再起動して、作業完了です。

orchhttpという「ポート80(HTTP)で受信する」ターゲットグループを追加/Orchサーバを追加

さてさてIISサーバでポート80でOrchestratorが接続可能になったので、ELBがそちらに接続するためのターゲットグループを作成します。
やりかたはUiPath Orchestrator サーバをSSLで公開する と同じです。

追加出来たらこんな感じになるとおもいます。

ELBのルーティング設定を、orch → orchhttp へ変更

最後に、ELBに来たときにデフォルトではorchグループに転送していましたが、そのデフォルト値をorchhttpへ変更します。

ロードバランサー >> リスナー >> 「ルールの表示/編集」をクリック

上の編集ボタンをクリック

最後、の編集ボタンをクリック

then の編集ボタンをクリック

転送先に「orchhttp」を選択し、

チェックボタンをクリック

最後に「更新」をクリックしたら

転送先が変更されました。

ELBのセキュリティグループから、EC2インスタンスのセキュリティグループへポート80を許可する

さいごに ELBのグループからEC2のインスタンスが属するセキュリティグループへ、ポート80の通信許可をしてあげてください。

疎通確認。。WEBからの接続はOK、Robotの接続がNGという。。

さてWEB画面を開いてみます。URLは https://orch.example1.xyz/ でした。、、、、表示されますねー!

ホントにHTTPSがほどかれて、HTTPでルーティングされているかな?ということでIISのログを確認してみます。場所は、
C:\inetpub\logs\LogFiles\W3SVC2\ です。

確認してみると、、、おお、確かにポート80で繋いでいるというログが出力されています。

2019-07-14 15:11:47 172.31.34.47 GET /odata/Users/UiPath.Server.Configuration.OData.GetCurrentPermissions - 80 ...
2019-07-14 15:12:05 172.31.34.47 GET / - 80 - 172.31.3.121 ELB-HealthChecker/2.0 - 302 0 0 10

HTTPSをそのままルーティングしていたときは、、うん443というログが出力されています。

2019-07-14 15:14:08 172.31.34.47 GET /odata/Users/UiPath.Server.Configuration.OData.GetCurrentPermissions - 443 ...
2019-07-14 15:14:32 172.31.34.47 GET / - 443 - 172.31.3.121 ELB-HealthChecker/2.0 - 302 0 0 13

つづいて、PCのロボットトレイからの接続・切断ですが、、、うーん、まさかのNGです、、┐('〜`;)┌。。

うーん、色々調べたのですが、ダメでした。。。ロボット接続には何かしら特殊なプロトコルが使われてるのかもしれません(すいません力尽きました)。。

2019/12/18追記:
ロボット接続・切断について電文を確認しようとプロキシ設定をいろいろいじってみたのですが、記事投稿当初はどうしても電文を見るツール(Fiddlerのことです)をかますコトができませんでした。
が、、下記のツールを使ってようやくその処理用の設定ファイルがわかりました。
C:\Program Files (x86)\UiPath\Studio\UiPath.Service.Host.exe.configみたいです(Enterprise版の場合)。
https://twitter.com/RisaMizushina/status/1206938186754093057
作者の方感謝します!!

妥協案を考える

というわけで妥協案を検討します。

通常のWEBからのアクセスはHTTPS(443)を HTTP(80)へルーティングしつつ、ロボットトレイからの接続のみHTTPSをそのままルーティングする案で行きましょう。

幸い 先の記事によりURLごとにELBが別のターゲットグループにルーティングできる事がわかっているので、

  • ひとつのOrchサーバをHTTPS(ポート443)のターゲットグループorchと、HTTP(ポート80)のターゲットグループorchhttp両方に属させて
  • https://robo.example1.xyz というロボットトレイ用のURLの時は、HTTPSのままorchグループにルーティングする

ことで対応出来そうです。

図にすると下記の通り:

さあ設定です。

と言ってもターゲットグループは既に存在するし、IISのバインド設定も両方残してあるし、、、やるのは「URLがロボット専用の https://robo.example1.xyz のときだけはSSLのままルーティングする」というELBの設定追加と、DNSサーバへの設定追加(roboもELBへ転送)だけですね。

ELBの設定追加( https://robo.example1.xyz のルーティング)

なんどもやってるので、設定後画面だけ。ELBのルーティングのルール画面で、下記の通り設定し保存します。

DNSサーバへの設定追加(roboもELBへ転送)

こちらも、ELBのサーバ名をAWS Route 53(DNSサービス)で名前解決 と同じやり方で。

疎通

さあ疎通です。WEB画面はもちろんOKですね。さいごにロボット接続です。

うまくいきましたねーー。。

いちおう、一応ログをみておきます。

WEBアクセスの出すログ:

2019-07-15 01:37:56 172.31.34.47 GET /odata/Users/UiPath.Server.Configuration.OData.GetCurrentPermissions - 80 ...

ちゃんとポート80で着信しています。

ロボットの出すログ:

2019-07-15 01:38:02 172.31.34.47 GET /signalr/hubs/signalr/negotiate clientProtocol=1.4&connectionData=[%7B%22Name%22:%22SignalrEventHub%22%7D] 443 - 172.31.46.166 SignalR.Client.NET45/2.2.1.0+(Microsoft+Windows+NT+6.2.9200.0) - 200 0 0 2
2019-07-15 01:38:02 172.31.34.47 GET /signalr/hubs/signalr/start clientProtocol=1.4&transport=webSockets&connectionData=[%7B%22Name%22:%22SignalrEventHub%22%7D]&connectionToken=...b4mrzN 443 - 172.31.46.166 SignalR.Client.NET45/2.2.1.0+(Microsoft+Windows+NT+6.2.9200.0) - 200 0 0 2
2019-07-15 01:38:03 172.31.34.47 POST /api/robotsservice/GetProcesses - 443 WINDOWS_m-kino.robotAccount 172.31.46.166 - - 200 0 0 144
2019-07-15 01:38:03 172.31.34.47 POST /api/robotsservice/BeginSession - 443 - 172.31.46.166 - - 200 0 0 205
2019-07-15 01:38:03 172.31.34.47 POST /api/robotsservice/Heartbeat - 443 - 172.31.3.121 - - 200 0 0 236

おお、ポート443で着信していますね!よさそうです。

以上、ながながと環境構築でした。ロボットトレイからの接続だけ別のURLでSSLのままルーティングするという、どうもコレジャナイ感満載ですが、、コレでうまくいくか、しばらく様子見です。

おつかれさまでしたー。

おまけ:ELBへのHTTP着信は、HTTPSへルーティングする

おまけです。IISのURL Rewriteでやっていた、HTTPへの着信はHTTPSへ転送する機能をDisableにしましたが、ELBのルーティングでコレをやっておきましょう。

参考:Webサーバでの実装不要!ALBだけでリダイレクト出来るようになりました!
この情報を参考にさせていただきました!ありがとうございます。

リスナーを追加をクリック。

ポートが80であることを確認し、アクションに「リダイレクト先」を選択。

HTTPSで、ポート443にリダイレクトさせます。後のパラメタも、そのままでよいです。保存をクリックすると、

リスナーが追加されましたー。。

Fiddlerで確認してみると、、、HTTPのリクエストを投げると301が返ってきて、HTTPSへリダイレクトされていますねー。。