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 サービスアカウントの作成
- https://accounts.google.com/Login を開き、Google アカウントにログインする。アカウントを持っていない場合は、https://accounts.google.com/SignUp から作成する。
- https://console.developers.google.com/ を開き、課金の設定(住所とクレジットカードの登録)を行う。
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_type
、disk_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.sh
は root
ユーザー権限で、ruby_and_rails.sh
は vagrant
ユーザー権限で実行されます。
開発環境の構築
ローカルマシンのターミナル上で次のコマンドを実行します。
$ 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
エディタ(vim
や nano
など)で 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/
を開きます。次のようなページが表示されます。
右上の「ログイン」リンクをクリックするとログインフォームが現れます。メールアドレスとして taro@example.com
、パスワードに password
を入力してログインできれば成功です。
インスタンス(仮想専用サーバー)の削除
インスタンスを削除するには、ローカルマシンのターミナル上で以下のコマンドを実行します。
$ vagrant destroy