Vagrant で Google Compute Engine (GCE) 上に Rails 開発環境を構築する

2015/01/12

Vagrant は開発環境を構築・設定するためのツールです。一般には、VirtualBox などの仮想化ソフトウェアを利用して仮想開発環境を準備するツールだと考えられていますが、Amazon Web Services (AWS) や Google Compute Engine (GCE) などのクラウドコンピューティングサービス上のインスタンス(仮想専用サーバー)をセットアップするためにも利用できます。

本稿では、Vagrant で Google Compute Engine (GCE) 上に Rails 開発環境を構築する手順を紹介します。

注意: GCE には 60 日間で 300 ドル分利用できる無料体験プランが用意されていますが、利用を始めるには住所とクレジットカードの登録が必要となります。

注意: 本稿は、読者が Mac OS X または Linux が動くパソコンを利用していることを前提として書かれています。ただし、Windows をお使いの方でも、MinGW と MSYS をインストールして Unix ユーティリティが利用できるようになれば、本稿の手順で Rails 環境の構築ができるはずです(ただし、動作未確認)。MinGW と MSYS の利用法については、本稿の対象外です。ネット検索などでお調べください。

Google Compute Engine サービスアカウントの作成

Google Compute Engine プロジェクトの作成

以下、プロジェクト名を oiax-rails、プロジェクトIDを oiax-rails として説明します。読者の方は、適宜読み替えてください。

  • https://console.developers.google.com/project を開く。
  • [プロジェクトを作成]ボタンをクリック。
  • プロジェクト名に「oiax-rails」、プロジェクトIDに「oiax-rails」と入力し、[作成]ボタンをクリック。

クライアントIDの作成

ブラウザで Google Compute Engine のコンソールを開き、以下の操作を行います。

  • プロジェクトの一覧から「oiax-rails」リンクをクリック。
  • [APIと認証]→[認証情報]メニューを開き、[新しいクライアントIDを作成]ボタンをクリック。
  • ラジオボタン[サービスアカウント]を選択し、[クライアントIDを作成]ボタンをクリック。
  • 秘密キーのパスワードが表示されるので、控えておく。※ ただし、本稿では利用しない。
  • 画面に 012345678901-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX@developer.gserviceaccount.com という形式のメールアドレスが表示されるので、控えておく(サービスアカウントメールアドレス)。
  • oiax-rails-XXXXXXXXXXXXX.p12 という形式の名前を持つファイル(P12 キー)がダウンロードされるので、それを ~/.ssh フォルダに保存する。適宜ファイル名を変更しても構いません。

SSH公開鍵の作成と登録

ローカルマシンのターミナル上で次のコマンドを実行します。

$ ssh-keygen -f ~/.ssh/google_compute_engine -C vagrant@gce

本稿では、読者の使用しているパソコンを「ローカルマシン」と呼びます。また、コマンドを入力してコンピュータの操作をするソフトウェアを「ターミナル」と呼びます。OS によっては、「端末」とも呼ばれます。Windows をお使いの方は、「MinGW Shell」と読み替えてください。

ブラウザで Google Compute Engine のコンソールを開き、以下の操作を行います。

  • [計算処理]→[Compute Engine]→[メタデータ]メニューを開き、[SSHキー]タブを選択。
  • [編集]ボタン、[キーを追加]ボタンをクリック。
  • SSH公開鍵(~/.ssh/google_compute_engine.pub)の中身を、入力欄に貼り付ける。
  • [完了]ボタンをクリック。

Vagrant のインストール

ブラウザで https://www.vagrantup.com/downloads.html からインストーラーをダウンロードしてローカルマシンにインストールします。

Vagrant プラグイン vagrant-google のインストール

ローカルマシンのターミナル上で次のコマンドを実行します。

$ vagrant plugin install vagrant-google
$ vagrant box add gce https://github.com/mitchellh/vagrant-google/raw/master/google.box

Vagrantfile の作成

ローカルマシンに適当な作業フォルダを作り、その下に以下のような内容で Vagrantfile という名前のファイルを作成します。

以下、~/work という作業フォルダを作成したと仮定します。

PROJECT_ID = "oiax-rails"
CLIENT_EMAIL = "XXXX"
KEY_LOCATION = "YYYY"

Vagrant.configure("2") do |config|
  config.vm.box = "gce"
  config.vm.provider :google do |provider, override|
    provider.google_project_id = PROJECT_ID
    provider.google_client_email = CLIENT_EMAIL
    provider.google_key_location = KEY_LOCATION

    provider.name = "oiax-rails-001"
    provider.zone = "asia-east1-a"
    provider.machine_type = "n1-standard-1"
    provider.image = "ubuntu-1404-trusty-v20141212"
    provider.disk_size = 20

    override.ssh.username = "vagrant"
    override.ssh.private_key_path = "~/.ssh/google_compute_engine"
  end

  config.vm.provision :shell, path: "setup.sh"
  config.vm.provision :shell, path: "ruby-and-rails.sh", privileged: false
end

ただし、XXXX の部分はサービスアカウントメールアドレスで、YYYY の部分は P12 キーを保存したパスで置き換えてください。

また、machine_typedisk_size などの値は、適宜書き換えてください。

マシンタイプ n1-standard-1 の利用料は1時間当たり $0.069 です。1 ドル = 120 円として 30 日間使うと、5,962 円です。マシンタイプ g1-small なら、1時間当たり $0.0347 で、30 日間なら 2,998 円となります。ディスクの利用料は、1 GB あたり月額 $0.04(約 5 円)です。

注意: マシンタイプ f1-micro なら、1時間当たり $0.013(30 日間で 1,123 円)とかなり安価になりますが、メモリが 0.6 GB しかないため、MySQL のインストールで失敗します。少なくとも g1-small 以上のマシンタイプを選択してください。

プロビジョンスクリプトの作成

作業フォルダ(~/work)に次のような内容で setup.sh という名前のファイルを作成します。

#!/bin/bash

apt-get -y install software-properties-common python-software-properties
add-apt-repository -y ppa:chris-lea/node.js
apt-get update
apt-get -y upgrade
apt-get -y install build-essential nodejs git unzip

if [[ ! -d /usr/local/share/chruby ]]; then
  git clone https://github.com/postmodern/chruby.git /usr/local/src/chruby
  cd /usr/local/src/chruby
  make install
fi

if [[ ! -f /usr/local/bin/ruby-install ]]; then
  git clone https://github.com/postmodern/ruby-install.git /usr/local/src/ruby-install
  cd /usr/local/src/ruby-install
  make install
fi

if [[ ! -f /usr/sbin/mysqld ]]; then
  package="mysql-server-<version>"
  question="mysql-server/root_password"
  password="password"

  debconf-set-selections <<< "${package} ${question} password ${password}"
  debconf-set-selections <<< "${package} ${question}_again password ${password}"
  apt-get -y install mysql-server libmysqlclient-dev
fi

本稿では、データベース管理システム(DBMS)には、MySQL 5.6 を採用します。

また同フォルダに次のような内容で ruby_and_rails.sh という名前のファイルを作成します。

#!/bin/bash

ruby_version="2.2.0"
rails_version="4.2.0"

if [ $(grep -c chruby.sh ~/.bashrc) -eq 0 ]; then
  echo 'source /usr/local/share/chruby/chruby.sh' >> ~/.bashrc
fi

if [ $(grep -c auto.sh ~/.bashrc) -eq 0 ]; then
  echo 'source /usr/local/share/chruby/auto.sh' >> ~/.bashrc
fi

if [[ ! -d ~/rubies/ruby-${ruby_version}/ ]]; then
  /usr/local/bin/ruby-install ruby ${ruby_version}
fi

echo ${ruby_version} > ~/.ruby-version
echo ${ruby_version} > /vagrant/.ruby-version

source /usr/local/share/chruby/chruby.sh
chruby ${ruby_version}

if [[ ! -d ${GEM_HOME}/gems/rails-${rails_version}/ ]]; then
  gem install rails --version=${rails_version} --no-ri --no-rdoc --verbose
fi

setup.shroot ユーザー権限で、ruby_and_rails.shvagrant ユーザー権限で実行されます。

開発環境の構築

ローカルマシンのターミナル上で次のコマンドを実行します。

$ cd ~/work
$ vagrant up --provider=google

ターミナルには次のようなメッセージが表示され、しばらくすると構築は完了します。

Bringing machine 'default' up with 'google' provider...
==> default: HandleBoxUrl middleware is deprecated. Use HandleBox instead.
==> default: This is a bug with the provider. Please contact the creator
==> default: of the provider you use to fix this.
==> default: Warning! The Google provider doesn't support any of the Vagrant
==> default: high-level network configurations (`config.vm.network`). They
==> default: will be silently ignored.
==> default: Launching an instance with the following settings...
==> default:  -- Name:      oiax-rails-001
==> default:  -- Type:      n1-standard-1
==> default:  -- Disk size: 20 GB
==> default:  -- Image:     ubuntu-1404-trusty-v20141212
==> default:  -- Zone:      asia-east1-a
==> default:  -- Network:   default
==> default:  -- Metadata:  '{}'
==> default:  -- Tags:      '[]'
(中略)
Successfully installed rails-4.2.0
33 gems installed

構築にかかる時間はマシンタイプによります。私が n1-standard-1 で試したところ、約12分半で完了しました。g1-small の場合は、約22分かかりました。なお、途中で stdin: is not a tty などの警告メッセージが表示されますが、問題はありません。

SSH で開発環境にログイン

ローカルマシンのターミナル上で次のコマンドを実行します。

$ vagrant ssh

新規 Rails アプリケーション foobar を作成・起動

ローカルマシンのターミナルで、以下のコマンドを実行します。

% cd /vagrant
% rails new foobar -d mysql
% cd foobar
% bin/rake db:setup
% bin/rails s

SSH で開発環境にログインした状態で操作してください。

ポートフォワードの設定

ローカルマシンのターミナル上で以下のコマンドを実行します。

$ ssh-keygen -f ~/.ssh/known_hosts -R XXX.XXX.XXX.XXX
$ ssh -L 4000:localhost:3000 -i ~/.ssh/google_compute_engine vagrant@XXX.XXX.XXX.XXX

XXX.XXX.XXX.XXX の部分は、仮想専用サーバーのIPアドレスです。

ブラウザで Google Compute Engine のコンソールを開き、[計算処理]→[Compute Engine]→[VM インスタンス]メニューを開くと、仮想専用サーバーのIPアドレスがインスタンス一覧表の「外部 IP」列に書いてあります。

ブラウザでトップページを開く

ローカルマシンのブラウザで http://localhost:4000/ を開きます。例の「Welcome Aboard」のページが表示されれば成功です。

『実践 Ruby on Rails 4』のサンプルアプリケーションを動かしてみる

拙著『実践Ruby on Rails 4: 現場のプロから学ぶ本格Webプログラミング』のサンプルアプリケーション Baukis をこの環境で動かしてみましょう。

SSH で開発環境にログインしたターミナルで、Ctrl-C でアプリケーションを止めた後、以下のコマンドを実行します。

% cd ..
% wget http://pub.oiax.jp/jissen_rails/jissen-rails-src-1.0.7.zip
% unzip jissen-rails-src-1.0.7.zip
% cd jissen-rails-src-1.0.7/section-21-3-on-rails-4-2

エディタ(vimnano など)で Gemfile を開き、2-4 行目を

ruby '2.2.0'

gem 'rails', '4.2.0'

と書き換えます。また、新規ファイル config/database.yml を次のような内容で作成します。

default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: root
  password: password
  socket: /var/run/mysqld/mysqld.sock

development:
  <<: *default
  database: baukis_development

test:
  <<: *default
  database: baukis_test

そして、以下のコマンドを実行します。

% bin/bundle update
% bin/rake db:setup
% bin/rails s

/etc/hosts の書き換え

ローカルマシンの /etc/hosts に以下の行を追加します。

127.0.0.1	baukis.example.com baukis.example.jp

Baukis にログインする

ローカルマシンのブラウザで http://baukis.example.com:4000/ を開きます。次のようなページが表示されます。

Baukis

右上の「ログイン」リンクをクリックするとログインフォームが現れます。メールアドレスとして taro@example.com、パスワードに password を入力してログインできれば成功です。

インスタンス(仮想専用サーバー)の削除

インスタンスを削除するには、ローカルマシンのターミナル上で以下のコマンドを実行します。

$ vagrant destroy