一般社団法人Pythonエンジニア育成推進協会(以下、当協会)の顧問理事の寺田学です。 私は試験の問題策定とコミュニティ連携を行う立場です。 前回はPythonのバージョンの選択と、エディタについてお話ししました。 今回は作成したプログラムを動かすための環境についてお話ししたいと思います。
■作成したプログラムはどのように実行すればいいのか?
実のところを言えば、用途によってやり方が違うため、難しい部分があります。 Pythonを使う目的はさまざまですが、だいたいがデータ分析やWeb、スクリプトとして使うという3パターンに分かれると思います。
・データ分析、スクリプトとして使用する場合
ローカルやサーバ上でスクリプトとして動かすため、開発した後は、モジュールやパッケージを起動できれば動かせます。 また、毎日動かしたいならCron Jobを使用すればスクリプトを叩くだけで結果を求められますし、その保存先はモジュールの作り方で変更できます。 スクレイピングをしたいなら、スクリプトの保存先はローカルでもサーバでも動かせますし、定期的に作動させたり、ログインして動かしたりということもできます。
最近ではサーバレスとして、Docker上にイメージを作成して起動する方法や、CI/CDというジョブを動かす部分にPythonを組み込むことも可能です。これらはスクリプトレベルで扱われるもので、モジュールと同様に扱われるため、AWS LambdaやGoogle Cloud Functionsなど、サーバレスなものの上で起動することはそう難しくはありません。
・Webアプリケーションの場合
難しいのはWebのケースです。 PHPの場合は、Apacheがフロントエンドにあり、ドキュメントルート配下にPHPのファイルを保存すると、Apacheの設定によってPHPが動いてくれるという特性があります。 たとえば、Apacheのドキュメントルート配下に[index.php]ファイルを置いておくと、[index.php]が読み込まれたタイミングで、[index.php]がApacheプロセスの中で動作します。 CGIの場合は、ApacheにCGIを読むための仕組みがあるので、CGIの中に[.pl]拡張子のファイルを置くことで、Apacheのプロセスとして動いてくれるようになっています。
ではPythonでWebをどうするかというと、階層がたくさん存在するためややこしくなります。 ほとんどのケースでブラウザから来たリクエストをサーバが受け取った後、Pythonが作動して、要求に対して適切なものを返すための流れを作らなくてはなりません。
たいていの場合、WSGIサーバを仲介して、Pythonのモジュールやパッケージというスクリプトを動かすという仕組みにします。
WSGIサーバとは
Pythonのフレームワーク(Django、Flask等)を作る際、Webインターフェースの統一規格として存在するのがWSGI規格です。WSGI規格に則ったフレームワークの中で書かれたモジュールは、WSGIサーバで起動ができます。 ただ、WSGIは規格であり、仕様書のようなものであるため、WSGIサーバにも種類があります。 WSGIサーバで有名なものはgunicorn や uWSGIで、ほかにもありますが大体このどちらかが使用されています。
Webサイトはずっと起動している必要があるから…
PHPであればApacheがアプリケーションサーバとして起動できますが、ApacheはPythonに直接作用できません。そのため、WSGIサーバを起動し、Pythonのモジュールやパッケージが動作するようにすれば、リクエストが来るのを待つことができます。
そのためにはgunicornやuWSGIをサーバとし、フロントのApacheやNginxを経由してアクセスするような設定を書く必要があります。複雑になっていますが、この仕組みの方がわかりやすく、また、使いやすくなります。
よくある構成としては、Nginxがあり、gunicornがあり、フレームワークがあり、最後に自分が書いたソースコードがあるというものです。こうすることで、フレームワークの中に書いた自分のコードがロードされます。
■最近の傾向
従来であれば、フロントサーバ、アプリケーションサーバ、データベースサーバがあってという構成でしたが、昨今はAWS上で構築することも多く、データベースにはクラウドのRDSを、アプリケーションサーバにはDockerをホストするFargateを、フロントにはCDNであるCloudFrontを、静的ファイルにはS3をといったケースがよくあります。
特に、時代が変わったなと思う構成としては、Docker上にgunicornまでを用意し、Apache、Nginxを用意せずにCDNに任せるというパターンです。 また、AWS LambdaやGCP Functionsなどではgunicornのレイヤーが不要で、スクリプトを叩くための仕組みが決まっています。そのためスクリプトだけがあればいいという仕組みになっています。
たとえば、AWSの場合、AWS API Gatewayによってルーティングされ、適切なLambda Functionにアクセスするため、自分のやりたい処理だけを書くということが可能になっています。こうした仕組みは世の中に増えてきており、先に挙げたような面倒な多層の仕組みを忘れ、開発に注力し、パブリッククラウドに載せてしまうという方向にシフトしつつあります。
■さいごに
開発環境や動作環境は何をするにしても大事なので、自分でやりやすい環境を手に入れ、何度も自由に実行できるようにしてほしいと思っています。中途半端な環境は学習の妨げになります。クラウドでも何でもいいので、環境作りを疎かにせず、何度も作り直す意気込みでいろいろ試していってもらえればと思っています。
もちろん、環境構築だけでなく、とにかくプログラムを作ってみることが大事です。そうすることで習熟度を上げていくことができます。そして、基礎試験やデータ分析試験を学習の進捗確認にお使いいただければと思います。
[PR]提供:Pythonエンジニア育成推進協会