Develop with pleasure!

福岡でCloudとかBlockchainとか。

BeanstalkにRailsアプリをデプロイしてみた。

【AWS発表】 AWS Elastic Beanstalk - Rubyのサポート開始、さらにVPC統合も可能に - Amazon Web Services ブログと遂にBeanstalkがRubyにも対応したので、早速RailsアプリをBeanstalk使ってデプロイしてみた。

環境構築

コマンドラインでBeanstalkを使用するには、ebというツールとgitが必要になる。
ebはAWS Elastic Beanstalk Command Line Tool : Sample Code & Libraries : Amazon Web Servicesから入手可能。インストールは簡単で、解凍しebファイルへのパスを通すだけ。Linux版はpython 2.7用と3用のファイルがあるので自分の環境に合わせてパスを通せばOK。

Railsアプリの作成とGitリポジトリの初期化

$ rails new beanstalk-rails
$ cd beanstalk-rails
$ git init && git add -A && git commit -m "Initial commit"

Beanstalkの設定の初期化

eb initでBeanstalkの設定を対話形式で入力していく。

$ 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: アクセスキーを入力
Enter your AWS Secret Access Key: シークレットアクセスキーを入力
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)
Select:  (1 to 6): 6
Enter an AWS Elastic Beanstalk application name (auto-generated value is "azuchi"): beanstalk-rails
Enter an AWS Elastic Beanstalk environment name (auto-generated value is "beanstalk-rails-env"): 
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) 32bit Amazon Linux running Tomcat 7
5) 64bit Amazon Linux running Tomcat 7
6) 32bit Amazon Linux running Tomcat 6
7) 64bit Amazon Linux running Tomcat 6
8) 32bit Amazon Linux running Python
9) 64bit Amazon Linux running Python
10) 32bit Amazon Linux running Ruby 1.8.7
11) 64bit Amazon Linux running Ruby 1.8.7
12) 32bit Amazon Linux running Ruby 1.9.3
13) 64bit Amazon Linux running Ruby 1.9.3
Select:  (1 to 13): 13
Create an RDS DB Instance? [y/n]: n

入力が終わると設定した内容が、.elasticbeanstalk/configファイルに保存される。

アプリケーションの起動

↓のコマンドでアプリケーションを起動する。

$ eb start
Warning. File "config" has incorrect access permission and can be accessed by other users.
Starting application "beanstalk-rails".
Waiting for environment "beanstalk-rails-env" to launch.
2012-11-06 13:56:39	INFO	createEnvironment is starting.
2012-11-06 13:56:45	INFO	Using elasticbeanstalk-ap-northeast-1-711951283832 as Amazon S3 storage bucket for environment data.
2012-11-06 13:57:19	INFO	Created load balancer named: awseb-e-w-AWSEBLoa-1C93AOM4FU3B2
2012-11-06 13:57:30	INFO	Created security group named: awseb-e-w4zz97d3pc-stack-AWSEBSecurityGroup-1ETCRJ7LMUT6G
2012-11-06 13:57:34	INFO	Created Auto Scaling launch configuration named: awseb-e-w4zz97d3pc-stack-AWSEBAutoScalingLaunchConfiguration-1KP3OBOI5Y087
2012-11-06 13:58:39	INFO	Waiting for EC2 instances to launch. This may take a few minutes.
2012-11-06 13:58:39	INFO	Created Auto Scaling group named: awseb-e-w4zz97d3pc-stack-AWSEBAutoScalingGroup-1IFGQ642U17HR
2012-11-06 14:03:58	INFO	Created Auto Scaling group policy named: arn:aws:autoscaling:ap-northeast-1:711951283832:scalingPolicy:62dca3bc-ba1b-4dc9-bb77-2d7a8d84da22:autoScalingGroupName/awseb-e-w4zz97d3pc-stack-AWSEBAutoScalingGroup-1IFGQ642U17HR:policyName/awseb-e-w4zz97d3pc-stack-AWSEBAutoScalingScaleDownPolicy-9O8SY68CN8LD
2012-11-06 14:04:00	INFO	Created CloudWatch alarm named: awseb-e-w4zz97d3pc-stack-AWSEBCloudwatchAlarmLow-1BGEZ0W8YNVPF
2012-11-06 14:04:02	INFO	Created Auto Scaling group policy named: arn:aws:autoscaling:ap-northeast-1:711951283832:scalingPolicy:cc3a81be-daeb-43e6-a861-1bddafa0eb86:autoScalingGroupName/awseb-e-w4zz97d3pc-stack-AWSEBAutoScalingGroup-1IFGQ642U17HR:policyName/awseb-e-w4zz97d3pc-stack-AWSEBAutoScalingScaleUpPolicy-7CJAA5A1H23I
2012-11-06 14:04:05	INFO	Created CloudWatch alarm named: awseb-e-w4zz97d3pc-stack-AWSEBCloudwatchAlarmHigh-J8GOWT217X11
Application is available at "beanstalk-rails-env-suc5xqma3h.elasticbeanstalk.com".

処理の流れとしては

  1. S3に環境データを格納するBucket作成
  2. ELBを作成
  3. セキュリティグループを作成
  4. AutoScalingの設定を作成
  5. CloudWatchのアラームを作成

な感じか。この辺はRubyでも他の言語のBeanstalkでも同じなんろうな。

アプリが起動すると↓なWebページが立ち上がってる。

MamagementConsoleでも↓のように確認できる。

デプロイ

これで準備が整ったのでRailsアプリケーションをBeanstalkの環境へデプロイする。

$ git aws.push

このgitコマンドでローカルのコミット内容がBeanstalkに反映されるみたい。ManagementConsoleのBeanstalkの対象環境のイベントを確認し、イベントが「Environment update completed successfully.」になていたらaws.pushした内容が反映され↓のおなじみの画面が確認できる。
※WebサーバとAPサーバは、それぞれnginxとPassengerみたい。


何故 git aws.pushでBeanstalkへの反映が可能になってるのか不思議に思ったけど、全て.git/configに定義されてあった。eb initした際に設定してるんだろう。

アプリケーションの停止は↓

$ eb stop
Terminate environment? [y/n]: y
Stopping environment "beanstalk-rails-env". This may take a few minutes.
2012-11-06 14:12:40	INFO	terminateEnvironment is starting.
2012-11-06 14:13:03	INFO	Deleted CloudWatch alarm named: awseb-e-w4zz97d3pc-stack-AWSEBCloudwatchAlarmHigh-J8GOWT217X11 
2012-11-06 14:13:05	INFO	Deleted Auto Scaling group policy named: arn:aws:autoscaling:ap-northeast-1:711951283832:scalingPolicy:cc3a81be-daeb-43e6-a861-1bddafa0eb86:autoScalingGroupName/awseb-e-w4zz97d3pc-stack-AWSEBAutoScalingGroup-1IFGQ642U17HR:policyName/awseb-e-w4zz97d3pc-stack-AWSEBAutoScalingScaleUpPolicy-7CJAA5A1H23I
2012-11-06 14:13:07	INFO	Deleted CloudWatch alarm named: awseb-e-w4zz97d3pc-stack-AWSEBCloudwatchAlarmLow-1BGEZ0W8YNVPF 
2012-11-06 14:13:09	INFO	Deleted Auto Scaling group policy named: arn:aws:autoscaling:ap-northeast-1:711951283832:scalingPolicy:62dca3bc-ba1b-4dc9-bb77-2d7a8d84da22:autoScalingGroupName/awseb-e-w4zz97d3pc-stack-AWSEBAutoScalingGroup-1IFGQ642U17HR:policyName/awseb-e-w4zz97d3pc-stack-AWSEBAutoScalingScaleDownPolicy-9O8SY68CN8LD
2012-11-06 14:13:11	INFO	Waiting for EC2 instances to terminate. This may take a few minutes.
2012-11-06 14:14:20	INFO	Deleted Auto Scaling group named: awseb-e-w4zz97d3pc-stack-AWSEBAutoScalingGroup-1IFGQ642U17HR
2012-11-06 14:14:24	INFO	Deleted Auto Scaling launch configuration named: awseb-e-w4zz97d3pc-stack-AWSEBAutoScalingLaunchConfiguration-1KP3OBOI5Y087
2012-11-06 14:14:28	INFO	Deleted security group named: awseb-e-w4zz97d3pc-stack-AWSEBSecurityGroup-1ETCRJ7LMUT6G
2012-11-06 14:14:30	INFO	Deleted load balancer named: awseb-e-w-AWSEBLoa-1C93AOM4FU3B2
Stop of environment "beanstalk-rails-env" has completed.

アプリケーションの削除は↓

$ eb delete
Delete application? [y/n]: y
Deleted application "beanstalk-rails".

Ruby環境のカスタマイズ

デプロイする際にRubyの環境をカスタマイズする仕組みもあるみたい。プロジェクトディレクトリ直下に.ebextensionsというディレクトリを作成し、その中にカスタマイズ内容を定義した*.config系のファイルを配置すればそれらの内容を実行してくれると。configファイルの設定内容は↓な感じ。

# ↓アクセス情報を定義する場合
option_settings:
  - option_name: AWS_SECRET_KEY
    value: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
  - option_name: AWS_ACCESS_KEY_ID
    value: AKIAIOSFODNN7EXAMPLE	

# アプリケーションデプロイ前に走らせるrakeタスクを定義する場合
container_commands:
  01deploy:
    command: rake my_deployment_tasks

設定可能な項目はCustomizing and Configuring AWS Elastic Beanstalk Environments - AWS Elastic Beanstalkに定義されてる。yumやapt使ったパッケージのインストールやユーザの作成、サービスの起動なんかもできる。簡易版のChefみたいだなー。
あと↑で設定したoption_settingsとかはRailsから↓みたいに環境変数へ取得できるみたい。

access_key = ENV['AWS_ACCESS_KEY']
secret_key = ENV['AWS_SECRET_KEY']

自前でEC2のインスタンスとか立ちあげなくて良く、アプリを素早く確認できるのは便利だなー。