AWS Elastic Beanstalk と Rails で Hello World してみる【11日目】

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、クラスメソッドアドベントカレンダー【11日目】担当のやまがたです。

AWS Elastic Beanstalkとは

公式紹介ページはこちら AWS Elastic Beanstalk | アマゾン ウェブ サービス (AWS 日本語)

Elastic Beanstalk(以下EB)はAWS版のPaaSですがEC2やS3などAWSのリソースにアクセスしてカスタマイズすればかなり柔軟な運用への移行が可能なようです。
公式ページの冒頭に "簡単に開始でき、不足を感じることなく利用" と書いてありますが使ってみた印象は、まさにその通りでとても簡単に始められれます。僕はAWSの扱いにあまり慣れてませんがコマンドラインのツールも用意されているので、普段Railsを使っている方にもなじみやすく始められると思います。

今回はRailsでの使い方をご紹介しますが他にも、.NET、PHP、Python、Javaといった言語にも対応しています。
ちなみにRackサーバはApacheモジュールのPhusion Passengerを使用しているようです。

AWS Elastic Beanstalk Command Line Toolをインストールする

まずは eb というコマンドをインストールします。(※作業はMac OS Xで進めてきます)
以下のページからzipをダウンロードできます(gemがないのが残念><)
AWS Elastic Beanstalk Command Line Tool

が、しかしDLしてパスを通すだけなので今回はターミナルで進めていきましょう。
自分のホームディレクトリで以下のコマンドを実行してください。

$ cd ~
$ curl https://s3.amazonaws.com/elasticbeanstalk/cli/AWS-ElasticBeanstalk-CLI-2.2.zip -o AWS-ElasticBeanstalk-CLI-2.2.zip

DLが終わったら解凍してください。普段Finderから見えてしまうのが嫌だったので解凍後の名前の先頭には "."(ドット) をつけておきました。

$ unzip AWS-ElasticBeanstalk-CLI-2.zip
$ mv AWS-ElasticBeanstalk-CLI-2.2 .AWS-ElasticBeanstalk-CLI-2.2

解凍できたらパスを通します。僕はzshを使っていますがbashの場合はbachrcなどに読み替えてください。

$ echo 'export PATH="$HOME/.AWS-ElasticBeanstalk-CLI-2.2/eb/macosx/python2.7:$PATH"' >> .zshrc
$ source .zshrc

きちんとパスが通っているか以下 help で確認してみます。

$ eb --help
usage: eb {COMMAND} [options]

AWS Elastic Beanstalk Command Line Interface

positional arguments:
  COMMAND               init, start, status, stop, delete, update

optional arguments:
  -h, --help            show this help message and exit
  -I ACCESS_KEY_ID, --access-key-id ACCESS_KEY_ID
                        Your AWS Access Key ID.
  -S SECRET_ACCESS_KEY, --secret-key SECRET_ACCESS_KEY
                        Your AWS Secret Key.
-- 以下省略 --

これで eb コマンドが使えるようになりました!

Hello WorldするRailsアプリを作成する

ここでは単純にHello Worldを表示するだけなので細かい説明は割愛させて頂きます。
より詳しいRailsの解説はこちらの記事を御覧ください。

Railsアプリ作成を一気に

$ cd path/to/workspace
$ mkdir hello_world_on_eb
$ cd hello_world_on_eb
$ bundle init
$ vi Gemfile # => gem 'rails' のコメントを削除
$ bundle install --path vendor/bundle --without production
$ bundle exec rails new . --skip-bundle
$ vim Gemfile # => viewはhamlで書きたいので追加
$ bundle install

トップページを作成

$ bundle exec rails g controller hello index
$ vim config/routes.rb # => 自動で追加されたrouteを削除して root to: 'hello#index' を追加
$ rm public/index.html # => 静的なindex.htmlを削除
$ vim app/views/hello/index.html.haml

app/views/hello/index.html.haml

%h1 Hello World
%p
  Environment:
  = Rails.env
%p
  Time:
  = Time.now

なんとなく環境名と時間を表示させてみました。
http://localhost:3000 を開いて以下のページが表示されればHello Worldアプリは完成です。

EBの環境を作る

その前にまずgitリポジトリを作成しておきましょう。
.gitignoreの追加も適宜行なってください。(vendor/bundleのignoreを忘れずに!)

$ git init
$ vim .gitignore
$ git add .
$ git commit -m "Initial commit"

gitリポジトリを作成したらEBの環境を作成します。
対話的に進めて行けます。Access keyとSecret Access keyを聞かれるので用意しておいてください。

$ eb init
To get your AWS Access Key ID and Secret Access Key, 
  visit "https://aws-portal.amazon.com/gp/aws/securityCredentials".
  Enter your AWS Access Key ID: XXXXXXXXXXXXXXXXXXX
  Enter your AWS Secret Access Key: XXXXXXXXXXXXXXXXXXXXXXXXXX
  Select an AWS Elastic Beanstalk service region.
  Available service regions are:
  1) US East (Virginia)
  2) US West (Oregon)
  3) US West (North California)
  4) EU West (Ireland)
  5) Asia Pacific (Singapore)
  6) Asia Pacific (Tokyo)
  7) Asia Pacific (Sydney)
  Select:  (1 to 7): 6
  Enter an AWS Elastic Beanstalk application name (auto-generated value is "hello_world_on_eb"): 
  Enter an AWS Elastic Beanstalk environment name (auto-generated value is "helloworldoneb-env"): ymgt-helloworld-env

リージョンは6のTokyoを選択してapplication nameはそのままにenvironment nameはymgt-helloworld-envにしておきました。(環境名は23文字以下でないといけないっぽいです)
続けてSolution stackを聞かれますので64bitのruby 1.9.3を選択しました。

Select a solution stack.
Available solution stacks are:
1) 32bit Amazon Linux running PHP 5.3
2) 64bit Amazon Linux running PHP 5.3
3) 64bit Windows Server 2008 R2 running IIS 7.5
4) 64bit Windows Server 2012 running IIS 8
5) 32bit Amazon Linux running Tomcat 7
6) 64bit Amazon Linux running Tomcat 7
7) 32bit Amazon Linux running Tomcat 6
8) 64bit Amazon Linux running Tomcat 6
9) 32bit Amazon Linux running Python
10) 64bit Amazon Linux running Python
11) 32bit Amazon Linux running Ruby 1.8.7
12) 64bit Amazon Linux running Ruby 1.8.7
13) 32bit Amazon Linux running Ruby 1.9.3
14) 64bit Amazon Linux running Ruby 1.9.3
Select:  (1 to 14): 14

今回はDBを使用しないのでRDSの使用はNoと答えておきます。

Create an RDS DB Instance? [y/n]: n

.gitignoreの最後の行に.elasticbeanstalk/が追加されますのでcommitしておいてください。

準備が完了しましたので環境を起動させます。

$ eb start
Starting application "hello_world_on_eb".
Waiting for environment "ymgt-helloworld-env" to launch.
-- 以下省略 --

S3、load barancer、EC2やらが作られていくのがわかります。出力されるメッセージはちょっと見せられないですが…。
最後にelasticbeanstalk.comのドメインが出力されるのでアクセスしてみてください。起動直後は以下の様な画面のはずです。

以下のコマンドでEB環境の状況を確認できます。

$ eb status
URL : ymgt-helloworld-env-2jpbk8jpyy.elasticbeanstalk.com
Status  : Ready
Health  : Green

EBにデプロイする

EBの環境を作成するとアプリの.git/configにaws設定がどっさり追加されて、git aws.pushgit aws.config というエイリアスが使えるようになっています。
前者はデプロイに使用し、後者はAccess keyや、アプリ名等の変更が出来るようになっています。

それではgitを使ってデプロイしてみます。

$ git aws.push
Counting objects: 73, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (60/60), done.
Writing objects: 100% (73/73), 24.90 KiB, done.
Total 73 (delta 2), reused 0 (delta 0)
remote: 
To https://naisho
 * [new branch]      HEAD -> master

HEADからリモートのmasterへpushされました。リポジトリのURLは伏せておきましたがcommit idを使ったりしているのでとんでもなく長いですね。
この時点のstatusを確認してみます。(--verboseオプションをつけるとより詳細なステータスを確認できます)

$ eb status
URL : ymgt-helloworld-env-2jpbk8jpyy.elasticbeanstalk.com
Status  : Updating
Health  : Grey

Webの見た目はそのままですがステータスが変わりました。この時にbundle installrake db:migraterake assets:precompileを自動で行なっています。
少し待つとReadyステータスに変わりましたので、Webで確認してみます。

ちゃんと動いてます!

まとめ

EBは動かしている分だけ料金がかかってしまうので他のPaaSに比べると少し敷居が高く感じられますが、かなり簡単にデプロイできることがわかりました。
またAmazon Linux上で必要なパッケージなどはアプリのディレクトリに .ebextensions/.config というファイルを作成してYAML形式で記述しておけば使えるようになるようです。(詳しくはこちら)
次回はRDBも使って見たいと思います。

参考にしたサイト