プライベートネットワークにあるリソースへのリモートアクセスするにあたりどんな方法が一般的でしょうか。
10年前はVPN全盛で、社外からのアクセスにIPSecやPPTPなどが用いられていました。しかし、現在リモートアクセスを提供するなら、Remote Desktop Serviceを利用することが多いでしょう。幾つか理由がありますが、SSLでのアクセスは制御しやすく便利なものです。
さて、便利なRemote Desktop Serviceですが、サーバーを持つと当然の如く1つのエンドポイントに対して冗長化されていることが期待されます。今回は、AWS Elastic Load Balancingで、透過的に社外からの社内リソースアクセスを提供してみましょう。
環境設計
Remote Desktop Service (以下RD Service) に関して、以下の環境を考えましょう。
| ポイント | 概要 |
|---|---|
| アクセスURL | rdweb.example.com というレコードで External ELB の Aレコード Alias を公開しておきます。ユーザーがリモートデスクトップするために利用するアドレスはこれです。 |
| MultiAZ | RD Service を EC2 に構築する際は、MultiAZ になるようにしておきます。 |
| ELB | ELB は、ぶら下がったRD Service のEC2の死活監視とバランシングを行う役割です。外からのエンドポイントは ELB 一本になるので、Internet facing で作成します。また、リクエストをバックエンドにパススルーするため、SSLではなく TCP 443 で設定します。 |
| RD Service | RD Service は、EIP を付与して、Route53 で公開しておきます。 |
ざっくりと以下の構成ですね。

接続方式
一言にRemote DesktopといってもRemote Desktop Serviceで提供する方法が複数あります。
- Remote Desktop Web Access (RD Webアクセス)
- Remote Desktop Gateway (RDゲートウェイ)
今回紹介するのは、RD Web アクセスを用いたRemote Desktopとその冗長化です。RDゲートウェイは、ELBを用いた冗長化ができないためご注意ください。
説明の省略
RDSサーバーを立ててEIPを振るのは省略します。DSCでも使って楽に構築してください。
https://www.powershellgallery.com/packages/cRemoteDesktopServices/1.0
https://www.powershellgallery.com/packages/xRemoteDesktopSessionHost/1.1.0.0
https://www.powershellgallery.com/packages/xRemoteDesktopAdmin/1.1.0.0
構築
とりあえずさくっと構築しましょう。
EC2は立ててあるという前提で、ELBとRoute53のレコードをさくっと作ります。
ELB の作成
Internet facingで、ELBを作成してください。ListerはTCP 443でLoad Balancer Protocol/Instance Protocolを設定します。
これが構成の要です。くれぐれもSSLやHTTPSにしないでください。SSLのターミネートも持っての他です。

pingもTCP 443です。

作成したら、続いてRoute53です。
Route53
ELBのA Record Alias、あるいはCNAMEを作成します。(ここでは仮にguitarrapc.comのドメインとします。)

合わせて、RD Serviceのサーバー2つに付与したEIPでAレコードも作っておきます。

RD Web への RemoteDesktop の公開
RD Webから内部リソースにリモートさせるため、Remote DesktopをRemote Appとして公開します。

RD Webで表示されればokです。

Remote Desktop Gatewayが本構成では使えないように、RD Webからのリモートデスクトップはできませんので使わないようにします。

接続
さて、あとは繋いでみましょう。Private LANではなく、WAN越しにRoute53で作成したrdweb.expample.comにアクセスしてみます。
Remote Desktop接続をクリックしてダウンロードしたら
![]()
ドメインユーザーの認証を入れます。

無事にRemoteAppの認証が通れば、RD Webサーバーとつながったというトースト通知がきます。

あとは、アクセス先のサーバーを指定して、ログインしてみます。今回は適当にRD Webのサーバーにアクセスします。

サーバーにログインできましたね。

もちろんServer1とServer2がラウンドロビンされますし、Server1接続できないようにStopするとServer2につながります。
ELBで冗長化されると生存監視を任せられるので楽ちんです。
まとめ
今回は、ELBを用いることでRD Webサーバーの死活監視、冗長化を行いました。個別のサーバーに直接アクセスよりも圧倒的にいいです。ただ、ELBの性質上、アクセスのたびにアクセスが分散されます。その時は接続処理を繰り返せば問題ありません。ここで紹介した内容は全部SDKやPowerShellでさくっと自動化できますし、Cloud Formationを使うのもいいでしょう。
同じ要領で、ADFSのWeb Application Proxyも冗長化したり、ADFS自体も冗長化できるのでお試しください。基本的には、AWSだけではなく環境選ばず、AzureやGCPでも同様に構成できます。
RD GatewayがELBと相性悪く、接続が確立できたりできなかったりするので、RD Webは間違いないことから推奨しておきます。