「おれ、MacBook(12 inch)がリニューアルされたら速攻で買ってメインマシンにするんだ...!」これ、ここ1ヶ月ちょっと、ずっと思ってること。
次のリニューアルで Skylake が採用されるであろう MacBook ではあるが、今ぼくがメインマシンとしている MacBook Pro(2013 Late)よりも非力であることは間違いないだろうと思っていて。でも、多分なんだけど、最近のぼくの使い方的には、スペックがネックになる場面はそんなにないのかな、と思ってもいる。唯一心配なのが、Vagrant で VM を立ち上げるケース。ってことで、これを機に(?)「Vagrant で VirtualBox を」ではなく、「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円ってとこか。
これをどう捉えるか、はその人次第だと思うけど、ローカルで 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 、はやく来てくださーい!!
関連エントリ

APPLE MacBook (1.1GHzデュアルコア Intel CoreMプロセッサ/12型/8GB/256GB/USB-C/ゴールド) MK4M2J/A
- 出版社/メーカー: アップル
- 発売日: 2015/04/11
- メディア: Personal Computers
- この商品を含むブログ (2件) を見る