Python (+ Django) アプリケーションを簡単に公開する方法
弊社ではサーバーサイドのアプリケーション開発にPythonという言語とDjangoというフレームワークを用いております。(Pythonエンジニア絶賛募集中です!)
PythonはMost Popular Programming Languages of 2014という記事で1位となっている開発言語ですが日本ではあまりPython人口が多い気がしないのが現状であり、実際、主要なLL (Lightweight Language) をGoogleで「勉強会 (開発言語)」という具合に検索してみたところ、以下のような結果となっています。
言語 | 件数 |
PHP | 約3,620,000件 |
Ruby | 約962,000件 |
Perl | 約427,000件 |
Python | 約425,000件 |
PHPの1/10とまではいかないですが、それに近い差があり、Rubyの1/2以下、そして、まさかのPerlにも負けている状態となっています。
(Perlにも負けているとは、今回初めて知りました…。)
そこで今回、簡単にPython+Djangoで作成したアプリケーションを公開することが可能な PaaS (Platform as a Service) を紹介したいと思います。
PythonやDjangoについては、このブログでまとめなくても良質な情報がいくらでもあるのでその辺りについては触れません。
参考
Python:Python 2.7ja1 documentation
Django:Django 1.4 documentation
Google App Engine
https://developers.google.com/appengine/?hl=ja
Googleが提供しているPaaSです。
最近、話題のSnapchatも利用しているのだとか。
利用開始には携帯電話キャリアのメールアドレスとクレジットカードの登録が必要となります。
・アプリケーション作成:https://appengine.google.com/start
・SDK (GoogleAppEngineLauncher) ダウンロード:Google App Engine SDK for Python
上記の手順を済ませSDKを起動し作成したアプリケーションの設定をすることで、ローカルで作成したアプリケーションを動作させることが可能となります。
デフォルトはwebapp2というWAF (Web Application Framework) なのですが、下記を参考にDjangoで動かすことが可能となります。
Google App Engine with Django and Python
環境はPython2.7+Django1.4をサポートいるようですが、実験的にDjango1.5も入っているようです。(参照:Third-party Libraries in Python 2.7)
作成したアプリケーションをデプロイすると、「(登録したアプリケーション名).appspot.com 」というドメインとして公開されますが、DNS側の設定とGoogle Appsを利用し、独自ドメイン(のサブドメイン)で公開することも可能です。(参照:Using a Custom Domain)
AWS Elastic Beanstalk
http://aws.amazon.com/jp/elasticbeanstalk/
こちらは Amazon Web Service (AWS) が提供しているPaaSです。
使用方法については下記を参照することにより、特に難しいこともなく始められるかと思います。
AWS Elastic Beanstalk for Python
BeanstalkはAWSが提供している以下のサービスを活用し、サービスの環境を簡単に構築することができます。
・Amazon Elastic Cloud Compute(Amazon EC2)
・Amazon Simple Storage Service(Amazon S3)
・Amazon Simple Notification Service(Amazon SNS)
・Elastic Load Balancing
・Auto Scaling
・Amazon Relational Database Service(Amazon RDS)
過負荷時や負荷が収まった時はAuto Scalingが発動してApplication Server (EC2) のインスタンスを増減してくれたり、ログ(AccessLog/ErrorLog)を定期的にS3に移動するなどの処理も簡単な設定だけでやってくれるので、インフラ側の運用経験が無い方でも利用しやすく、アプリケーション開発に(ある程度)専念できるようになっています。
(PaaSなら当たり前の話かもしれませんが。)
1つアドバイスとしてはDB(例えばRDS )はBeanstalkの1環境とは別に契約して用意しておいた方が良いかと思います。
理由としてはBeanstalkの環境設定を誤り、サービスの環境を破壊してしまい、二進も三進もいかなくなってしまった場合、別の環境を立ち上げ、アプリケーションをデプロイし、別契約しておいたDBに接続することで、簡単に復旧することができます。
もし、Beanstalの1環境としてRDSを作成した場合、旧環境のRDSのsnapshotを取り、そのsnapshotを新環境で使用し、などの手間が発生し復旧までの時間が大分掛かってしまうかと思います。
と、偉そうにアドバイスしてしまいましたが、実は筆者の経験談だったりします。
自分は事前にそういうことが発生するのではないかという野生の勘が働き、予めRDSだけ別契約していた為、このような障害が発生した際、ダウンタイムを短くすることができました。
またもう1つの良い点としましてはサービスの更新時、別環境に新しい版のアプリケーションをデプロイしておき、別契約した本番のDBに接続しひと通りの動作確認を終えた後、DNS(例えばAmazon Route 53 ) の変更で、ドメインの向き先を新しい環境に向けることでスムーズな更新が可能となります。
(同じ要領でActiveとStandbyの環境を用意しておいて、障害時に切り替えるなどして、ダウンタイムを短くする事にも応用可能。)
最後に
Google App EngineやAWS Elastic Beanstalkを利用し、手軽にPython+Djangoでのアプリケーション開発を試してみてください。