AWS Elastic Beanstalkを使って10分でSinatraアプリを動かす

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

こんにちは。望月です。
ちょっとしたアプリを作るためにSinatraでアプリを書くことにしたのですが、せっかくなのでEC2ではなくElastic Beanstalkを使って見ようと思いました。今日はその設定手順をまとめておきます。

前提知識

まずElastic Beanstalkで出てくる用語をいくつか確認しておきます。

  • Application : 文字通り、アプリケーションを管理する単位。Applicationのなかで、下で説明するEnvironmentを複数管理することが可能。
  • Environment : あるApplicationの中に所属する、ELBとEC2の組み合わせ。アプリケーションが動作する「環境」を指す。Environmentは複数作成可能なので、異なるバージョンのアプリケーションを稼働させておくことができる。

大事なことですが、「ビーントーク」ではなく、「ビーントーク」です(豆の木の意味)。

事前準備

手順は公式ドキュメントにも書いてあるのですが、前準備でやるべきことが少し多いのでまとめます。

Beanstalkを扱うためのツール群のインストールが必要です。ダウンロードページからダウンロードして、解凍します。

AWS_Elastic_Beanstalk_Command_Line_Tool___Sample_Code___Libraries___Amazon_Web_Services

$ unzip AWS-ElasticBeanstalk-CLI-2.6.0.zip -d ~/elasticbeanstalk
$ cd ~/elasticbeanstalk/eb/macosx/python2.7/
$ export PATH=$(pwd):$PATH

また、Beanstalkが使うクレデンシャルファイルを準備します。内容には適切なアクセスキーとシークレットキーを記述して下さい。

$ vim ~/.awscredential # 以下の内容を記載
AWSAccessKeyId=xxxxxxx.....
AWSSecretKey=yyyyyy......

$ export ELASTICBEANSTALK_URL=https://elasticbeanstalk.ap-northeast-1.amazonaws.com

Sinatraアプリの作成

まずは動作確認用として、最も簡単な形のアプリを作ってみましょう。

$ mkdir -p path/to/app
$ cd path/to/app

必要なのは3種類のファイルだけです。app.rbを以下の通り

require 'sinatra'

get '/' do
  'Hello World!'
end

次に、config.ruを次の通り作成します。

require './app.rb'
run Sinatra::Application

最後に、依存管理ファイルのGemfileを作成します。

source "http://rubygems.org"
gem 'sinatra'

動作確認用のアプリはこれで作成完了です。最後にローカルのGitリポジトリを作成しておきます。

$ git init && git add --all && git commit -m 'initial commit'

デプロイ

ここから、アプリケーションのデプロイ作業を行います。今回のデプロイにはGitを利用するので、手元の環境にGitが無い方は別途インストールが必要です。
まず初めに、最初にインストールしたBeanstalkツールの初期化設定を行います。ebコマンドを利用した対話的な初期化作業を行うことが出来ます。
先ほど作ったアプリケーションのディレクトリに移動して、eb initコマンドを実行します。

$ 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 (current value is "AKIAJ*****UPEIQ"): # 必須入力。アクセスキーを入力します。
Enter your AWS Secret Access Key (current value is "bEKSS*****9hD8i"):  # 必須入力。シークレットキーを入力します。
Select an AWS Elastic Beanstalk service region (current value is "Asia Pacific (Tokyo)").
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)
8) South America (Sao Paulo)
Select (1 to 8): 6 # 利用するリージョンに合わせて設定。
Enter an AWS Elastic Beanstalk application name (current value is "app"): # アプリケーション名
Enter an AWS Elastic Beanstalk environment name (current value is "app-env"): # Environment名
Select an environment tier (current value is "WebServer::Standard::1.0").
Available environment tiers are:
1) WebServer::Standard::1.0
2) Worker::SQS/HTTP::1.0
Select (1 to 2): 1
Select a solution stack.
Available solution stacks are:
1) 32bit Amazon Linux 2014.02 running PHP 5.5
2) 64bit Amazon Linux 2014.02 running PHP 5.5
...(中略)...
38) 64bit Amazon Linux 2014.03 running Ruby 2.0 (Passenger Standalone)
...(中略)...
46) 64bit Amazon Linux 2013.09 running Ruby 1.9.3
Select (1 to 46): 37 # 利用する言語とバージョンの種別を選択する。今回はRuby2.0 + Passengerで。
Select an environment type (current value is "SingleInstance").
Available environment types are:
1) LoadBalanced
2) SingleInstance
Select (1 to 2): 2 # ELB経由の複数サーバか、単一サーバかを選択する。
Create an RDS DB Instance? [y/n] (current value is "No"): n
Attach an instance profile (current value is "default-role"):
1) [Create a default instance profile]
2) default-role
3) [Other instance profile]
Select (1 to 2): 4 # EC2に割り当てるEC2 Roleを選択する

次に、上で設定したBeanstalkのApplicationとEnvironmentを作成します。eb startで実行します。

$ eb start
Starting application "app".
Waiting for environment "app-env" to launch.
2014-04-04 17:22:07	INFO	createEnvironment is starting.
2014-04-04 17:22:12	INFO	Using elasticbeanstalk-ap-northeast-1-019930502935 as Amazon S3 storage bucket for environment data.
2014-04-04 17:23:00	INFO	Created EIP: 54.xxx.xxx.xx
2014-04-04 17:23:04	INFO	Created security group named: awseb-e-zmzuxuypxn-stack-AWSEBSecurityGroup-VXLOTGA2CY9R
2014-04-04 17:23:57	INFO	Waiting for EC2 instances to launch. This may take a few minutes.
Application is available at "app-env-xxxxxxxxx.elasticbeanstalk.com".

コマンドが成功しない場合は、アクセスキーとシークレットキーの設定を一度見なおしてみてください。コマンドの実行が成功すると、最後にアプリケーションにアクセスするためのホスト名が表示されます。

いよいよアプリケーションのデプロイです。先ほどのebの設定で、gitの拡張であるaws.pushを通じてBeanstalkへのデプロイが利用できるようになりましたので、それを利用してデプロイします。

$ git aws.push
Counting objects: 7, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (7/7), 1.14 KiB | 0 bytes/s, done.
Total 7 (delta 0), reused 0 (delta 0)
remote:
To https://xxxxxxxxxxxxxxxx:20140404T083114Z6788789682d201f775387e91e5caefd491874d6df133a2ab256e2e9af10f89fd@git.elasticbeanstalk.ap-northeast-1.amazonaws.com/v1/repos/617070/commitid/34333836336436313435353863383535363137343433633830626330643536396133633736326231/environment/6170702d656e76
 + 53f9d02...43863d6 HEAD -> master (forced update)

デプロイができたら、先ほど出てきたURLにアクセスして確認してみましょう。

app-env-5s2eg3jupw_elasticbeanstalk_com

表示が確認できました。

まとめ

私は事前準備のインストールのところで少し躓きましたが、手順をまとめると本当に簡単にアプリケーションが動くようになりました。一度もSSHでアクセスしたり、インスタンスを起動したり、「サーバー」というものを意識しなくてよいのが魅力的ですね。引き続き、Beanstalkを使っていきたいと思います。