Pythonの開発環境をMacローカルおよびオンライン(AWSのElastic Beanstalk、EC2)上に構築するための手順(所要時間1時間)

こんにちは、筋肉めがねです。

 

ある程度、機械学習、深層学習の基礎知識を勉強したら、次は自分でpythonを使ってコードを書き、何かしら動くものを作りたいですよね。ローカル環境だけで開発し、ローカルブラウザで結果を確認していても、実際にオンラインのweb上で本当に動くのかどうか試してみたい。

web上で実際に動くという事は確認できるんだけれども、毎度webにディプロイするのは手間がかかるので、ローカル環境でサクッとテストしたい。

ローカル環境、オンライン環境、どちらでもテストしたいですよね。

 

それで、僕が実際にローカルの開発環境を準備した手順、そしてオンライン(AWSのElastic Beanstalk)上に開発環境を準備した手順を書きます。

 

はじめてpythonを扱う方、はじめてAWSを扱う方には、ざっくり1時間ぐらいかかると思います。

それでは、はじめましょう。

 

f:id:KinnikuMegane:20180811112904j:plain

 

まずは、ローカルの開発環境を構築していきます。

ローカル開発環境に必要なツールのインストール

使用したMac OSはYosemite, 10.10です。

f:id:KinnikuMegane:20180807142504p:plain

 

まずは、Homebrewをインストールします。

Homebrewというのは、MacのOS上でソフトウェアのインストールを簡単に行うためのパッケージ管理システムの1つです。

Homebrewのページへ行き、コードをコピーし、Terminalに貼り付けます。そして、Enter。

f:id:KinnikuMegane:20180807142946p:plain

f:id:KinnikuMegane:20180807143728p:plain

5分程度でTerminal上の処理が終わります。

処理が終わったら、念のため、Homebrewがインストールされている事を改めて確認しましょう。確認方法は、Terminalにwhich brewとタイプしてEnter。

which brew

これで、Homebrewが正しくインストールされていれば、インストールされている場所のパスを返してくれます。

 

続いてpython3のインストールです。

Terminalで、brew install python3とタイプして、Enter。

brew install python3

数分程度で処理が終わります。

Homebrewの時と同じく、python3がインストールされている事を確認するには、Terminal上で、which python3とタイプしてEnter。

which python3

正しくインストールされていれば、インストールされている場所のパスを以下のように返してくれます。

/usr/local/bin/python3

 

そして、Homebrewを使用して、python3をインストールした場合、pip3というコマンドも一緒にインストールされているはずです。

pip3がインストールされているか確認するには、Terminalにwhich pip3とタイプしてEnterを押します。 

which pip3

正しくインストールされていれば、インストールされている場所のパスを以下のように返してくれます。

/usr/local/bin/pip3

 

続いてpython3でよく使用するライブラリ、および機械学習でよく使用するライブラリをインストールします。

Terminalに以下のコマンドを1行づつタイプし、Enter。全てインストールします。

pip3 install numpy #線形代数
pip3 install scipy #数式処理
pip3 install matplotlib #描画
pip3 install pandas #データ操作
pip3 install scikit-learn #機械学習用のパッケージ
pip3 install chainer #ニューラルネットワークを実装するためのパッケージ

 

そして、Mac上に複数の仮想環境を作る事のできるvirtualenvをインストールします。仮想環境って、要は、Macシステムに既にインストールされているデフォルトの環境の設定を変える必要なく、仮想環境を構築し、その中でアプリケーションを作り、さらに他のアプリケーションを作りたい時に、また別の仮想環境を構築する事のできる優れものです。では、仮想環境を作らないとどうなるか、と言うと、例えば、1つのアプリケーションでpython2を使いたい、もう一つのアプリケーションではpython3を使いたいっていう要望に答える事ができなくなるんですね。

 

Terminalに以下をタイプし、Enter。

sudo pip3 install virtualenv

virtualenvがインストールされているか確認するには、Terminalにwhich virtualenvとタイプしてEnterを押します。

which virtualenv

正しくインストールされていれば、インストールされている場所のパスを以下のように返してくれます。

/usr/local/bin/virtualenv

 

以上で、Macローカル開発環境を構築する上で必要なツールのインストールは完了しました。あとは、これらインストールしたものを使って、環境を整えれば、ローカルでサクサクっとwebアプリケーションの開発ができます。

  

ここで、少しだけMacのTerminalから離れて、ローカルでコーディングする時に役に立つエディターをインストールしましょう。数年前にphpでコーディングを勉強していた時は、sublimeを使っていましたが、今はgithubが提供しているAtomというエディターが有名らしいので、そちらをインストールします。

 

f:id:KinnikuMegane:20180807151326p:plain

 

インストールが終わったら、Atom上で少しコーディングをしてみました。コードがカラフルに見えて素敵ですね。

f:id:KinnikuMegane:20180811195040p:plain

  

それでは、これまでにインストールしたツールを使用し、環境設定をし、実際に一つのwebアプリケーションを作ってみます。

 

Macローカル環境の設定と最初のwebアプリケーション開発

まず、アプリケーションを作成します。

Terminalを開いて、好きな名前のディレクトリを作成します。 

mkdir myapp20180807

 

Terminal上で、作成したディレクトリ内へ移動します。

cd myapp20180807

 

 そして、ディレクトリ内で仮想環境を作ります。

virtualenv env

このコマンドにより、myapp20180807ディレクトリ直下に「env」フォルダが作られ、そして仮想環境に必要なファイル一式が作られました。

f:id:KinnikuMegane:20180808054355p:plain

 

ちなみに、後々pythonでコードを書いていく事になるんですけれども、pythonでコードを書いたら、myapp20180807フォルダ直下に置く事になります。(envと同じ階層)そして、そのコード(python)を実行したい時、またはpip3などをTerminal上で実行したい時は、Terminal上で、以下のコマンドをタイプする必要があります。

env/bin/python
env/bin/pip3

 ちょっと長いですよね。

 

そこで、先ほど作成した仮想環境をactivateする事により、python、pipt3などを実行するためのコマンドが短くなるんです。ショートカットですね。とても便利です。

という事で、仮想環境をactivateしましょう。

Terminalで以下のコマンドをタイプし、Enter。

source env/bin/activate

これで仮想環境がactivateされ、さらにショートカットが作成されました。

pip3を実行したい時は、

pip3

そして、pythonを実行したい時は、

python

とTerminal上で実行します。

この仮想環境はTerminalが開いている間のみ有効なので、もしTerminalを一度閉じ、あらためて開いた際には、再度、仮想環境をactivateする必要があります。

 

また、仮想環境を終了したい時は、Terminal上で、

deactivate

と実行すれば仮想環境は終了します。仮想環境を終了すると、先ほど作ったショートカットもdeactivateされます。

 

もう一度、仮想環境をactivateしましょう。

source env/bin/activate

 

ここで、Terminalを見てみると、仮想環境名(この場合は「env」が表示されている事が確認できます。仮想環境がアクティブな状態だと、この様に環境名が表示されるんですね。

f:id:KinnikuMegane:20180808060140p:plain

 

さて、仮想環境の構築ができました。

 

続いて、Flaskというフレームワークをinstallします。

Terminal上で以下のコマンドをタイプしてEnter。

pip3 install flask

FlaskはWebアプリケーション開発に必要な最低限の機能を提供しているmicroframeworkで、とても便利なフレームワークです。一方、microframeworkdなので、複雑なアプリケーションに必要となる「入力フォームの検証」などは入っていないようです。それは、後に僕が上級者になった時に、他のフレームワークを使うかどうか検討しようと考えてます。

 

さて、ここで最初のコードを書いていきます。

 

Atomを開いて以下のコードを書いていきます。

from flask import Flask
application = Flask(__name__)
application.debug = True
@application.route(‘/’, methods=[‘GET’])
def hello():
 return ‘<p>Hello world</p>’
if __name__ == “__main__”:
 application.run()

 

書いたら、application.pyという名前で保存し、先ほど述べたように、myapp20180807フォルダ直下に置きます。

ここで、次のステップに進む前に、上に書いたコードを1行1行理解していきましょう。

1行目は、Flask packageをインストールするためのコードです。pythonの機能を拡張させて、webアプリケーション開発に役立つ機能を提供してくれます。

from flask import Flask

 

2行目は、Flaskでアプリケーションを作る、という意味のコードです。

application = Flask(__name__)

 

3行目は、エラーをブラウザ上に表示するためのコードです。

本番環境では、ブラウザにエラーを表示する、というのはbad practiceなので、application.debugはFalseに設定しますが、テスト環境ではTrueにしておきます。

application.debug = True

 

4行目は、ユーザーがwebアプリケーションのルートにアクセスしたら、その次の5, 6行目を実行する、というコードです。

@application.route(‘/’, methods=[‘GET’])

 

そして、5, 6行目は、Hello worldという文字数を返してくれる、というコードです。

def hello():
 return ‘<p>Hello world</p>’

 

7, 8行目は、Flaskアプリケーションを初期化する、というコードです。

if __name__ == “__main__”:
 application.run()

 

それでは、書いたコードを実行してみましょう。

Terminal上に以下をタイプし、Enter。

python application.py

 

すると、Terminalに以下のような文字列が表れます。 

f:id:KinnikuMegane:20180811053618p:plain

これが何を表しているか、というと、要は、http://127.0.0.1:5000/というローカル環境でflaskアプリケーションがたちあがった、と教えてくれています。

嬉しいですね。

 

それでは、ブラウザにこのURLをタイプして確認してみましょう。

f:id:KinnikuMegane:20180811053859p:plain

ブラウザ上で、Hello worldが確認できました。

素晴らしい。

 

これで、初めてのwebアプリケーションをローカルの開発環境で構築する事ができました。

 

 

5分ぐらいラテマキアートでも飲みにいきましょうか。 

 

f:id:KinnikuMegane:20180811121624j:plain

 

リフレッシュできましたか。

それでは、オンラインで開発環境を構築していきます。

 

オンライン開発環境(AWSのElastic beanstalk、EC2上)の構築

AWS上に環境を構築していくので、Amazonでアカウントを作りましょう。既にAmazonでショッピングをされている方はアカウントをお持ちですね。そちらのアカウントでログインできます。

 

f:id:KinnikuMegane:20180811122946p:plain

 

AWSでは、現在12ヶ月の無料プランを提供してくれているので、そちらを使用していきましょう。

アカウント作成の詳細については、冗長になってしまうので割愛します。例え12ヶ月の無料プランとはいえ、クレジットカードの情報を載せる必要があります。

 

アカウントが作成できたら、先ずはAdmin userを作成します。

 ページの左上にある「Services」ボタンを開き、そこからIAMを選びます。

f:id:KinnikuMegane:20180811123511p:plain

 

そして、「Users」から「Create New Users」を選びます。

僕の画面では「Add user」となっていますが、これは既にユーザーの登録がされているためですので、はじめてユーザーが登録される場合は、「Create New Users」というボタンがあります。

f:id:KinnikuMegane:20180811123814p:plain

 

そして、「Programmatic access」と「AWS Management Console access」の両方を選び、「Next Permissions」を押します。

f:id:KinnikuMegane:20180811124927p:plain

 

次のページでは、「Administrators」を選んで、「Next: Review」ボタンを押します。

f:id:KinnikuMegane:20180811124448p:plain

そして、最後のページで、「Create user」ボタンを押します。

f:id:KinnikuMegane:20180811125020p:plain

これで、Admin権限を持つユーザーが作られました。

ちょっと待ってください。このページを閉じる前に、「Download .csv」を押して、後にMacのTerminalからAWSへアクセスする時に必要なキー(Access Key IDとSecret access kay)を保存しておきましょう。

 

f:id:KinnikuMegane:20180811125123p:plain

 

続いては、セキュリティグループを作っていきます。

IAMの画面から、「Groups」を選び、「Create New Group」を押します。

f:id:KinnikuMegane:20180811125739p:plain

 

Group Nameを入力したら、「Next Step」ボタンを押します。

f:id:KinnikuMegane:20180811125936p:plain

 

「AdministratorAccess」にチェックを入れて、「Next Step」ボタンを押します。

f:id:KinnikuMegane:20180811163512p:plain

 

そして、「Create Group」ボタンを押し、セキュリティグループを作成しましょう。

f:id:KinnikuMegane:20180811163714p:plain

以下のように、「testBlogGroup」という新しいグループが作成されました。

f:id:KinnikuMegane:20180811163852p:plain

 

ここで、先に作成したAdminユーザーを、今しがた作成したグループに紐づけます。 

作成したグループにチェックを入れ、「Group Actions」のドロップダウンリストから「Add Users to Group」を選びます。

f:id:KinnikuMegane:20180811164310p:plain

 

そして、先ほど作ったユーザーにチェックを入れ、「Add Users」ボタンを押します。

f:id:KinnikuMegane:20180811164242p:plain

 

これで、セキュリティグループとAdminユーザーを紐づける事ができました。

f:id:KinnikuMegane:20180811164446p:plain

 

AWS側での設定はこれで完了です。

良い調子ですね。

 

あれっ、記事のタイトルにも書いてあるElastic Beanstalkというのはどこで設定するの?という疑問が残りますよね。Elastic Beanstalkの設定は、勿論AWSのウェブサイトでもできるんですが、今回はMacのTerminalから設定しましょう。

Elastic Beanstalkって、要は、webアプリケーションを開発するにあたって、何を準備していいか分からないというヒト向けに、これを使っておけば諸々の問題が一切生じず、ストレスフリーにコーディングに打ち込めますよ、というものなんですよね。Elastic Beanstalkはサーバーへかかる負荷であったり、いろんな事を管理してくれます。だから、開発環境設定を一つ一つ自分でできる、というヒトでなければ、Elastic Beanstalk一択で良いのでは、と思います。

そして、もう一つ。記事のタイトルにEC2とありますが、これはAWSが提供している一つのレンタルサーバーと考えれば良いですね。EC2についても、MacのTerminalから設定します。

 

さて、残りはMacのTerminal上で、Elastic Beanstalkの設定、EC2の設定を行い、AWSへ接続し、そして、先ほど作ったapplication.pyという最初のコードをAWS上のサーバーへディプロイすれば最初のオンラインwebアプリケーションの構築が完了です。

 

一旦、休憩しましょうか。

でも、あんまりラテマキアートを飲みすぎない様にしないといけませんね。お腹がチャプチャプしちゃうので。

f:id:KinnikuMegane:20181002050828j:plain

 

それでは、 ここから一気に最後までいきましょう。

 

ローカルでwebアプリケーションが立ち上がっている場合は、Terminal上で、Ctrl+Cを押し、一旦ローカルのアプリケーションを止めましょう。

 

それでは、Terminal上で、先ほど作ったアプリケーションのフォルダ内にいる事を確認し(僕の場合はmyapp20180807というフォルダ)、MacのTerminalで仮想環境をactivateします。

source env/bin/activate

 

ここで、先ほどインスールしたFlaskなどパッケージのバージョンを記載したファイルを1つ作っておく必要があります。

これをしておく事で、後ほどElastic Beanstalkが、どのパッケージをEC2へインストールすれば良いか理解してくれるんですよね。

Terminal上で以下をタイプし、Enter。

pip3 freeze > requirements.txt

 

これで、myapp20180807フォルダの直下にrequirements.txtができました。

f:id:KinnikuMegane:20180811172918p:plain

 

作成されたファイルをAtomで開いてみましょう。

各種パッケージのバージョンが記載されています。

f:id:KinnikuMegane:20180811173055p:plain

 

続いて、Elastic BeanstalkをMacにインストールします。

Mac上にGlobalにElastic Beanstalkをインストールするため、先ずは仮想環境をdeactivateします。

deactivate

 

そして、AWSのElastic Beanstalkをインストールします。

pip3 install awsebcli

 

それではもう一度仮想環境をactivateしましょう。

source env/bin/activate

 

ここから、Elastic BeanstalkをTerminal上で設定していきます。

先ずは、Elastic Beanstalkの初期化から。

eb init --interactive

 

ここで、先ほどAWSのウェブページからダウンロードしたAccess key IDとSecret access keyを入力します。この二つのキーを使って、後にTerminalからAWSへアクセスする時に、先ほどのAWS上のAdminユーザーと紐付けるわけですね。

f:id:KinnikuMegane:20180811190708p:plain

ちなみに、ここで設定をした内容はルートディレクトリ(一般的には、Homeフォルダ)直下の".aws"という各フォルダの中の"config"ファイルに格納されます。 

f:id:KinnikuMegane:20180811200346p:plain

configファイルをAtomで開いてみると、先ほど入力したKeyの情報がこのファイル内に格納されている事が確認できます。

f:id:KinnikuMegane:20180811200512p:plain

 

続いて、Terminal上で、Elastic Beanstalkを作るリージョンを選んで、と表示されるので、僕はドイツに住んでいるので、5) Frankfurtを選びます。

f:id:KinnikuMegane:20180811185000p:plain

 

リージョンを選んだのち、いろいろと質問を聞いてくるので、回答していきましょう。

f:id:KinnikuMegane:20180811175430p:plain

まず、アプリケーションの名前を設定してくれ、と聞いてるので、デフォルトの3とタイプし、Enter。そして、好きな名前をタイプしましょう。僕はmyapp20180807_ebとしました。

続いて、Pythonを使っているよね、と確認してきているので、yとタイプし、Enter。

次に、pythonのプラットフォームバージョンを聞いてきているので、デフォルトの1をタイプし、Enter。

最後に、SSHをセットアップしますか、という問いには、ここではnとタイプし、Enter。

 

SSHとはリモートコンピュータと通信するためのプロトコルです。認証部分を含めてネットワーク上の通信が全て暗号化されるため、安全に通信することができます。今時点では、そこまでのセキュリティは求めていないので、一旦sshの設定はなし、で進めます。

 

ここまで終わると、アプリケーションフォルダの中(僕の場合はmyapp20180807)に".elasticbeanstalk"という隠れフォルダが作られています。

f:id:KinnikuMegane:20180811180734p:plain

 

その中に、config.ymlというファイルが作られています。このファイルはとても重要なので、中身は変えないようにしましょう。ちなみにファイルをAtomで開いてみますと、こんなコードが書かれています。

f:id:KinnikuMegane:20180811180748p:plain

この中でも特に、application_nameは大事です。これは先ほどTerminalでElastic Beanstalkの設定時に使ったアプリケーション名と一致しているはずです。これが一致していないと動作しません。そして、environment(この時点ではnull)も後々大事になってくる、という事を頭の片隅にでも入れておきましょう。

 

それでは、オンライン開発環境構築の最後のステップです。

AWSのEC2上でインスタンスを作ります。

eb create

 

そして、環境名を設定します。

f:id:KinnikuMegane:20180811181525p:plain

 

続いて、DNS CNAMEを設定してね、と聞いてきます。これは、urlの一部なので、変な名称、もしくは個人が特定される名称は避けた方が良いかもしれませんね。

f:id:KinnikuMegane:20180811182100p:plain

そして、load balancerのタイプを聞いてくるので、デフォルトの1をタイプし、Enter。

load balancerとは、AWSのEC2上のサーバーにかかる負荷をモニターし、必要に応じて負荷を制御してくれる、というElastic Beanstalkが提供している優れた機能です。

 

3分ぐらい待ってみましょう。

 

すると、Terminal上で、successfully launchedというメッセージが表示されます。

 

f:id:KinnikuMegane:20180811182647p:plain

 

これで、AWSへディプロイできました。

webブラウザを起動し、Terminal上へ表示されているURLへアクセスしてみましょう。

 

f:id:KinnikuMegane:20180811182855p:plain

 

無事にHello worldという文字列が確認できましたね。

できました。

これでガリガリとコーディングをできる環境が整いました。

 

でも、ちょっと待ってください。

更新したコードをAWSへディプロイするために毎度毎度この一連の流れをしなきゃいけないの、という疑問がありますよね。

そんな事は勿論ありません。

 

ということで、コードを更新したのち、どうやってAWSへ簡単にディプロイするのか書いていきます。

 

これで本当に最後です。

 

更新したコードをAWSへディプロイする方法

先ほど、"Hello world"と出力しましたが、これを"Hello world by Kinniku Megane"として、AWSへディプロイしていきましょう。

 

先ずはAtomでapplication.pyファイルを編集します。

f:id:KinnikuMegane:20180811192103p:plain

 

そして、Terminal上で、以下をタイプしてEnter。

eb deploy

 

たったこれだけございます。

そして、ディプロイが完了すれば、その旨、通知されます。

f:id:KinnikuMegane:20180811193227p:plain

 

ここで1点だけ、気をつけておくべきポイントです。

ここまでで、幾度もTerminal上で、AWSのenvを設定してきていると、自分がディプロイしたい環境にディプロイできているのか、分かりませんよね。つまり、どのURLをチェックすれば良いのか分からないんです。

僕の場合、ここまでで、テストを含めて3つ(この記事には載ってないですよ。)のenvを作ってきたので、AWSのElastic Beanstalkのコンソールへアクセスすると、3つの環境がある事が分かります。

f:id:KinnikuMegane:20180811193750p:plain

 

f:id:KinnikuMegane:20180811193808p:plain

 

では、この3つの環境のうちのどこにディプロイされたか、と言うと、それは先ほど少しだけお話させていただいたconfig.ymlファイルの中に書いてあるんです。

f:id:KinnikuMegane:20180811194014p:plain

f:id:KinnikuMegane:20180811194034p:plain

environment: myapp20180807-eb-dev-test2とあるので、ここにディプロイされている事が分かります。それでは、この環境に相当するURLをAWSのElastic Beanstalkのコンソールで確認し、ブラウザで確認してみましょう。

f:id:KinnikuMegane:20180811194231p:plain

無事に、"Hello world by Kinniku Megane"という文字列が表示されました。

 

以上で終わりでございます。

お疲れ様でございました。 

 

まとめ

最後までお読みいただき本当にありがとうございます。

はじめてコーディングをする場合、そして新しい言語を使い始めようとする場合、どうしても開発環境を構築する、という事に時間をそがれ、そしてモチベーションがそがれる事がありますよね。本当は早くガリガリとコーディングして、それをテストしたいのに、と。そんな方にお役に立てればと思い、この記事を書いてみました。

まだまだ駆け出しのブロガーではありますが、今後ともよろしくお願いします。

それでは、僕と一緒に楽しいpython開発生活を送っていきましょう。