Vagrantで作った仮想マシンを簡単に共有できる「Vagrant Share」を使ってみる
仮想マシン上に仮想開発環境やテスト環境を作るのは便利だが、仮想マシンを稼動させているマシン以外からのアクセスがやや面倒というデメリットもある。今回はこういった問題を解決できる「Vagrant Share」について紹介する。
仮想マシンへのファイアウォールを越えたアクセスも可能に
最近ではソフトウェアの開発やテストに仮想マシンを使うことは珍しくなく、Vagrantのようにそのための支援ツールも登場している。仮想マシンを利用するメリットとしては、運用時に近い環境で開発やテストを行えるというものがあるが、一方で仮想マシンに対して外部からネットワークアクセスを行いたい場合、その設定はやや面倒となる。
使用する仮想化ソフトウェアによっても変わるが、多くの場合仮想マシンのネットワーク構成としては、以下のどちらかの構成が考えられる。
- ネットワークブリッジを使用する
- 仮想マシン用の独自ネットワークを作成し、ホストをゲートウェイとする
ネットワークブリッジは、仮想マシンを稼動させているホストマシンのネットワークインターフェイス(NIC)を共有し、ホストマシンが接続されているネットワークにあたかも仮想マシンのがNICが直接接続されているかのように見せかけるものだ。この場合、そのネットワークからは直接仮想マシンにアクセスを行うことができる。いっぽう、独自ネットワークを作成する場合では、そのホストマシン以外から直接仮想マシンにネットワーク接続を行うことはできない。そのため、NATやポートフォワーディングなどを利用してホスト宛の接続を転送することで外部から仮想マシンへの接続を可能にすることになる。
このような手段を使うことで、ホストマシンがあるネットワーク内から仮想マシンへのアクセスは可能になるが、インターネット経由で仮想マシンにアクセスするのは簡単でない。開発用のホストマシンは多くの場合ローカルなIPアドレスのみが割り当てられているためだ。インターネットから直接ホストマシンにアクセスできなければ、そのマシン上の仮想マシンにもアクセスできない。そのため、たとえば開発者が複数の拠点に分散しているような場合、異なる拠点からテスト用の仮想マシンにアクセスしてもらうには、VPNなどの特別な手段が必要となってしまう。
そこで活用したいのが、Vagrantの「Vagrant Share」という機能だ。Vagrant ShareはVagrant 1.5で新たに導入された機能で、Vagrantの運営側が用意したサーバー(vagrantshare.com)の特定のサブドメイン宛の通信を、Vagrantを使って稼動させた仮想マシンに転送するというものだ(図1)。これにより、インターネットから直接アクセスできない仮想マシンに対するアクセスが可能になる。
Vagrant Shareは恒久的なサービス稼動に向けたものではなく、あくまで開発やテストなどで一時的に外部からのアクセスが必要な場合に向けたものだ。そのため、vagrant shareコマンドを使った転送は、vagrant shareコマンドを終了するとその時点で終了する。また、vagrant shareコマンドを実行するたび、仮想マシンに割り当てられるサブドメインは異なるものになる。
なお、Vagrant Shareを利用するには、Vagrantで構築された仮想マシンが必要となる。Vagrantの使い方については以前の記事(『仮想環境構築ツール「Vagrant」で開発環境を仮想マシン上に自動作成する』)で紹介しているので、そちらも参照していただきたい。
Vagrant Shareを使う
Vagrant Shareを利用するには、Vagrant関連サービスを提供するVagrant Cloudのアカウントが必要だ(図2)。このアカウントは無料で作成できる。
アカウントの作成は、Vagrant Cloudトップページから行える。「JOIN VAGRANT CLOUD」リンクをクリックしてアカウント作成ページを開き、アカウントを作成しておこう(図3)。なお、登録の際にはユーザー名とメールアドレス、パスワードといった情報の入力が必要だ。
アカウントを作成したら、「vagrant login」コマンドを実行してVagrant Cloudにログインする。
$ vagrant login In a moment we'll ask for your username and password to Vagrant Cloud. After authenticating, we will store an access token locally. Your login details will be transmitted over a secure connection, and are never stored on disk locally. If you don't have a Vagrant Cloud account, sign up at vagrantcloud.com Username or Email: ****@example.com Password (will be hidden): You're now logged in!
vagrant loginコマンドでログインに成功すると、~/.vagrand.dディレクトリ以下にVagrant Cloudへのアクセスに必要な情報が格納され、自動的にそのアカウントを使ってVagrant Cloudにアクセスできるようになる。
仮想マシン上で稼動しているWebサーバーを公開する
それではまず、Vagrantを使って稼動させている仮想マシン上で動いているWebサーバーに対し、Vagrant Shareを使ってインターネット経由でアクセスできるようにしてみよう。
Vagrant Shareを使ってWebサーバーを公開する場合、仮想マシンをホストするマシンからWebサーバーが使用するポート(通常は80番)へのポートフォワーディングが設定されている必要がある。この設定は、Vagrantfile内に記述する。たとえばホストの8080番ポートを仮想マシンの80番ポートに転送するには、次のような設定を追加して仮想マシンを再起動させれば良い。
config.vm.network "forwarded_port", guest: 80, host: 8080
ポートフォワーディングの設定後、次のように「vagrant share」コマンドを実行すると、Vagrant Cloudとの通信が行われ、仮想マシンに割り当てられた接続用URL(下記実行例の太字部分)が表示される。
$ vagrant share ==> default: Detecting network information for machine... default: Local machine address: 127.0.0.1 default: default: Note: With the local address (127.0.0.1), Vagrant Share can only default: share any ports you have forwarded. Assign an IP or address to your default: machine to expose all TCP ports. Consult the documentation default: for your provider ('virtualbox') for more information. default: default: Local HTTP port: 8080 default: Local HTTPS port: disabled default: Port: 2222 default: Port: 8080 ==> default: Checking authentication and authorization... ==> default: Creating Vagrant Share session... default: Share will be at: tranquil-pony-3801 ==> default: Your Vagrant Share is running! Name: tranquil-pony-3801 ==> default: URL: http://tranquil-pony-3801.vagrantshare.com ==> default: ==> default: You're sharing your Vagrant machine in "restricted" mode. This ==> default: means that only the ports listed above will be accessible by ==> default: other users (either via the web URL or using `vagrant connect`).
この例の場合、割り当てられたURLは「http://tranquil-pony-3801.vagrantshare.com」となっている。このURLにWebブラウザでアクセスすると、そのリクエストが仮想マシン内のWebサーバーに転送されてその結果が表示される(図4)。
また、Vagrant Shareを使った共有を止めるには、Ctrl+Cを入力してvagrant shareコマンドを終了させれば良い。
前述のとおり、割り当てられるURLはvagrant shareコマンドの実行ごとに異なるものとなる。このURLは外部に公開されることはないが、特に認証機能などは提供されないため、URLさえ分かれば不特定多数からのアクセスが可能だ。たとえば無関係の人が適当にURLを入力し、たまたまそれがヒットしてアクセスされる、という可能性もないとは言えない。慎重を期するなら、別途サーバー側で何らかの認証手段を設定しておくべきだろう。
仮想マシン上にインターネット経由でSSH接続する
Vagrant Shareでは、仮想マシンに対しインターネット経由でのSSH接続を可能にする機能もある。この場合もHTTPの場合と同様、SSHで使用するポートに対するポートフォワーディング設定がされている必要がある。Vagrantのデフォルト設定ではこれが有効になっているので、明示的にSSHのポートフォワーディングを無効にしていない限りは設定を変更する必要はない。また、アクセスする側のマシンにもVagrantがインストールされている必要がある。
SSHのポートフォワーディングを行うには、次のように「--ssh」オプション付きで「vagrant share」コマンドを実行する。なお、SSH共有を利用する場合はパスワードを設定する必要があり、vagrant shareコマンドの実行後にこのパスワードを指定することになる。
$ vagrant share --ssh ==> default: Detecting network information for machine... default: Local machine address: 127.0.0.1 default: default: Note: With the local address (127.0.0.1), Vagrant Share can only default: share any ports you have forwarded. Assign an IP or address to your default: machine to expose all TCP ports. Consult the documentation default: for your provider ('virtualbox') for more information. default: default: Local HTTP port: 8080 default: Local HTTPS port: disabled default: SSH Port: 2222 default: Port: 2222 default: Port: 8080 ==> default: Generating new SSH key... default: Please enter a password to encrypt the key: ←接続に使用するパスワードを入力する default: Repeat the password to confirm: ←同じパスワードを再度入力する default: Inserting generated SSH key into machine... ==> default: Checking authentication and authorization... ==> default: Creating Vagrant Share session... default: Share will be at: oppressive-boar-5213 ==> default: Your Vagrant Share is running! Name: oppressive-boar-5213 ==> default: URL: http://oppressive-boar-5213.vagrantshare.com ==> default: ==> default: You're sharing your Vagrant machine in "restricted" mode. This ==> default: means that only the ports listed above will be accessible by ==> default: other users (either via the web URL or using `vagrant connect`). ==> default: ==> default: You're sharing with SSH access. This means that another user ==> default: simply has to run `vagrant connect --ssh oppressive-boar-5213` ==> default: to SSH to your Vagrant machine. ==> default: ==> default: Because you encrypted your SSH private key with a password, ==> default: the other user will be prompted for this password when they ==> default: run `vagrant connect --ssh`. Please share this password with them ==> default: in some secure way.
これで、インターネット経由で仮想マシンにSSH接続できるようになる。実際にSSH接続を行うには、接続したいマシンから、以下のように「vagrant connect」コマンドを使用すれば良い。
$ vagrant connect --ssh oppressive-boar-5213
このコマンドを実行するとパスワードが尋ねられるので、vagrant shareコマンドの実行時に登録したパスワードをここで入力することになる(図5)。
この例のように、VagrantがインストールされていればWindowsマシンからLinuxマシンにログインすることも可能だ。
なお、デフォルトではSSHとHTTPの両方についてインターネット経由での接続が可能になる。もしHTTPについて共有機能を利用したくない場合は、「--disable-http」オプションを指定すれば良い。
任意の通信を転送する
VagrantではHTTPやSSHだけでなく、Vagrantfile内で転送を行うように指定した任意のポートについて、インターネット経由での接続を可能にする機能も用意されている。この機能を利用するには、まず公開したいポートについて、Vagrantfileの「config.vm.network "forwarded_port"」設定でポートフォワーディングを有効にしておく必要がある。たとえば次の例は、仮想マシンの873番ポートに対し、1873番ポートを使ってポートフォワーディングを行う設定だ。また、設定を行った後は仮想マシンの再起動が必要だ。
onfig.vm.network "forwarded_port", guest: 873, host: 1873
指定したポートに対しインターネット経由で接続を行うには、仮想マシンに接続したいマシン上でvagrant connectコマンドを実行する。ここで、引数にはvagrant shareコマンドの実行時に割り当てられるIDを指定するたとえば「oppressive-boar-5213」というIDが割り当てられている場合、次のように実行する。
$ vagrant connect oppressive-boar-5213
vagrant connectコマンドを実行すると、コマンドを実行したマシン上にLinuxベースの仮想マシンがダウンロードされ、VirtualBoxによってその仮想マシンが起動される。この仮想マシンにはポートの転送を行う機能があり、この仮想マシンに対してネットワーク接続を行うと、その接続がVagrant Shraeのサーバーを経由して指定したリモートの仮想マシンに転送される仕組みになっている。
たとえば先の例では、ローカル上の仮想マシンの1873番ポート宛に接続すると、それがリモート上の仮想マシンの873番ポートに転送されるようになる。
利用の際にはセキュリティに注意
このようにVagrant Shareを利用することで、ファイアウォール内にある仮想マシンを外部に手軽に公開できるようになる。ただし、ファイアウォール内に外部から接続できるようになるということは、セキュリティ的に大きな穴ができる可能性もある。利用の際はその点に注意し、使用後はすぐにvagrant shareコマンドを停止させるなど、十分な対策とともに使うべきである。
また、海外のサーバーを経由して通信を行うことになるため、レイテンシもやや大きくなる。そのため、SSH接続時はやや反応が遅くなってしまう。もし本格的に外部からのSSH接続を行うのであれば、VPNなど別の手段を用意したほうが良いだろう。
【関連記事】
>>仮想環境構築ツール「Vagrant」で開発環境を仮想マシン上に自動作成する