この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
こんにちは、最近は真冬日続きで肩こりが辛い佐々木です。
今回は前から気になっていたApache Guacamoleに触ってみました。
Apache Guacamoleとは
Apache Guacamoleはブラウザベースのリモートデスクトップクライアントです。 HTML5対応のブラウザからリモートのコンピューターにRDP、VNC、SSHなどのプロトコルで接続し操作することができます。
アーキテクチャ
Guacamoleは下記のようなアーキテクチャになっています。(図は公式サイトより引用)
- servlet container : ブラウザからのアクセスを受け付けてguacdを経由してリモートデスクトップセッションを作成します
- guacd: リモートのコンピューターとのRDPやVNCのセッションを担当するプロセスです
- (mysql or postgresql): 図中にはないのですが、接続情報や、認証情報などを保存するために使用します
AWS上で使うならこんな感じ
Guacamoleのことを知った時すぐに下記のようなアーキテクチャが思いつきました。
ELB経由でGuacamole Serverにアクセスすることで、次のメリットがあります。
- リモートデスクトップ先のインスタンスをプライベートなサブネットに配置できる
- RDP GatewayやSSHトンネリングが必要ない、一度設定してしまえばブラウザからアクセスできる
- Certificate ManagerのSSL証明書を使えば安全にアクセスできる
メンテナンス対象のWindowsサーバが多いけれどインターネットアクセスはさせたくない、しかしRDPゲートウェイを構築するのは面倒という場合にマッチするのではないでしょうか。
環境構築
ではこの構成で環境構築してみます。下記の手順の一部についてざっくり説明していきます。 (なお接続先としてWindows Server 2012 R2インスタンスが構築済みの前提です)
- ec2インスタンス(Amazon Linux)上のdockerサーバとdocker-composeをインストールする
- Guacamole Serverを起動する
- ALBを構成する
docker/docker-composeのインストール
公式ドキュメントや他のwebサイトで紹介されている手順で問題なくインストールできます。 今回使用したコマンドを掲載しておきます。
# dockerをインストール
sudo yum -y update
sudo yum -y install docker
sudo chkconfig docker on
sudo service docker start
# ec2-userでもdockerコマンドを実行可能にする
sudo usermod -a -G docker ec2-user
# docker-composeをインストール
sudo curl -L https://github.com/docker/compose/releases/download/1.17.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
Guacamole Serverを起動する
Guacamole ServerはDocker Composeを使って起動します。下記のファイルを作成します 使用している各イメージの詳細はGuacamoleのドキュメントおよびmysqlのドキュメントを参照してください
docker-compose.yml
.env
mysql/data # mysqlのデータファイル保存ディレクトリ
mysql/init/initdb.sql #データベース初期化スクリプト
docker-compose.yml
version: "3"
services:
guacd:
image: guacamole/guacd:latest
expose:
- "4822"
guacamole:
image: guacamole/guacamole:latest
ports:
- "8080:8080"
environment:
- MYSQL_HOSTNAME=mysql
- GUACD_HOSTNAME=guacd
env_file: .env
mysql:
image: mysql/mysql-server:5.7
volumes:
- "./mysql/data:/var/lib/mysql"
- "./mysql/init:/docker-entrypoint-initdb.d"
expose:
- "3306"
ports:
- "3306:3306"
env_file: .env
.env
MYSQL_DATABASE=guachamole
MYSQL_USER=guachamole
MYSQL_PASSWORD=guachamole
envファイル内のDB、ユーザー名、パスワードは任意のものに変更してください。
initdb.sql
initdb.sqlファイルは下記のコマンドで生成できます(生成済みのものもgistに貼っておきました)
docker run --rm guacamole/guacamole /opt/guacamole/bin/initdb.sh --mysql > initdb.sql
起動する
ファイルが揃ったら一旦guacamoleを起動してみましょう。起動後にdocker-compose ps
で状態を確認します。StateがUpになっていれば起動中です。
ちなみにdocker-compose logs
で各コンテナのメッセージ出力を表示できるので問題があるときに参照しましょう。
docker-compose up -d
docker-compose ps
Name Command State Ports
---------------------------------------------------------------------------------------------------
guachamole_guacamole_1 /opt/guacamole/bin/start.sh Up 0.0.0.0:8080->8080/tcp
guachamole_guacd_1 /usr/local/sbin/guacd -b 0 ... Up 4822/tcp
guachamole_mysql_1 /entrypoint.sh mysqld Up 0.0.0.0:3306->3306/tcp, 33060/tcp
ALBを構成する
下記の設定でALBを構成します。ターゲットとしてGuacamole Serverを指定します。
ターゲットグループ
プロトコル: HTTP
ポート: 8080
維持設定(sticky session): 有効
ヘルスチェックプロトコル: HTTP
ヘルスチェックポート: トラフィックポート
ヘルスチェックパス: /guacamole
ロードバランサー
リスナー: HTTPS:443 -> 上記のターゲットグループ(8080)
動作確認
ここまで済んだらブラウザからGuacamoleにアクセスしてみましょう。
ALBのDNS名に下記のようにguacamole
というパスを加えます。
https://XXXXXXX.ap-northeast-1.elb.amazonaws.com/guacamole
図のようなログイン画面が表示され、下記のアカウントでログインできれば動作確認は完了です。
ユーザー名: guacadmin
パスワード: guacadmin
長くなってきたので今回はここまでにします。 次回はRDPでWindowsインスタンスに接続してみます。