えいのうにっき

a-knowの日記です

MacBook(12 inch)をメインマシンにしたいと思っているので、Compute Engine Preemptible Instance を VirtualBox のように使ってみる

「おれ、MacBook(12 inch)がリニューアルされたら速攻で買ってメインマシンにするんだ...!」これ、ここ1ヶ月ちょっと、ずっと思ってること。

次のリニューアルで Skylake が採用されるであろう MacBook ではあるが、今ぼくがメインマシンとしている MacBook Pro(2013 Late)よりも非力であることは間違いないだろうと思っていて。でも、多分なんだけど、最近のぼくの使い方的には、スペックがネックになる場面はそんなにないのかな、と思ってもいる。唯一心配なのが、VagrantVM を立ち上げるケース。ってことで、これを機に(?)「VagrantVirtualBox を」ではなく、「Google Compute Engine を、しかも Preemptible Instace を使う」ことで、日々の開発を乗り切ろうと思っている...というお話。

ここから先、わざわざブログに起こすまでもない話が続く。そう、ぼくはただ MacBook がはやく欲しいだけ

どうやって?

これはかんたん、 vagrant-google プラグインをつかう。インストールは↓こうね。

$ vagrant plugin install vagrant-google

こんな↓かんじで Vagrantfile を書いておいて、

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.ssh.insert_key = false

  config.vm.define "test-instance" do |gcp|
    gcp.vm.box = "gce"
    gcp.vm.box_url = "https://github.com/mitchellh/vagrant-google/raw/master/google.box"
    gcp.vm.synced_folder ".", "/vagrant", disabled: true

    gcp.vm.provider :google do |google, override|
      google.google_project_id = ENV['GCP_PROJECT_ID']
      google.google_client_email = ENV['GCP_EMAIL']
      google.google_json_key_location = ENV['GCP_KEY_LOCATION']

      google.name = "test-instance"
      google.zone = "asia-east1-a"
      google.machine_type = "n1-standard-1"

      google.image = "centos-7-v20160329"
      google.disk_size = "10"

      google.preemptible = true
      google.on_host_maintenance = "TERMINATE"

      google.auto_restart = false

      override.ssh.username = 'dev'
      override.ssh.private_key_path = '~/.ssh/id_rsa'
      override.ssh.pty = true
    end
  end
end

override.ssh.username override.ssh.private_key_path に相当する情報については、あらかじめ GCP の該当プロジェクト「メタデータ」に登録しておく必要があるので、ご注意を。(これを忘れると、vagrant up したときに Waiting for SSH to become available... で止まる)

起動は↓こう。

$ vagrant up test-instance --provider=google

provider オプションを指定する以外は、至ってふつう。

速度は?

VMインスタンス)がローカルにいないぶん、VM に対して何をするにも通信が発生することになる。ぼくの趣味での VM のもっぱらの用途は、Chef(knife-solo)を使ってのプロビジョニングと、serverspec を使ってのその検証。どちらも、ローカルマシンと VM との通信量は大したサイズではないし、プロビジョニングの際に大きなソフトウェアをインストールする、となった場合でも、その通信は VM(GCE)とインターネットとの通信なので、こちらのマシンスペックは関係ない。

VM の起動自体のスピードも、AWS EC2 よりは速い気がしてる。体感だけど。

VM 上での処理速度については、何かをでかいビルドをするだとかいった重めの処理をするってときには、そのときだけインスタンスタイプを上げればいい。その場合の気になるコストについては次で。

コストは?

このブログでも何度か?取り上げている、 preemptible instace をつかう。上の Vagrantfile の google.preemptible = true のとこね。

preemptible instance は、GCP の余剰リソースの割り当てによって起動できる VM で、必ずしも起動できるとは限らないものの、一律 70% オフで利用できる VM。ここ https://cloud.google.com/compute/pricing でもわかるけど、n1-standard-1(CPUx1, 3.75GB)の preemptible instance を1時間使って $0.0165、2円かからないくらい(2016-04-12 現在)。重めの処理をやるときは n1-standard-4(CPUx4, 15GB)とかにタイプを上げるとしても、$0.066 / hour、6,7円ってとこか。

blog.a-know.me

これをどう捉えるか、はその人次第だと思うけど、ローカルで VM を立ち上げることにより発生するパフォーマンスの低下や本体の発熱、といった不快感に比べたら、このぐらいのコストは全然 OK ですぼくは。

ひとくふう

上述のとおり、ぼくの趣味開発での VM のもっぱらの用途は、Chef を使ってのプロビジョニングと、serverspec を使ってのその検証。となると、

$ bundle exec knife solo cook test-instance
$ bundle exec rake spec:vm:test-instance

みたいなかんじのことをやりたい。(serverspec の rake 周りは、だいたい serverspecの高度なヒント こんなかんじにしてる。)

こんなかんじで取り回すには、test-instance の ssh 接続情報を ~/.ssh/config に書いておいてやらないとなんだけど、静的な IP アドレスを割り振ってるわけでもないので、停止・起動のたびに ~/.ssh/config を書き換える必要がある。めんどい。

ってことで、VM の起動・停止・削除を行うときのシェルスクリプトを雑に用意してこれを使っている。

起動用↓

vagrant up $1 --provider=google
vagrant ssh-config --host $1 >> ~/.ssh/config

削除用↓

sed -i -e "/^Host $1$/,/  LogLevel FATAL/d" ~/.ssh/config
vagrant destroy $1

起動時には vagrant ssh-config を使って ~/.ssh/config に書き出し。

VM の削除時には、sed を使って ~/.ssh/config から該当のホスト情報を削除してから、vagrant destroy する。 vagrant ssh-config で書き出される情報は Host xxxx で始まり LogLevel FATAL で終わってるから、短絡的にこのようにしてみた。例外もあるのかもしれない。

あと、ぼくはロールに応じて VM を使い分けてる関係で、VM 名は引数で渡せるようにしてる。destroy halt とかを渡せるようにしてもいいかもしれない。

注意点

preemptible instance は、最大24時間の寿命を持つインスタンス。最大、なので、早いときには5分とかで天寿を全うする、こともある。「あれ、cook / spec がうまくいかない...」なんてときは、実はポックリいってました、ってことも多いので、まずはそこを気にかけるようにすると良い。

これを「不便だな」とかって頭を過ぎった人、逆に考えましょう、うっかりしてて起動しっぱなしで忘れちゃっても、最大24時間で落とされるので、クラウド破産の心配もなし!

まとめ

新型 MacBook 、はやく来てくださーい!!

関連エントリ

blog.a-know.me

blog.a-know.me

blog.a-know.me



follow us in feedly