natural born minority
これは #インフラ勉強会 の アドベントカレンダー の三日目です。
前日、二日目は「 まみー さんの インフラ勉強会は時間と場所を飛び越える 」でした。
自身はプログラマなので、インフラについては「運用に居たことがある」「クラウドの設計することがある」という立場からの参加ですが、今回は「運用やってると各現場に一つはありそう」な、
「特殊用途の固定作業用端末」
のお話です。
会社と仕事をしてると「内規で使わなければならないWebアプリケーションがある」とかあると思います。
しかもそれが「社内ネットワークからのみアクセス可能」だったり「IPを固定してそこからしかアクセスさせません」だったりすることがありますね。
実際、最近も
という条件なので、以下のような形態で仕事をしていました。
SSH(鍵認証)で入ることが出来るサーバを用意し固定IPを付け、そこを踏み台として「拠点の固定端末」or「(みうらの)自宅の作業PC」から、情報サイト(Webアプリ)にアクセスしていました。
「サイトを見るためのサーバを用意する」というのも手間ですが、改善したかったのは「特殊な設定をした固定端末やPC」の方で、今回はそれを扱います。
ということから「この端末の用意をDockerで出来ないか」と思ってやってみました。
こちらにあります。
https://github.com/kazuhito-m/dockers/tree/master/portforwarding-webbrowsing
この Dockerfile
/ docker-compose.yml
を、ローカルPCで build&run すると、以下のようなことが出来るようになっています。
NoVNC(httpで動くVNCビューア)
により「VNCのデスクトップ」が表示されるfirefox
ブラウザが表示されてるが、設定で「localhost:11080をproxyとするように」なっている固定IPを持った公開サーバ
にhttp/httpsをトンネリング」しているfirefox
に指定したURLは 固定IPを持った公開サーバ
上からhttp/httpsリクエストが投げられ、結果が帰ってくる以下を満たしていることを前提とします。
docker
と docker-compose
がインストールされている前述のソース一式 をダウンロードすると、以下のファイル構造になっていると思います。
.
├ Dockerfile
├ docker-compose.yml
├ resources
│ ├ config.sh
│ └ ssh_tonnering_key.pem
└ scripts
├ boot.sh
└ init_firefox.sh
./resources/config.sh
を以下の通り設定して下さい。
#!/bin/bash
export SSH_KEY_FILE=/ssh_tonnering_key.pem
export SSH_PROXY_PORT=11080
export SSH_HOST=[固定IPを持った公開サーバ]
export SSH_USER=[固定IPを持った公開サーバのログインユーザ]
export SSH_PORT=[固定IPを持った公開サーバのSSHポート]
export BROWSER_DEFAULT_URL=[firefoxにデフォルトで表示したいURL]
./resources/ssh_tonnering_key.pem
に「固定IPを持った公開サーバの秘密鍵ファイル」を指定して下さい。
( ssh -i [秘密鍵ファイル]
のように指定するファイルです。)
以下を実行します。
docker-compose up
しばらくして、ブラウザから http://localhost:6080 を指定し表示すると「設定ファイルの BROWSER_DEFAULT_URL
に指定したページが表示された firefox
の画面」が表示されてくるはずです。
試しに、以下の設定( ./resources/config.sh
)で起動するとします。
export SSH_HOST=[AWSインスタンスのIP(AmazonLinux)]
export SSH_USER=ec2-user
export SSH_PORT=22
export BROWSER_DEFAULT_URL=https://ipconfig.io
デフォルトページの https://ipconfig.io は「リモートホストを表示する」サイトです。
上記設定で docker-compose up
し、 http://localhost:6080 を表示してみます。
(./resources/ssh_tonnering_key.pem
には「AWSインスタンスの秘密鍵」を配置しているものとします。 )
奥のブラウザが「コンテナの内容を表示しているブラウザ画面」ですが、手前のものは「ローカルPC自体のブラウザで https://ipconfig.io を表示したもの」です。
ページ左上の赤い部分は「リモートホストIP」で、異なっていることがわかります。
これは「コンテナの中のブラウザの結果は別のリモートホスト(AWSインスタンスのIP(AmazonLinux))でリクエストし返してきた結果である」ためです。
「特殊な設定(トンネリングを仕込む、など)をした端末」って、サービスのメンテでもインフラの仕事でも必要になることがあると思います。
ただ、ブラウザの設定とか「GUIの設定も含む」と、途端に「長大な手順書を用意して」とか「各自端末を汚す」「個人で設定するのを強いる」とか、そういうことになりがちで…。
そういうとき「インハウスリポジトリからdocker run
のワンライナーで落として実行」などできると、すごく便利なんじゃないか?と思いやってみました。
トレーサビリティが気になる方は、ログ等「立ち上げてアクセスされたら解る仕組み」も自動で設定しておくのも良いかもしれません。
アドベントカレンダー 、次は四日目 porinkysan さんの「」 です。
以下を参考にさせていただきました。