Elastic BeanstalkでPythonのアプリケーションを動かしてみる

Amazon Web Service(AWS)のElastic BeanstalkでPythonがサポートされました。
Announcing AWS Elastic Beanstalk support for Python, and seamless database integration | AWS Blog
というわけで、試してみる。

開発環境の準備

手元の環境はVMware上のUbuntu12.04。aptでPython2.7とRuby1.8とGitはインストール済み。
ElasticBeanstalkを使うために、コマンドラインツールをインストールする。
以下のページからzipアーカイブをダウンロード。
AWS Elastic Beanstalk Command Line Interface (Newer Version Available) : Sample Code & Libraries : Amazon Web Services
適当な場所に展開して、パスを通しておく。ebコマンドはPython2.7かPython3.0で動作するらしい。また、コマンドラインツールに含まれるgitのサブコマンドの実行にはRubyも必要になる。

$ unzip AWS-ElasticBeanstalk-CLI-2.1.zip
$ sudo mv AWS-ElasticBeanstalk-CLI-2.1 /opt/
$ export PATH=$PATH:/opt/AWS-ElasticBeanstalk-CLI-2.1/eb/linux/python2.7
$ eb --version
AWS Elastic Beanstalk Command Line Interface v2.1

exportの部分は.bashrcなどに書いておくといいかも。sudoが使えないならユーザーディレクトリ以下に置いてaliasで使うとか。

gitリポジトリを作る

適当な名前(myapp)のgitリポジトリを作る。

$ mkdir myapp
$ cd myapp/
$ git init .

ElasticBeanstalkを設定する

ebコマンドでElasticBeanstalkを設定する。
initを実行すると、各種アプリケーションの設定を聞かれる。
AWS Access Key IDとAWS Secret Access Keyが必要。運用環境で使うならIAMで作成したものを使ったほうがいいかも。
アプリケーションを動かすリージョンは、今回はAsia Pacific(Tokyo)を使ってみる。
solution stacksは64bitのPythonを選択。
とりあえずRDSは使わない。

$ eb init
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 (Tokyo)
Select:  (1 to 5): 5
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
Select:  (1 to 9): 9
Create an RDS DB Instance? [y/n]: n
Updated AWS Credential file at "/home/tokibito/.elasticbeanstalk/aws_credential_file".

これでファイルが.elasticbeanstalk/configというパスで作成される。

アプリケーションサーバーの起動

eb startコマンドで、S3やRDS、ELB、アプリケーションサーバーなど用意、設定されて起動する。これがコマンド一発なのはうれしい。

$ eb start
Starting application "myapp".
Waiting for environment "myapp-env" to launch.
2012-08-20 22:39:09     INFO    createEnvironment is starting.
2012-08-20 22:39:16     INFO    Using elasticbeanstalk-ap-northeast-1-*********** as Amazon S3 storage bucket for environment data.
2012-08-20 22:39:47     INFO    Created load balancer named: awseb-e-g-AWSEBLoa-***********
2012-08-20 22:39:59     INFO    Created security group named: awseb-e-***********-stack-AWSEBSecurityGroup-***********
2012-08-20 22:45:35     INFO    Created Auto Scaling launch configuration named: awseb-e-*********-stack-AWSEBAutoScalingLaunchConfiguration-***********
2012-08-20 22:46:36     INFO    Waiting for EC2 instances to launch. This may take a few minutes.
2012-08-20 22:46:36     INFO    Created Auto Scaling group named: awseb-e-********-stack-AWSEBAutoScalingGroup-***********
2012-08-20 22:46:39     INFO    Created Auto Scaling group policy named: arn:aws:autoscaling:ap-northeast-1:**********:scalingPolicy:********-****-****-****-***********:autoScalingGroupName/awseb-e-*********-stack-AWSEBAutoScalingGroup-*********:policyName/awseb-e-*********-stack-AWSEBAutoScalingScaleDownPolicy-**********
2012-08-20 22:46:43     INFO    Created CloudWatch alarm named: awseb-e-*********-stack-AWSEBCloudwatchAlarmLow-*********
2012-08-20 22:46:46     INFO    Created Auto Scaling group policy named: arn:aws:autoscaling:ap-northeast-1:*********:scalingPolicy:********-****-****-****-***********:autoScalingGroupName/awseb-e-*********-stack-AWSEBAutoScalingGroup-**********:policyName/awseb-e-***********-stack-AWSEBAutoScalingScaleUpPolicy-**********
2012-08-20 22:46:49     INFO    Created CloudWatch alarm named: awseb-e-**************-stack-AWSEBCloudwatchAlarmHigh-**********
Application is available at "myapp-env-a3ijzgvwzt.elasticbeanstalk.com".

"*"になってるところは英数のIDが表示されている。最後に表示される "myapp-env-a3ijzgvwzt.elasticbeanstalk.com" の部分がアプリケーションにアクセスするためのドメイン名になる。
表示されたドメイン名のURLにWebブラウザでアクセスしてみるとWelcome画面が表示される。

eb statusコマンドで、アプリケーションサーバーの状態を確認できる。

$ eb status
URL     : myapp-env-a3ijzgvwzt.elasticbeanstalk.com
Status  : Ready
Health  : Green

アプリケーションのデプロイ

実際にPythonのアプリケーションをデプロイしてみる。
wsgirefのdemo_appを動かしてみる。
application.pyという名前でファイルを作成する。

application.py
from wsgiref import simple_server
application = simple_server.demo_app

作成したファイルをコミットして、git aws.pushコマンドを実行する。

$ git add .
$ git commit -m "wsgiref demo_app"
$ git aws.push
remote: 
To https://**************:************************@git.elasticbeanstalk.ap-northeast-1.amazonaws.com/repos/**********/myapp-env
 * [new branch]      HEAD -> master

pushしてから反映されるまでに少し時間がかかるかも。
というわけでデプロイできたものを見てみる。

動いた。demo_appなので環境変数が表示される。アプリケーションサーバーはApache/mod_wsgi

感想

思ったよりも自動で設定してくれる項目が多いので、かなり楽に使えそう。
ただ、うまくデプロイできなかった場合に解決まで結構大変かもしれない(デプロイに時間かかるし..)
Djangoも動かそうと思ったけど、ちょっとはまってなかなか解決できなかったのでひとまずあきらめた。
gitコマンドからデプロイできるので、自動化が楽にできそうな点はうれしい。
自動スケールアウトも設定してくれるみたいだし、同じPythonのPaaSインフラであるGoogleAppEngineと比べると、いろんなパッケージのインストールができたり、Tokyoリージョンを選べばレイテンシが低かったりするところはうれしいかも。
サーバーダウンからの復帰とか各種サービスのスケールアウトの上限に関してはAppEngineのほうに少し分があるのかなー。
何にせよPythonアプリケーションを動かすインフラの選択肢としては、十分ありですね。