@kazsogaさんと少し話していて、表題の件、そろそろまとめたいね、ということで、まとめることにしました。今まで自分たちでやって来たことをまとめるのは、自分の脳みその整理にもなるので、いろいろと新しい気づきなんかもありました。
目次
ゴール
今回のまとめのごーるですが、ひとことでいえば、「Djangoを動かす」ことですね。データベースは、そのままSQLiteですませちゃうとして、まずは動かしてみるところまでいきたいと思います。
方針
基本的には、私のような技術にはずぶの素人でも大丈夫なレベルで、いっこいっこ、しかもデフォルトのままでいいやというところはよく考えずにすすめていきますので、プロフェッショナルな皆様からは”oh…”と思われることもあるかもしれませんが、そんなときは、ご指摘をいただければと思います。また@Kazsogaさんと一緒にやってますもので彼のサイトともリンクを作りながら進めていきます。二人のサイトが違うこともあるかもしれませんが、まぁ、そこは別の人間なのでご容赦を。
大まかな流れ
表題にも書きましたが、大きな流れとしては、こんな感じになります。
- AWSでインスタンスを作る
- Pythonをインストールする
- Djangoをインストールする
- Djangoを動かします
とりあえずは、プログラミングができる環境ができることになります。
やってないこと
やってないことだらけなのですけれども
- MySQL等のちゃんとしたデータベース
- Githubとかを使ったちゃんとしたチーム開発の準備
- 独自ドメインの設定とか
プログラミングができることはできるのですが、上記はちゃんとした方がいいように思います。ということで、ステップバイステップでやりましょう。
AWSでインスタンスを作る
@Kazsogaさんの記事は、すごく細かく書いてありますね。細かい部分は是非そちらをみていただくとして、こちらはざっくりと。
AWSのアカウント
持っていない人は作ってみてくださいね。ずいぶんと昔で記憶すらないのですが、通常お買い物しているAmazonのアカウントからAWSのアカウントを作れたような記憶がありますが、一応別のアカウントのようです。
管理画面
AWS Management Consoleというが、管理画面ということになります。全部英語なんでとりあえずひるまないようにしましょう。
ここから、EC2を選択します。Computeというカテゴリにある、EC2をクリックすると、EC2の管理画面が出てきます。この画面は、EC2 Management Consoleというらしいです。画面の中央部にCreate Instanceというカテゴリとともに、
Launch Instance
というボタンが大きくあるので、そこをクリックします。念のため、その下にある「Note: Your instances will launch in the Asia Pacific (Tokyo) region」などを見つつ、ふむふむと思いつつ、次に行きましょう。
Quick Startや、My AMIs等いくつかメニューが登場します。ここでAMIとは、Amazon Machine Image のことで、AWS用のマシンインスタンスの設定集といったところでしょうか。他の方の作ったAMIや、自分のAMIをいい感じで、保存、共有する事ができます。またAMIを販売することもできるようで、商売の種にできるかもしれないですね。
どれを使っても大差無いような気もしますが、何人かのエンジニアさんに聞いた所、とりわけ比較もしないでAmazon Linuxを使っちゃっているよん、ということで、一番上にあるAmazon Linux AMI 2015.03 (HVM), SSD Volume Type – ami-cbf90ecbを選択してみます。画面が遷移すると、項目が表示されます。AMIを基礎として、どんなマシンスペックにするか、選べるんですね。@Kazsogaさんのブログから、以下参照
- Family:インスタンスタイプの大まかな分類
- Type:インスタンスタイプと呼ばれるもの。頭文字の2文字が、そのインスタンスタイプを表している
- vCPUs:CPUの数
- Memory (GiB):メモリの容量
- Instance Storage (GB) :インスタンスで使用可能なローカルのインスタンスストアボリューム。インスタンスストア内のデータは、インスタンスの有効期間中だけのもので、消えてしまう。EBSとは、Amazon Elastic Block Storeの略。Amazonが用意している外部ストレージのような感じ。
- EBS-Optimized Available:EBSのパフォーマンス最適化に対応しているかどうかの模様。Amazon EBS 最適化インスタンスを参照。
Network Performance:ネットワークパフォーマンス。
最初は、ちっちゃくていいので、t2.microを選びます。ここで、Review and Launchとかしちゃってもいいかもしれませんが、ご興味のある方は、Configure Instance Detailsにすすみます。ここも先人の@Kazsogaさんのサイトを参照しつつ
- Number of instances:インスタンス数
- Purchasing option:余剰のEC2のインスタンスを入札で利用するというサービス。入札できないと、インスタンスがストップする
- Network:VPC(Virtual Private Cloud)のネットワーク設定
- Subnet:VPC(Virtual Private Cloud)のサブネット設定
- Auto-assign Public IP :Enableに設定するとPublic IP(グローバルIP)とPublic DNSが設定できる模様
- IAM role:IAMとはAWS Identity and Access Managementの略。ユーザ管理機能
ここで、重要そうなのは、IAM というやつで、ちょっと前に某エンジニアさんからも言われた「個人またはグループによるアクセスを安全にコントロールする」機能のことです。いわゆるアクセス権ですね。これがあると、外部の人にちょっといじってもらう時にもいいのかもしれません。
ここで、またインスタンスをローンチできるのですけれども、よく知るために、Add Storageに進みます。毎々、お世話になります@Kazsogaさんのブログを参照し、
- Type:ストレージを追加するとEBSが選択できる。ROOTとは、ルートデバイスボリュームと思われる
- Device:ボリュームの利用可能なデバイス名。ROOTの場合は、/dev/xvdaらしい。追加したストレージではいろいろと選択できる
- Snapshot:S3に格納されているEC2ボリュームのバックアップ
- Size (GiB):ストレージの容量
- Volume Type:SSDかMagnetic
- IOPS:1秒当たりの入出力操作の数。Volume TypeでSSDを選択すると数値が設定される
- Delete on Termination:EBSボリュームがEC2のインスタンスと独立せるかどうか
- Encrypted:スナップショットの暗号化の設定。デフォルトでは変更できず。
まあ、いろいろとあることを確認するぐらいで、次に(笑)。Tag InstanceにすすむとNameしか設定する場所がないですね。少しホッとします。これは、コスト配分タグってやつで、AWSのコスト計算をする際に、個別に分析するためのタグです。valueには、用途を書くといいよ!っということでしょうね。例えば、kazsoga web service01 などのようにするのでしょう。私は、hdkworks Wevserverとしました。
さらに、次のConfigure Security Groupの設定にすすみます。と、ここで、Warningが!出てませんか?ビビりますよね。設定項目で、Type「SSH」のSourceがAnywhereになっていることの警告。ワーニングの中身は、「どっからもいけるのは危ないから、ウチラのおすすめはIPアドレスで縛ることだよ」的な内容です。Security group nameとDescriptionのみ変更して、次にいっちゃいましょう。@Kazsogaさんのブログと微妙に違い、Review Instance Launchが表示されました。このReview Instance Launchでは最終的な設定をチェックするだけのものです。ワーニングとかでてきますが、それは、そのはず、先ほどの画面で世界中のどっからでもいけるようになっているからですね。が、まぁ、今回はそのままいけちゃいそうなので、インスタンスを起動します。
Launch !(ポチリ)
すると、key pairがどうとかこうとかという画面がでますよね。びっくり!しないでください。keyとかしんないよ!というのは当然、最初はkeyはありませんので、Create ket a pairを選択して、お好きな名前を入力、で、Download Key Pairを押すとkeyの.pemファイルなるものをがダウンロードしておきます。この鍵ファイルは、再度ダウンロードできないという大切な大切なものですので、お気をつけを。次に進むと、Launch Statusなる画面が出て、完成となります。ヨカッタですね。この画面には、アクセス方法などが書いてありますので、一度はじっくり読んでください。英語ですけど。View Instanceで一覧が見えますよ。
Pythonをインストールする
AWSインスタンスにログインする
さて、次にPythonをインストールしましょう。ここでも@Kazsogaさんにたよりっきりです。で、まずログインからいってみましょう。
まず、AWSのコンソールを覗いてあげると、先ほど作ったインスタンスがでているはずなんですね。おもむろに右クリックで出てくるコンテクストメニューで、connectを選んであげると、SSHかブラウザでログインするかを選ぶ画面が出てきます。ブラウザでログインができる!と思いましたら、MindTermなるソフトウェアをインストールしないといけないので、ここでは割愛します。MindTermがいいよという方はこちらを参照してください。
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/mindterm.html
まぁ、正直面倒かなと思っておりまして、私は普通にターミナルで、ログインした方がいいと思います。で、どうやるかですが、
なんて感じで、選んであげると、
- さっきダウンロードしたファイルと同じディレクトリにいきまして
- パーミッションを400にかえて
- で、パブリックIPにsshでつなげる
ということになります。具体的には、
$ chmod 400 hoge.pem
$ ssh -i hoge.pem ec2-user@XXX.XXX.XXX.XXX
という感じです。あっさりログインできちゃったのですが、皆様どうでしょうか?ログインできない!という方は、インスタンスの状態 Instance Stateがグリーンになっているかとか、確認してみてください。
いよいよPythonをインスト
やっとPythonをインストールします。 まずは、最新のPythonってなんじゃらほいということで、ここらへんを見てみましょう。
Index of /ftp/python/
↑ここは、適当にググればでてくると思うので、詳細は割愛です。Python2と3の違いあたりはここらへんを眺めて頂いて、かつ、どっちがいいかなんて話も割愛です。今回は、@kazsogaさんの「3.5もあるみたいなのですが、Python.orgのサイトをみて3.4.3が良さそう」を信じて、3.4.3をインストールします。大きな流れとしては、生まれたてのほやほやAmazon Linuxインスタンスに、必要となるファイルをダウンロードして、インストールするということになりますが、はるか昔じゃないとインストールなんかする経験がないのじゃないかとおもうgccからインストールします。
$ sudo wget https://www.python.org/ftp/python/3.4.3/Python-3.4.3.tgz
$ sudo tar zxfv Python-3.4.3.tgz
$ cd Python-3.4.3
$ sudo yum install gcc
$ sudo ./configure –prefix=/usr/local # –prefix=
$ sudo make
$ sudo make install
$ python3 -V
Python 3.4.3
念のため
$ python -V
Python 2.7.9
とかやると、あー、2も入っているのね、とかはわかります。
pipのインストールをする
ちょっとまて、pipでなんだよ!という方は、こちらを。基本的な流れとかは、Macでインストールしたときと同じです。違うのは、pipインストールの前に、いくつか必要なものを入れないとダメってこと。大きなくくりだとひとつが、Development tools、もうひとつがzlib-develなどです。で、インストールは、yumで呪文を唱えればラクラクです。
$ sudo yum groupinstall “Development tools”
$ sudo yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel
こんな感じで、必要な物を入れておきます。
$ make
$ sudo make install
$ curl -kL https://raw.github.com/pypa/pip/master/contrib/get-pip.py | python3
$ pip3 list
pip (6.0.8)
setuptools (12.0.5)
もしかしたAMIによっては、もうpip入っているよ!と怒られるかもしれませんが、そのときは、pip list, which pipあたりでちゃんとインストールできているか確認してみてください。
Djangoをインストールする
だいぶ疲れちゃった人もいるかもしれませんが、スムーズにいけば、ここまで20分かからないかなと思います。さきほどpipをインストールしましたが、そこまでできていれば、Djangoは、比較的簡単です。比較的簡単なんですが、ちょっと困ったことが発生します。
なにかというと、普通に考えれば、pip3 じゃんご!とかしてあげれば、すぐにインストールが終わるようなものなのですが、なぜかsudoコマンドが使えなくなってしまうという症状が出ることがあるのです。原因は、簡単で、PATHが初期化されてしまっているということらしいのですが、おそらく上記のpipインストールあたりで、なにか踏んじゃっているのだろうと思います。
で、ここでは、その原因究明を割愛しまして、直し方を書きます。Amazon Linuxの場合、rootのパスワードが最初は設定されていません。鍵ファイルでログインしましたものね。なので、まずrootのパスワードを設定します。
$ sudo passwd root
これでパスワードの設定が可能です。おわりましたら、
$ su
root$ visudo
とします。パスワードをきかれますが、先ほどのパスワードを入れてください。visudoで、viに入りますが、最後の方にある
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
に/usr/local/binを追加しておきます。
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
viの使い方とかは、こちらをご参照くださいませ。保存をすれば、これで、PATHの修正が終わりです。
軽やかにrootからexitして、インストールしましょう。
root$ exit
$ sudo pip3 install Django
となります。
pip3が古くてハマる
そういえば、pip3 listとかやっていると、
You are using pip version 6.0.8, however version 6.1.1 is available.
You should consider upgrading via the ‘pip install –upgrade pip’ command.
なんてメッセージが出ることがあります。おー、そうかそうか、とかいって、
$ pip install –upgrade pip
なんてやるとハマります。なんでかというと、pip3だからなんですね。
$ sudo pip3 install --upgrade pip
とやっていだけると、お後がよろしい感じで、インストールできます。
Djangoを動かします
いよいよ後半になってきましたが、Djangoを起動してみます。ここでも大きな流れを書きますが、
- Djangoのプロジェクトを作ります
- プロジェクトのデータをデータベースにマイグレートします
- スーパーユーザを作ります
- httpで通信ができるようにします
- サーバーを起動します
という感じです。最初に1〜3までを実行しましょう。ターミナルからの作業になりますが、プロジェクト名称を例えばhdkworksだとすると
$ django-admin.py startproject hdkworks
$ ls
$ cd hdkworks/
$ ls
$ python3 manage.py migrate
$ python3 manage.py createsuperuser
となります。かなりあっさり進んでしまうと思います。で、ここで、4の通信ができるように設定するのですが、AWSのコンソールを再度設定します。AWSのコンソールにログインしたら、
Security Group
を選択し、下部にあるInboundタブから、Routeの追加を行います。一瞬HTTPを追加すればいいように思うのですが、HTTPを選ぶと、ポートが80番固定になってしまうので、カスタムを選んで、8000を設定します。すぐに8000ポートがあくので、
$ sudo python3 manage.py runserver ec2-xx-xx-xxx-xxx.ap-northeast-1.compute.amazonaws.com:8000
ってな感じで、Webサーバーを動かしてください。
おもむろにブラウザを起動して、
http://ec2-xx-xx-xxx-xxx.ap-northeast-1.compute.amazonaws.com:8000
http://ec2-xx-xx-xxx-xxx.ap-northeast-1.compute.amazonaws.com:8000/admin
とかやると、動いているのがわかりますよ。/adminでは、スーパーユーザでログインもできますし、ユーザーの追加とかもできます。
感想とか
これで、本日のゴール、AWSで、Python3とDjangoを動かすが完結です。@kazsogaさんのサイトをよ〜く参考にさせてもらいましたが、なかなか楽しい日曜日でした。
とりあえずは、これで、Python3,Djangoのプログラミングで遊べるので、皆さん、ちょっと試してみたらどうでしょう?