EC2で構築したUiPath Orchestrator サーバを、自己署名じゃない証明書でSSLで公開する(Certificate ManagerとELBを使用) 


## イントロ

UiPath Orchestrator を構築するにあたって、久しぶりにEC2でSSL証明書を取って環境構築したので、そのときの備忘。

タイトルは UiPath OrchestratorサーバをSSLで公開するってなってますが、実際はOrchestratorに特化した話ではなく一般的なEC2サーバのSSL公開の話って感じです。

## 前提

- ドメインを持っている(example1.xyz としました)
- そのドメインは、AWSのRoute 53で管理している
- UiPath Orchestratorが、AWS上のEC2で(WindowsサーバのIIS上で)ポート443ですでに動いている
- 今時点では Orchestratorサーバ(以下Orchサーバ)へは https://[IPアドレス]/ でアクセスしている
- 保守のためそのEC2サーバへは 443の他RDP(ポート3389)やKibana(ポート5601)も許可している
- Orchestratorが動くIISサーバは、SSL証明書が自己署名証明書なので、ちゃんとした証明書を用いるようにしたい
- 監視とか冗長構成とかは、とりあえず今回は省略

記事開始時点を図示するとこんな感じ。
![aws0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/4b29d1bd-6ef7-5fb5-ff96-dc90330fca99.png)

さてさて今回、UiPath Orchestratorを自己署名証明書で構築するところは省略していて、すでに構築済みとしています。そのOrchサーバを自己署名じゃない証明書で公開するのに

- 証明書を正規に取得して自己署名証明書から置き換え Orchサーバをそのまま外部に「 https://orch.example1.xyz 」などで公開

してもよいのですが、今回は

- Orchサーバの手前にELB(Elastic Load Balancer)を置いて、AWS上で無料で取得できるSSL証明書を用いる

ことにしました。ELBは特定のネットワークからのポート443への接続のみ許可するモノとします。
図示するとこうです。
![aws.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/1b58547d-eb58-4625-edb0-129d61861f1a.png)


### ほんとはSSLをほどいてルーティングしたい、、

ELBでSSLをほどいて IISにはHTTPのポート80で流したかった件、、[最後に注記しました。](https://qiita.com/masatomix/items/e220d09f5de1341e0494#%E3%81%BB%E3%82%93%E3%81%A8%E3%81%AFssl%E3%82%92%E3%81%BB%E3%81%A9%E3%81%84%E3%81%A6%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%97%E3%81%9F%E3%81%84%E5%BE%8C%E8%BF%B0)



## やってみる


さて構築の流れとしては、

- [AWSのCertificate ManagerでSSL証明書をあらかじめ取得しておき](https://qiita.com/masatomix/items/e220d09f5de1341e0494#certificate-manager%E3%81%A7ssl%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%82%92%E3%81%82%E3%82%89%E3%81%8B%E3%81%98%E3%82%81%E5%8F%96%E5%BE%97)
- [ELBが使用するターゲットグループを作成](https://qiita.com/masatomix/items/e220d09f5de1341e0494#elb%E3%81%AE%E6%A7%8B%E7%AF%89%E3%81%AE%E5%89%8D%E3%81%AE%E3%82%BF%E3%83%BC%E3%82%B2%E3%83%83%E3%83%88%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E4%BD%9C%E6%88%90)
- [ELBを構築してSSL証明書を配置](https://qiita.com/masatomix/items/e220d09f5de1341e0494#elb%E3%81%AE%E6%A7%8B%E7%AF%89application-load-balancer%E3%81%AE%E4%BD%9C%E6%88%90)
- [最後にELBのサーバ名をAWS Route 53(DNSサービス)で名前解決](https://qiita.com/masatomix/items/e220d09f5de1341e0494#elb%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%90%E5%90%8D%E3%82%92aws-route-53dns%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%A7%E5%90%8D%E5%89%8D%E8%A7%A3%E6%B1%BA)

すればよさそうです。ついでに同じELBを用いて

- [URL違いでElasticsearchサーバに処理を転送する設定(別記事)](https://qiita.com/masatomix/items/e220d09f5de1341e0494#url%E9%81%95%E3%81%84%E3%81%A7elasticsearch%E3%82%B5%E3%83%BC%E3%83%90%E3%81%AB%E5%87%A6%E7%90%86%E3%82%92%E8%BB%A2%E9%80%81%E3%81%99%E3%82%8B%E8%A8%AD%E5%AE%9A)

も入れてみます。


### Certificate ManagerでSSL証明書をあらかじめ取得
[AWS Certificate Managerを使って無料でSSL証明書を発行する](https://qiita.com/masatomix/items/7c90f1a625c736af5a81) にまとめました。証明書取得まではそれで行けると思います。

### ELBの構築(の前のターゲットグループ作成)

ELBは処理を転送するのに、ターゲットグループというEC2インスタンスのグルーピングを用います。今回 Orchサーバのインスタンスをもつグループ「orch」と、あとで使うElasticsearchサーバのインスタンスをもつ「ela」というグループを作成します。先の図のココです。

![pic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/f98c0748-e067-5755-9a1b-fc0407412956.png)


EC2 >> ターゲットグループ を表示して「ターゲットグループの作成」をクリック。
![o01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/f2119ea5-210a-74c7-534a-eb8c2fba4f86.png)

今回はELBから、そのままHTTPS(ポート443) で待ち受けているIISサーバに転送するので、**プロトコルはHTTPS、ポートは443**とします。IISサーバではHTTPで待ち受けている場合は、プロトコルはHTTP、ポートはIISのポート(通常80かな)を設定します。
![o02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/5427a192-16f6-598d-96d6-382f4b726133.png)

作成が完了したら「閉じる」をクリック。
![o03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/b8a3c024-ec11-390a-3f61-859ef0c04979.png)

つづいてターゲットグループにOrchサーバを登録するため「編集」をクリックします。
![o04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/49b9ed48-4717-988f-aa98-0fe17670de34.png)

Orchestratorサーバを選択して「登録済みに追加」をクリック。待ち受けるポートをインスタンスごとに個別に指定出来ますが、今回はターゲットグループに指定したポートと同じなのでそのままでOK。
![o06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/b6168bb3-32ec-f656-478d-f4a40f09c2a9.png)

上に追加されたので、「保存」をクリック。
![o07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/d5298fc0-6133-3114-9e64-0684a99fa3a6.png)

保存されました。
![o08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/28b089e9-677a-4ad2-aec5-74d3214ee150.png)

同様に、ela のターゲットグループも作ります。違うところは、ELBがHTTPSで受けた後、こちらのターゲットグループにはHTTPでポート5601でルーティングしますので、そのように設定します。
![o09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/562cc03c-6a23-d765-e7ce-52aba8a8204f.png)

ターゲットグループへのElasticsearchサーバの登録も忘れずに。。
![o10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/3c363c6b-9204-bcad-ff85-3128b7c206dd.png)

保存できました。
![o11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/cda40ea3-c272-31aa-86d2-eeb434ffa7a7.png)


以上で、各ターゲットグループの作成は完了です。

### ELBの構築(Application Load Balancerの作成)

つづいて、主役のロードバランサの作成です。
![l01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/215bc5e7-ab6d-41dd-401d-5f1169d8a6b1.png)

Application Load Balancerを選択。
![l02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/5dbdb354-8df5-b2e7-2bef-50b7d1f5ebb7.png)

今回はHTTPSのみを受け付けるので、HTTPS/443を選択。アベイラビリティゾーンはとりあえず、自分が持ってるサブネットを指定しておきましょう。
![l03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/cbcaa024-bce2-b5c4-bf88-80063e9f5ca2.png)

SSLの設定です。すでにさきほど作成済みであれば、ココに証明書として出てくるはずなのでそれを選択して次へ。
![l04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/4b5ba060-3ef6-43a7-82be-bb60f679ce02.png)

ELBが属するセキュリティグループについて、グループはELB用に新規に作成します。このグループは外部からアクセスされるところになるので慎重に。今回はOrchestratorサーバを構築する記事なので**あるIPアドレスたちからのポート443への接続のみ**を許可する設定としていますが、広く公開する場合は「任意の場所」を選択しましょう。
![l05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/9707e3c5-00ff-d7d5-67f1-cdae95ea4650.png)

さて、ルーティングするターゲットグループを指定します。まずはシンプルに、全てのリクエストを「orch」グループにルーティングするように設定します。
のちに「 https://ela.example1.xyz/ 」へのリクエストはSSLをほどいて別のグループ「ela」にルーティングさせますが、あと回しで。
![l06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/5d7f1b14-5e8b-5fbe-2b9f-0b5b47e48e98.png)

インスタンスとポート番号を確認します。
![l07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/27c51dab-8ae7-3769-7e7c-dfd1c4fc74bd.png)

最終確認。よければ「作成」をクリック。
![l08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/25c32e4d-bc46-55ef-6e9f-86b8a1f5446f.png)

おお、作成できたようですね。
![l09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/48bb5499-93ae-0cb6-88a3-850d9eb93be8.png)


一覧に戻ってみると、確かにELB001というロードバランサが作成できています。下の詳細にDNS名が表示されていますが、このサーバ名がロードバランサに割り振られたサーバ名になります。あとでもっとわかりやすいエイリアスをつけますが、これでアクセスできるようになったということですね。
![l10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/e85cd596-5eb7-83e8-9eb9-2794067cf161.png)

ここまででほぼ、ELBの構築は完了です。

### ELBのセキュリティグループ → EC2のグループへの通信許可

つづいて上記のセキュリティグループのリンクをクリックして、ELB側でなくEC2インスタンス達側のセキュリティグループの設定を変更します。
![sec.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/5af7def5-e681-2943-755f-3d6a271e028f.png)


このままでは**ELBからの接続が許可されていないことになる**ので 、**ELBのセキュリティグループからEC2側のセキュリティグループへ、HTTPSのためのポート443と、Elasticsearch/Kibanaのためのポート5601 への通信を許可**します。また下記のイメージの下から3つめ、元々あったHTTPS/443への直接通信はホントは削除した方がよいでしょう。EC2インスタンス直接アクセスは遮断し、ELBからのアクセスに限定するほうがよいからですね。
![l11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/927a9e6c-0224-7c12-c77d-aba12e6e8d31.png)

### いったん疎通確認

さてさてELBからのルーティングやセキュリティグループによる通信設定もできたので、いったんブラウザで **https://[長いELBのDNS名]/** へアクセスしてみましょう。

![l12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/668d8d77-fcf1-7a67-d0c7-cefddc67d2a5.png)

おなじみのUiPath Orchestrator画面が表示されましたねーー。。今のところ、サーバ名が証明書のCommon Nameと不一致のためSSL的にはエラーになってますが、アクセス自体はできるようになりましたね。

いやー記事にすると長くなりました。。


### ELBのサーバ名をAWS Route 53(DNSサービス)で名前解決

さてさて、あとすこし。
先ほどの長ーいELBのサーバ名を、たとえば orch.example1.xyz とか ela.example.xyz などでアクセスできるよう、DNSサービスで名前解決します。

Route 53にアクセスして、該当ホストゾーンの設定画面を開き「レコードセットの作成」をクリック。
![d01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/040d141e-f634-ef24-b782-171ee4eeae2b.png)

名前に「orch」、エイリアスを「はい」にするとエイリアス先に、ELBのレコードが選択出来るようになるので、それを選択し「作成」をクリック。
![d02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/11260bac-94cc-733c-4ea8-e5e6baaca9ee.png)


レコードが追加されました。簡単ですね。
![d04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/9efc391c-7d9e-3b3f-2745-0e02295078a0.png)

さてさて「 https://orch.example1.xyz/ 」 でアクセスしてみましょう。
![d05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/ad390f21-f4a6-aebc-8569-743887a5109d.png)



表示されましたねーー。。
サーバ名がSSL証明書のCommon Name: *.example1.xyz と一致しているため、先ほどのELBのサーバ名の時は発生していた証明書が不正っていうエラーも、今回は出ていない状態になりました！


最後に、ついでに同じ設定で「ela」というサーバ名も追加しておきます。

![d06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/abc7b50f-3381-111c-e9bc-dfd7746e0114.png)


### URL違いでElasticsearchサーバに処理を転送する設定

最後に、Elasticsearchサーバのルーティングと疎通つまり 「 https://ela.example1.xyz へのアクセスは、Elasticsearch/Kibana サーバにHTTPでポート5601へルーティングする」という設定が入ってないのですが、長くなったので別記事にしました。

- [[別記事]EC2とELBで、URLごとに別のサーバにルーティングする](https://qiita.com/masatomix/items/b311eaac67440406d0e5)



おつかれさまでした。


### ほんとはSSLをほどいてルーティングしたい(後述)

**-- 2019/07/07追記 --**
ちなみに本当は、**ELBでSSLをほどいて IISにはHTTPのポート80で流したかった**のですができていません。**UiPath OrchestratorのインストーラがIIS上にSSL付きで構築してくれてしまう**のと、さらには**URL Rewrite機能を用いて HTTPアクセスをHTTPSにリダイレクトまでしてくれていて**、、、、これらをオフってIIS上にHTTPのOrchestratorを構築する手順が明確でなかったからです、、、。バインドを80に替えて、URL RewriteをすべてDisableにすれば行けるのかもしれませんが未検証ですorz。

**-- 2019/07/07追記2 --**
バインドをポート80を追加して、URL RewriteをOFFにしてみたのですが、
![add02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/d2850d4a-20cd-9286-90fd-8db9e299d4e2.png)

![add01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/21b587d6-4c08-cd29-60d8-6be036ef1bd9.png)

おお、Web画面も動くしなんかうまくいってそうな感じ、、、とおもったら、PC上からのロボットトレイからの接続・切断がNGに、、┐('〜`;)┌。。
![add03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/eea2c631-da7f-73ca-378c-788dd8294d46.png)

検証はまた後日かな、、、。
**-- 2019/07/07追記 以上 --**


**-- 2019/07/08追記 --**
うーん、どうしてもELB経由だと、Robotからの接続だけうまくいきませんね、、。というわけで、ロボット接続向けのURLを用意し、それはSSLのままIISにルーティング、それ以外のアクセスはHTTPでルーティング、ってやってみました。これには上記の[URLごとに別のサーバへのルーティング](https://qiita.com/masatomix/items/b311eaac67440406d0e5)する機構を用いてみました。

![elb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/27826026-0025-732b-1b4b-b8d7be32980c.png)

うまくいきました。
![robo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/4356c3ef-e72c-2bac-c1e2-de85a5522777.png)

なんかもう、コレジャナイ感がハンパないんですが、、、。

追記追記でクシャクシャになってしまったので、いつか記事にしようかと思います
**-- 2019/07/08追記 以上 --**


**-- 2019/07/15追記 --**
記事にしました。
[ELB(SSL)の内側に配置したEC2のUiPath Orchestrator(IISサーバ)をポート80で運用したい→ 妥協](https://qiita.com/masatomix/items/33be7e4e1d3eadc49918)

**-- 2019/07/15追記 以上 --**


## 関連リンク

- [ALBのHost-based routingを試してみた](https://dev.classmethod.jp/cloud/aws/tried_hostbased_routing/)
- [AWS Certificate Managerを使って無料でSSL証明書を発行する](https://qiita.com/masatomix/items/7c90f1a625c736af5a81)
- [UiPath Orchestrator向けのElasticsearch/Kibanaの構築メモ](https://qiita.com/masatomix/items/91c7d056f484e3fa42a3)
- [UiPath社 ナレッジベース](https://www.uipath.com/ja/resources/knowledge-base)
- [【AWS】とっても便利な’Amazon Route53’のエイリアス機能を利用してロードバランサ(ELB)を設置してみました！](http://kawatama.net/web/1157)
- [Application Load Balancerで設定する4種類のポート番号の意味を理解しよう](https://dev.classmethod.jp/cloud/aws/aws-alb-port/)
- [EC2とELBで、URLごとに別のサーバにルーティングする](https://qiita.com/masatomix/items/b311eaac67440406d0e5) 次の記事