Vagrant shareとngrokを使ってみた

Vagrant 1.5 and Vagrant Cloud

Vagrant shareを使ってみた.今まではprivate_networkによるローカルマシンから仮想マシンへのアクセスや,public_networkによるLAN内のマシンから仮想マシンへのアクセスが可能だった.今回のアップデートで,外部ネットワークのマシンから,ローカルに立てた仮想マシンへのアクセスが可能になった.

主なアクセスは以下の2つ.

  • 仮想マシン内に立てたHTTPサーバーへのアクセス
  • SSHによる仮想マシンへのログイン

試してみた.

準備

Vagrant Cloudでアカウントを作成し,ログインする.

$ vagrant login

また,例として以下のようなVagrantfileを準備し,仮想マシンを起動しておく.

Vagrant.configure("2") do |config|
    config.vm.box = "precise64"
    config.vm.box_url = "http://files.vagrantup.com/precise64.box"
    config.vm.network :forwarded_port, guest: 80, host: 8080
    config.vm.provision :shell, :inline => <<-PREPARE
apt-get -y update
apt-get install -y apache2
PREPARE
    end
$ vagarnt up

(やっているのは,8080->80のport forwardとapacheのインストールのみ)

HTTP Access

まず,PulicなHTTP URLを介して仮想マシン内のHTTPサーバにアクセスする方法.この場合は,共有相手のマシンにVagrantがインストールされている必要はない.

以下を実行する.

$ vagrant share
...
==> default: Your Vagrant Share is running! Name: terrible-moose-1613
==> default: URL: http://terrible-moose-1613.vagrantshare.com

すると,http://terrible-moose-1613.vagrantshare.comのような一時的なURLが発行される(現在はアクセス不可).

あとは,そのURIを共有するだけ. 共有相手はブラウザから仮想マシン内のHTTPサーバにアクセスできる.

以下のように,vagrantshare.comからローカルマシンまでTCPセッションを確立して,それをそのまま仮想マシンにport forwardすることで実現している.

http://terrible-moose-1613.vagrantshare.com -> 127.0.0.1:8080 (Host) -> 127.0.0.1:80 (Guest) 

SSH Access

ローカルでvagrant sshで仮想マシンにログインするように,外部ネットワークのマシンからローカルに立てた仮想マシンにsshでログインすることもできる.この場合は,共有相手のマシンにVagrant 1.5以上がインストールされている必要がある.

以下を実行する.今回は,sshログインのためのパスワードの入力が要求される.

$ vagrant share --ssh
==> default: Your Vagrant Share is running! Name: bulky-mitchell-9363
==> default: URL: http://bulky-mitchell-9363.vagrantshare.com

すると,同様にbulky-mitchell-9363のようなshare nameが発行されるので,その名前と入力したパスワードを共有する.

共有相手は以下を実行することでsshで仮想マシンにログインする.

$ vagrant connect --ssh bulky-mitchell-9363

セキュリティ的に不安な場合は,共有の際に以下のようにすれば,共有相手は一度しかsshでログインできなくなる.

$ vagrant share --ssh --ssh-once

Disable HTTP URL Access

http://terrible-moose-1613.vagrantshare.comのようなpublicなHTTP URLを無効にした共有もできる.この場合も共有相手にVagrant 1.5以上がインストールされている必要がある.

以下を実行する.

$ vagrant share --disable-http
==> default: Your Vagrant Share is running! Name: hopeful-kangaroo-2431

すると,hopeful-kangaroo-2431のようなshare nameのみが発行されるので,それを共有する.

共有相手は,以下を実行する.

vagrant connect hopeful-kangaroo-2431
==> connect: SOCKS address: 127.0.0.1:53298
==> connect: Machine IP: 172.16.0.2

すると,共有相手には,固定のIPが割り振られ,ローカルネットワーク内に仮想マシンが存在しているように見える(ローカルでprivate_networkvagrant upした感じかな).

共有相手は,172.16.0.2でブラウザから仮想マシン内のHTTPサーバーにアクセスできる.

ngrok

twitterを眺めていたら,同様の技術にngrokというものがあるのを知った.ローカルに立てたサーバをngrok.comを介して外部に晒すことができる.こちらも試してみた.

まずサーバを立てる.

$ python -m SimpleHTTPServer

あとは,以下を実行するだけ.

$ ngrok 8000

すると,http://3d0dbc48.ngrok.comのようなURLが発行され,以下のようにforwardingされる.

http://3d0dbc48.ngrok.com -> 127.0.0.1:8000

URLを共有すると,サーバを実行したローカルディレクトリがURLを介して外部に晒される(ファイルの共有とかできちゃう).

まとめ

Vagrant share素晴らしい.リモートで働いているときとか便利そう(社内ならpublic_networkで事足りそう).SSHアクセスはエンジニアとの共同作業に,HTTP Accessはエンジニア以外のひとに成果物を見せるときに使えそうだなと思った.