AWS Elastic Beanstalk と Rails で Hello World してみる【11日目】
こんにちは、クラスメソッドアドベントカレンダー【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.push と git 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 install、rake db:migrate、rake assets:precompileを自動で行なっています。
少し待つとReadyステータスに変わりましたので、Webで確認してみます。
ちゃんと動いてます!
まとめ
EBは動かしている分だけ料金がかかってしまうので他のPaaSに比べると少し敷居が高く感じられますが、かなり簡単にデプロイできることがわかりました。
またAmazon Linux上で必要なパッケージなどはアプリのディレクトリに .ebextensions/.config というファイルを作成してYAML形式で記述しておけば使えるようになるようです。(詳しくはこちら)
次回はRDBも使って見たいと思います。
参考にしたサイト