【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".
処理の流れとしては
- S3に環境データを格納するBucket作成
- ELBを作成
- セキュリティグループを作成
- AutoScalingの設定を作成
- CloudWatchのアラームを作成
な感じか。この辺はRubyでも他の言語のBeanstalkでも同じなんろうな。
デプロイ
これで準備が整ったので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のインスタンスとか立ちあげなくて良く、アプリを素早く確認できるのは便利だなー。