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で使うとか。
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アプリケーションを動かすインフラの選択肢としては、十分ありですね。