okochangの馬鹿でありがとう

ふらふら適当に世間を生きる日々でございます

Vagrantでスポットインスタンスを使う

こんには、@oko_changです。
最近、Vagrant入門ガイドという本も発売されていろいろな環境でVagrantが使用されているようです。
自分の好みのVMを簡単に起動したり、接続したり出来るので色々捗りますね。
私の場合はvagrant-awsを使ってEC2インスタンスを起動することが多いのですが、以下のようの事案が発生しないか心配になってきました。


『最近、AWSの使用率が高いみたいだけど、まさか調子に乗ってオンデマンドインスタンスとか使ってないよね?』
『DevOpsだか何だか知らないけど、いい加減にしなさいよ!!!』


せっかく便利なのに、これは困ります。
ということで、今回はVagrantでスポットインスタンスを使うまでの流れをまとめます。

環境

Amazon LinuxにVagrantインストールして、そこからUbuntuを起動しましたが、OSXなどの手元の環境でも基本は同じだと思います。

環境構築

まずはrbenvとrubyのインストールをします。

$ sudo yum install git gcc make zlib-devel libxml2-devel libxslt-devel readline-devel openssl-devel

$ git clone git://github.com/sstephenson/rbenv.git ~/.rbenv
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(rbenv init -)"' >> ~/.bashrc
$ exec $SHELL -l

$ git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
$ cd .rbenv/plugins/ruby-build/
$ sudo ./install.sh 

$ cd
$ rbenv install 1.9.3-p448
$ rbenv rehash
$ rbenv global 1.9.3-p448

$ gem install aws-sdk
$ rbenv rehash

$ gem install bundler
$ rbenv rehash

次にVagrantのインストールをします。

$ sudo yum groupinstall "Development Tools"
$ sudo rpm -ivh http://files.vagrantup.com/packages/b12c7e8814171c1295ef82416ffe51e8a168a244/vagrant_1.3.1_x86_64.rpm

通常であれば、以下のようにvagrant-awsのプラグインをします。

$ vagrant plugin install vagrant-aws
$ vagrant plugin list
vagrant-aws (0.3.0)

開発版のvagrant-awsのセットアップ

現在リリースされているvagrant-awsはスポットインスタンスに対応していないので、開発版を使います。
~/.vagrant.d/gems/gems/以下に開発版のvagrant-awsを配置します。

$ cd ~/.vagrant.d/gems/gems/
$ git clone -b develop https://github.com/tralamazza/vagrant-aws.git vagrant-aws-0.3.0-develop
$ cd ./vagrant-aws-0.3.0-develop/
$ bundle
$ bundle exec rake

ダミー用のboxをダウンロードします。

$ vagrant box add dummy https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box

Vagrantfileに設定を書きます。

$ vi Vagrantfile
## okochang configuration
Vagrant.require_plugin "vagrant-aws"
Vagrant.configure("2") do |config|
  config.vm.box = "dummy"
  config.vm.provider :aws do |aws, override|
  aws.access_key_id = "set your access key id"
  aws.secret_access_key = "set your secret key"
  aws.region_config "ap-northeast-1" do |region|
    region.spot_instance = true
    region.spot_max_price = "0.020"
  end
  aws.region = "ap-northeast-1"
  aws.instance_type = "m1.small"
  aws.keypair_name = "okochang-key"
  aws.security_groups = ["develop-group"]
  aws.ami = "ami-9763e696"
  override.ssh.username = "ubuntu"
  override.ssh.private_key_path = "~/.ssh/yanase-develop.pem"
  end
end

あとは以下のように起動、接続、削除などをします。

$ bundle exec vagrant status
$ bundle exec vagrant ssh
$ bundle exec vagrant destroy

まとめ

開発版を使えばVagrantからでもスポットインスタンスを使用する事が出来るので、無駄な争いを減らす事が出来ると思います。
通常版でサポートされるのが楽しみですね。
冒頭に紹介した事案はフィクションであり、私個人とはまったく関係ございません。