今さら聞けないVagrantとDigital Oceanで格安VPS運用


# はじめに

VagrantとDigital Oceanという海外の格安VPSを使って、簡単に仮想マシンができる。・・っとここまではいろいろなブログや記事で述べられているのだけど、どうやら、APIがv2になったのに、v1のままの記事の方が多いらしく、コピペで動かないという事態になったので、リマインダとして作業内容を書いておく。

## 動作環境

この作業は以下の環境で行っています。

* Mac OS X Yosemite 10.10.3

# 環境のインストール

環境はさくっと、homebrew caskでインストールします。

```
# caskをインストールしていない人はここから
$ brew install caskroom/cask/brew-cask

# インストールしている人はここから
$ brew cask install vagrant virtualbox
``` 

なお、packerを使わない人は、virtualboxを入れなくても良いです。

## 環境のアップデート

caskのアップデートは特殊で、バージョンがアップされているとinstallコマンドで再インストールできます。なので、virtualboxのバージョンが上がったら、再度以下のコマンドを打ち込めばアップデートできます。

```
$ brew update
$ brew cask install virtualbox
```

vagrantも同様。

# Digital Oceanのアカウント作成

再度、解説するのも良いが、よくまとまっているスライドがあるので、割愛。

* http://www.slideshare.net/zembutsu/all-about-degital-ocean-introduction-distribution-hbstudy

なお、アカウント作成の際は、以下のページから作ってくれると\$10もらえます。僕には、リンクを通じて作成したアカウントが\$25使った時点で\$25のクーポンがもらえます（格安なので、\$25使うのに5ヶ月以上はかかるが・・）。以下、原文。

```
Everyone you refer gets $10 in credit. Once they’ve spent $25 with us, you'll get $25. There is no limit to the amount of credit you can earn through referrals.
```

* https://www.digitalocean.com/?refcode=2ae1c27135cb

そういうのが嫌な人は、直接どうぞ。公平を期して書いておくけど、こちらから作っても、\$10もらえるっぽいです。上と一緒にやると\$20もらえるってこと？（たぶん、どっちにしても\$10なんだろうなぁ・・）

* https://www.digitalocean.com

まとめます。

* sakuraなどのサイトは、初期費用がかかるけど、digital oceanは初期費用はかからず逆にクーポンがもらえます。んで、格安のDroplet（仮想マシン）が月\$5からなので、2ヶ月分無料と考えることもできます（常時動かす必要のない人は必要な時間だけ動かせば良いから、もっと長く使えます）
* 支払い方法はクレジットカードとPaypalから選べます。なにげにPaypalの前払いは便利だと思う人がいるんじゃないかな・・
* 友達にリンクページを通じて、宣伝することで、その友達が\$25使った段階で自分も\$25もらえます。仕組みとしてはDropboxと似ています

その分、一番下の仮想マシンの性能はsakura VPSより劣ります。

# 認証鍵の作成

パスワードによる認証も可能だけど、メールでパスワードが送られてくるまで待たなければいけないので、公開鍵認証を使います。まず、公開鍵認証に必要な公開鍵と秘密鍵を作成します。

```
$ ssh-keygen -t rsa -b 4096 -f ~/.ssh/do_secret
```

秘密鍵にパスワードを設定しない場合は、そのまあまENTERを押して進みます。


結果、以下のファイルが出来ます。


```
$ ls ~/.ssh/
do_secret     # ssh秘密鍵
do_secret.pub # ssh公開鍵
```

次に、permissionを設定します。

```
$ chmod 700 ~/.ssh ;
$ chmod 600 ~/.ssh/do_secret ;
$ chmod 644 ~/.ssh/do_secret.pub ;
```

作成した秘密鍵do_secretを、Digital Oceanのページで登録します。右上のドロップダウンリストから、Settingsを選び、左のサイドバーからSecurityを選ぶと、SSH Keysという設定がでてきます。そこで、Add SSH Keyボタンを押し、作った秘密鍵を登録します。

# vagrantのセットアップ

まず、必要なパッケージをインストールします。

```
$ vagrant plugin install dotenv
$ vagrant plugin install vagrant-digitalocean
```

dotenvプラグインは、ディレクトリの下に.envというファイルを作っておくと、そのファイルに書かれている変数をVagrantfileという設定ファイルに反映できるというプラグイン。vagrant-digitaloceanは読んで字の如く、vagrantのdigital ocean拡張です。

準備が整ったら、適当にディレクトリを作って以下のVagrantfileを作成します。

```
$ mkdir vm
$ cd vm
$ touch Vagrantfile
$ emacs Vagrantfile
```

Vagrantfileの内容は以下のようにします。

```ruby
# -*- mode: ruby -*-
# vi: set ft=ruby :

Dotenv.load

# change default provider to digital_ocean
ENV['VAGRANT_DEFAULT_PROVIDER'] = "digital_ocean"

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

  config.vm.provider :digital_ocean do |provider, override|
    override.ssh.private_key_path = "#{ENV['PRIVATE_KEY_PATH']}"
    override.vm.hostname          = "#{ENV['DROPLET_NAME']}"
    override.vm.box = 'digital_ocean'
    override.vm.box_url = "https://github.com/smdahlen/vagrant-digitalocean/raw/master/box/digital_ocean.box"

    provider.token = "#{ENV['PROVIDER_TOKEN']}"
    provider.image = 'ubuntu-14-04-x64'
    provider.region = 'sgp1'
    provider.size = '512mb'

    # disable synced_folder: rsync is not installed on DigitalOcean's guest machine
    override.vm.synced_folder "./", "/vagrant", disabled: true
    
    # provision
    # Do whatever you wanna do !!

    # X forward settings
    config.ssh.forward_agent = true
    config.ssh.forward_x11 = true

  end

end
```

ここで、冒頭のDotenv.loadが.envから変数をロードしているところ、#{ENV[‘<変数名>’]}のところが、変数を代入しているところです。上記のVagrantfileと.envの組み合わせでいろいろな仮想マシンを立ち上げることができます。

次に、変数を列挙する.envファイルを作成します。

```
$ touch .env
$ emacs .env
```

.envの書式は次のようになります。

```
DROPLET_NAME = "vagrant-test"
PRIVATE_KEY_PATH = "~/.ssh/do_secret"
PROVIDER_TOKEN = "<APIタブから作ることのできるトークン番号>"
```

DROPLET_NAMEは、仮想マシン名になります。PRIVATE_KEY_PATHは作成した仮想マシンとssh接続するために指定します。これは、DigitalOceanに登録した秘密鍵でなくても構いません。むしろ、保守のためには他の秘密鍵を別途作成し、登録したほうが良いでしょう。PROVIDER_TOKENは、Digital Oceanのページの上部タブからAPIを選び、Personal Access Tokensのセクションから、Generate New Tokenボタンを押して発行します。

# 仮想マシンの制御

ここまで設定したら、vagrantコマンドを使って、仮想マシンを制御するだけです。

```
$ vagrant up --provider=digital_ocean
$ vagrant halt
$ vagrant destroy
```

digital oceanはdestroyしないと課金が続くので注意しよう。

## スナップショットからの仮想マシンの立ち上げ

digital oceanはスナップショットの作成が無料です。そのため、環境設定やインストールなどの初期設定を終えたスナップショットを作っておいて、そこから始めると、サービスの立ち上げ時間を短縮することができます。しかし、vagrantのdigital ocean拡張は今のところ、この機能をサポートしていません。

代替案として、仮想マシンの起動だけをDigital Oceanのページから行い、その後の操作をvagrantでするという方法があります。上記の設定では、仮想マシン名をdefaultとし、メモリ容量とリージョンを変えなければ、vagrantから起動中の仮想マシンがあると認識されます。そのうち、サポートされると思いますが、現時点ではこの方法も覚えておくと良いかもしれません。

# Tips

この章は、Vagrantfileの各種パラメータの解説や、ansibleとの連携などのより技術的な内容についてのリマインダです。ので、設定の細かい内容とかどうでも良い人は無視しましょう。

## Vagrantfileのパラメータ例


* provider.image - イメージの文字列表現。デフォルトではubuntu-14-04-x64になります.使用可能なイメージは、以下のコマンドで調べることができます。

	```
$ vagrant digitalocean-list images $DIGITAL_OCEAN_TOKEN
```

* provider.ipv6 - IPv6を有効にするかどうかを指定します。
* provider.region - Dropletの所属するリージョンを文字列で指定します. デフォルトではnyc2にななります. 使用可能なリージョンは以下のコマンドで調べることができます。

	```
$ vagrant digitalocean-list regions $DIGITAL_OCEAN_TOKEN
```

* provider.size - Dropletのメモリサイズを文字列で指定します(512mb,1gbなど). デフォルトでは512mbにななります. 使用可能なメモリサイズは以下のコマンドで調べることができます。

	```
$ vagrant digitalocean-list sizes $DIGITAL_OCEAN_TOKEN
```

* provider.private_networking - プライベートネットワークを有効にするかどうかを指定します。.デフォルトではfalseになります.

* provider.backups_enabled - バックアップを取るかどうかを指定します。デフォルトでは、falseになります。またバックアップを取る場合、Dropletの課金の20%を支払う必要があるので、注意しましょう。
* provider.ssh_key_name - sshの秘密鍵のパスを指定します。

* provider.setup - 新しいユーザアカウントを作成し、sudo権限を移動させるかを指定します。デフォルトでは、trueになっています。packerなどを用いて、プロビジョニングされたユーザアカウントを使いまわしたいときはfalseにしてください。

## 参考サイト・文献

* https://github.com/smdahlen/vagrant-digitalocean