Vagrant の仮想ゲストにインターネットから http 接続する（Vagrant Share）

Vagrantで作った仮想ゲストにインターネット越しにアクセスしようとすると、いろいろと面倒なものです。設定が面倒なだけでなくファイアーウォールの内側にVagrant環境があったり、環境が自宅にあってプロバイダーからprivate addressしか割り当てられていなかったりすると、外に踏み台を用意したりといろいろ考えないといけません。でも、vagrant share を使えば、vagrantshare.comのサーバに中継してもらって、自宅の Vagrant環境へインターネットからアクセスするといったことが簡単に実現できます。httpを転送する場合の手順をまとめてみました（sshの場合は、[Vagrant の仮想ゲストにインターネットから ssh 接続する（Vagrant Share --ssh）](http://qiita.com/kutsushitaneko/items/77538df71fa42c724bd7)にまとめました）。

#手順概要
1.[HashiCorpのAtlas](https://atlas.hashicorp.com/)にアカウントを作成

2.Atlasにログイン(vagrant loginコマンド)

3.ポートフォワーディングの設定（Vagrantfile）

4.Atlasへ接続し、アクセス用URLを取得（vagrant shareコマンド）

5.アクセス用URLを使って、外部からアクセス

#手順詳細
##1.[HashiCorpのAtlas](https://atlas.hashicorp.com/)にアカウントを作成

[HashiCorp Atlas](https://atlas.hashicorp.com/)にブラウザからアクセスします。

![image](https://qiita-image-store.s3.amazonaws.com/0/74534/4af60aed-199c-a3b9-390e-28a763408bce.png)

右上に見える「SIGN UP」をクリックします。

![image](https://qiita-image-store.s3.amazonaws.com/0/74534/de48d92e-d4d1-5de9-259b-969fd6450875.png)

各項目に入力して、「terms and conditions」に同意できたら「Create account」をクリックして、アカウントを作成します。

![image](https://qiita-image-store.s3.amazonaws.com/0/74534/4b00fb48-067f-b8f7-733f-20e9f558d86e.png)

「Use Vagrant Share」をクリックすると、使い方のサマリーが表示されます。

![image](https://qiita-image-store.s3.amazonaws.com/0/74534/880f7a20-727e-6c9c-d606-6c6715369d85.png)

##2.Atlasにログイン(vagrant loginコマンド)

ローカル側（共有したいVagrant環境を実行している側）のホストで`vagrant login`コマンドを使ってAtlas by HashiCorp へログインします（ブラウザからではありません）。

```lang:
$ vagrant login
In a moment we will ask for your username and password to HashiCorp's
Atlas. After authenticating, we will store an access token locally on
disk. Your login details will be transmitted over a secure connection, and
are never stored on disk locally.

If you do not have an Atlas account, sign up at
https://atlas.hashicorp.com.

Atlas Username: xxxxxxxxxx
Password (will be hidden):
Error! Your console doesn't support hiding input. We'll ask for
input again below, but we WILL NOT be able to hide input. If this
is a problem for you, ctrl-C to exit and fix your stdin.
 Password (will be hidden): xxxxxxxx
You are now logged in.
```

なお、"Error! Your console doesn't support hiding input."のエラーは、WindowsでCygwin の mintty を使っているときに出ます。パスワードをこの入力画面上で非表示にできないというものです。

ログインすると .vagrant.d ディレクトリの下の data ディレクトリに `vagrant_login_token` というファイルが作成されます。

##3.ポートフォワーディングの設定（Vagrantfile）
vagrant share は、vagrantshare.comのサーバに入ってきたトラフィックを、vagrant が仮想ゲストのポートへフォワードしているローカルホストのポートへ転送するものです。

つまり、このように転送されます。

**リモートクライアント（インターネットの向こう側）
--> vagrantshare.comのサーバのポート 
--> ローカルホストのポート 
--> 仮想ゲストのポート**

そのため、http をフォワードするためには、まず、仮想ゲストのhttpポートへローカルホストのポートをフォワードする必要があります。

次のような設定をVagrantファイルに追加することで、ローカルホストの8080番ポートを仮想ゲストの80番ポートへフォワードすることができます。

```lang:
config.vm.network "forwarded_port", guest: 80, host: 8080
```

Vagrantfileは、たとえば、下記のようになります。

```lang:Vagrantfile
Vagrant.configure(2) do |config|
  config.vm.box = "ubuntu/trusty64"
  config.vm.network "forwarded_port", guest: 80, host: 8080
  config.vm.provision "shell", inline: <<-SHELL
    sudo apt-get update
    sudo apt-get install -y apache2
  SHELL
end
```

通常どおり vagrant upします。ポートフォワーディング設定前に、既に up していた場合は、vagrant reload します。

```lang:
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'ubuntu/trusty64'...
...
...
...
```

##4.Atlasへ接続し、アクセス用URLを取得（vagrant shareコマンド）

ここまでで、仮想マシンが起動して、ホスト・ポート（8080） => 仮想ゲスト・ポート（80）のフォワーディングができました。つまり、下記のうちの太字部分ができたことになります。

リモートクライアント（インターネットの向こう側）
--> vagrantshare.comのサーバのポート 
--> **ローカルホストのポート 
--> 仮想ゲストのポート**

次に、vagrantshare.com のサーバが受け取ったトラフィックがローカルホストの 8080 ポートへフォワードされるようにします。そうすることで、リモートクライアント（インターネットの向こう側）が、ブラウザで、vagrantshare.comのサーバへアクセスすると、vagrant環境の仮想ゲストへ転送されるようになります。つまり、下記のうちの太字部分です・

リモートクライアント（インターネットの向こう側）
--> **vagrantshare.comのサーバのポート 
--> ローカルホストのポート**
--> 仮想ゲストのポート


コマンドは、vagrant share です。

```lang:
$ 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: ghastly-hartebeest-1276
==> default: Your Vagrant Share is running! Name: ghastly-hartebeest-1276
==> default: URL: http://ghastly-hartebeest-1276.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`).
```
なお、vagrant share は、フォアグランドで実行されています。プロンプトは戻りません。

vagrant share コマンドは、デフォルトで http を自動検出して、転送するため、オプション等で http であることや、ゲストのポートが 80 番であることは指定していません。異なるポート番号を使っていて自動検出できない場合は、 `--http`オプションでポート番号を指定できます。また、httpsを使用したい場合は明示的に`--https`でポート番号を指定する必要があります。詳しくは、`vagrant share --help`をみてください。

##5.アクセス用URLを使って、外部からアクセス
インターネット側からは、4.で「==> default: URL: 」に表示されたURLでアクセスします。
![image](https://qiita-image-store.s3.amazonaws.com/0/74534/6c7535c8-3573-0568-e1ea-3799c44d83a8.png)

share を終了するには、`vagrant share`を Ctrl-C等で終了させます。

なお、4.で提供されるURLはvagrant shareを実行する度に変わります。このURLはわかりにくいURLにはなっているものの、辞書に載っている単語で構成されていますので、他人が誤って、もしくは、故意にアクセスしてしまう可能性があります。仮想ゲストの httpサーバ側で認証等のセキュリティ対策をしておいた方が良さそうです。