開発 備忘録 2015年5月版 AWS, Python3, Djangoでサーバを立ち上げる件

[fusion_builder_container hundred_percent=”yes” overflow=”visible”][fusion_builder_row][fusion_builder_column type=”1_1″ last=”yes” spacing=”yes” center_content=”no” hide_on_mobile=”no” background_color=”” background_image=”” background_repeat=”no-repeat” background_position=”left top” border_size=”0px” border_color=”” border_style=”” padding=”” margin_top=”” margin_bottom=”” animation_type=”” animation_direction=”” animation_speed=”0.1″ class=”” id=””][fusion_text]

前提と全体的な流れ

すでにこれまでいくつかAWS,Python,Djangoの記事はかいているので、すでに動いているAWSインスタンスがある人向けに、AWSのインスタンスをまるっとコピーしないで、DjangoのAppsを稼働させるには的なお話が前提となります。
全体的な流れとしては、

  1. AWSのインスタンスを新しく作る
  2. コピー元AWSのインスタンスを確認する
  3. pipの機能でrequirements.txtを作成する
  4. tar を作る
  5. requirements.txtをダウンロード
  6. tar をダウンロード
  7. pipでrequirements.txtの環境を再現
  8. tarを展開
  9. 展開したmanage.pyでrunserver

という感じですすめたいと思います。
[/fusion_text][/fusion_builder_column][fusion_builder_column type=”2_5″ last=”no” spacing=”yes” center_content=”no” hide_on_mobile=”no” background_color=”” background_image=”” background_repeat=”no-repeat” background_position=”left top” border_size=”0px” border_color=”” border_style=”” padding=”” margin_top=”” margin_bottom=”” animation_type=”” animation_direction=”” animation_speed=”0.1″ class=”” id=””][fusion_imageframe lightbox=”no” lightbox_image=”” style_type=”none” bordercolor=”” bordersize=”0px” borderradius=”0″ stylecolor=”” align=”none” link=”” linktarget=”_self” animation_type=”0″ animation_direction=”down” animation_speed=”0.1″ hide_on_mobile=”no” class=”” id=””] [/fusion_imageframe][fusion_imageframe lightbox=”no” lightbox_image=”” style_type=”none” bordercolor=”” bordersize=”0px” borderradius=”0″ stylecolor=”” align=”none” link=”” linktarget=”_self” animation_type=”0″ animation_direction=”down” animation_speed=”0.1″ hide_on_mobile=”no” class=”” id=””] [/fusion_imageframe][fusion_imageframe lightbox=”no” lightbox_image=”” style_type=”none” bordercolor=”” bordersize=”0px” borderradius=”0″ stylecolor=”” align=”none” link=”” linktarget=”_self” animation_type=”0″ animation_direction=”down” animation_speed=”0.1″ hide_on_mobile=”no” class=”” id=””] [/fusion_imageframe][/fusion_builder_column][fusion_builder_column type=”3_5″ last=”yes” spacing=”yes” center_content=”no” hide_on_mobile=”no” background_color=”” background_image=”” background_repeat=”no-repeat” background_position=”left top” border_size=”0px” border_color=”” border_style=”” padding=”” margin_top=”” margin_bottom=”” animation_type=”” animation_direction=”” animation_speed=”0.1″ class=”” id=””][fusion_text]

1.AWSのインスタンスを新しく作る

ここが一番長かったりしますが、一番単純といえば単純です。なによりも日本語化されたコンソールが、なんとなく安心感を醸し出します(笑)
AWSのアカウントを持っていない方は、早速作って頂いて、AWSのコンソールを表示します。一番左上にある「EC2」というメニューがAWSのインスタンスというかサーバーになります。
ここをクリックして、EC2のメニューである「EC2ダッシュボード」に入ります。中程にある「インスタンスの作成」ボタンを押します。
インスタンスの作成ボタンを押すと、クイックスタートというメニューと共に、いくつかのインスタンスのOSの種類を選択する画面が表示されます。
 
最初は、いろいろと悩むのですが、慣れてくると、何も考えずにAmazon Linuxを選択する方が多いように思います。かく言う私たちも最近は特に議論もなくAmazon Linuxを選択しています。
ちょっと画面がちっちゃいですが、一応はりつけておきました。[/fusion_text][/fusion_builder_column][fusion_builder_column type=”1_1″ last=”yes” spacing=”yes” center_content=”no” hide_on_mobile=”no” background_color=”” background_image=”” background_repeat=”no-repeat” background_position=”left top” border_size=”0px” border_color=”” border_style=”” padding=”” margin_top=”” margin_bottom=”” animation_type=”” animation_direction=”” animation_speed=”0.1″ class=”” id=””][fusion_text]EC2インスタンスのOSの種類を選んだ後は、「ステップ2 インスタンスタイプの選択」にうつります。ここらへんになってきますと、日本語化されているので、なんとなく安心感を実感できます。
ステップ2インスタンスの種類
お試しで使えるt2.microってやつで十分だと思います。ここで、「確認と作成」として一気につくってしまう方法もありますが、あえて次の手順を選びます。
「次の手順:インスタンスの詳細の設定」を選びます。ステップ3という表記とともに、インスタンスの詳細の設定になりますが、ここでは、設定項目を確認するくらいで次へと進みます。
ステップ3インスタンスの詳細の設定
ステップ4は、ストレージの追加になります。ここでは、少し注意が必要です。2015年5月現在、EC2のt2.microには、汎用SSD,プロビジョンドIOPS、マグネティックの3種類が選択できるようになってきます。汎用SSDでいいじゃんという気持もしますが、この汎用SSDは、AWSの1アカウントで30GiB以下が無料で、それ以上になると有料となるそうです。プロビジョンドIOPSはそもそも有料らしく、マグネティックは無料だというお話で、今回はマグネティックを選択しました。
ステップ4ストレージの追加
サイズは、適当でいいのですが、デフォルトのままにしました。デフォルトのサイズは、8GiB〜10GiBで微妙にばらついている気もしますが、都度変わる程度に思っていたほうがいいように思います。
次へとすすむと、「ステップ5 インスタンスのタグ付け」になります。インスタンスのタグ付けは、簡単に言えば、名前や識別名称をつけるようなものです。あとで変更も可能なのですが、個人的には「test」とかいう名称ではなく都度目的をはっきりさせて名称を決定して上げた方がいいんじゃないかなと思います。まぁ、適当につけちゃってもいいです、別に。
ステップ5インスタンスのタグ付け
次に「ステップ6 セキュリティグループの設定」になります。セキュリティグループ、というとユーザグループの管理のような印象も持ちますが、実際はそうではなくて、ファイヤーウォールのルールセットになります。早い話が、ポートの開け閉めです。ポートってなんだよ、という方は、こちらをどうぞ。ポート番号 – wikipedia
ステップ6セキュリティグループの設定
このポート番号の設定は、あたりまえですが大切で、開けすぎるとダメで、閉めすぎるとなにもできません(笑)。このエントリでのEC2は、Webサービスなんかを立ち上げるのが目的でしょうから、カスタムTCPルールで8000番、httpで80番あたりをあけておくといいかなと思います。
ここで、ちょっと慣れてきた「次へ」とおすと突然ダイアログボックスが表示されます。すこしびっくりしますよね。内容は、「汎用SSDから起動する」の設定です。
ステップ6ダイアログボックス
ちょっとびびりますが、日本語化されたAWSなら安心で、じっくりよんでから選択しましょう。早い話が、本当にマグネティックでいいの?汎用SSD方がいいんじゃない?という内容のようですが、ここは初志貫徹で、マグネティックを継続します。ただ・・・マグネティックが無料というのは、私達の認識違いかもしれないので、皆さん、自己責任で選択しちゃっていただけるといいかなと思います。
次のステップ7は、いよいよ大詰めのインスタンス作成の確認です。
ステップ7インスタンス作成の確認
これまで設定されてきた内容が記載されていますので、確認をしてもらって、次へとやると、キーペアの作成というダイアログボックスが表示されます。
このキーペアの作成は、すっごく大事で、AWSのEC2インスタンスにログインをするための情報というか、ファイルになります。
キーペアの作成
キーペア名というのを設定すると、キーペアのダウンロードができるようになります。このキーペアのファイルは、拡張子が.pemになっていまして、とても重要なファイルです。このファイルを保存して、ターミナルで指定し、AWSのEC2インスタンスにログインすることになります。キーペアのダウンロードを選択すると、Macの場合 ~/Downloadsとかに入ります。日本語のディレクトリ名で、ダウンロードでしょ?と言われそうですが、ターミナルからだと~/Downloadsになります。ダウンロードが完了したら、一応pemファイルを確認しておくとよいでしょう。
余談ですが、ダウンロードしたファイルのアクセス権限を後ほど変更します。chmodというコマンドで変更しますので、その旨ちょっと頭の片隅においておきます。
そんな感じで、すすめると、ようやくEC2インスタンスの作成のすべての作業が完了したことになります。すぐにEC2インスタンスが使えればいいのですが、実はできあがるまで、ちょっとだけ時間がかかります。作成中には、「現在作成中です」と親切に表示がでます。さすが日本語化、助かりますね。
作成ステータス
以上で、AWSのEC2インスタンスの作成の手順が終わりになります。[/fusion_text][fusion_text]

2.コピー元のAWSのインスタンスを確認する

今回のエントリでは、すでにあるEC2インスタンスのDjyangoをごちゃっと持ってきて動かしちゃうのがゴールなので、コピー元のEC2インスタンスを確認します。
先ほどのAWSアカウントと異なるアカウントの方は、一旦ログアウトしてEC2インスタンスを確認してもいいですが、おもむろにターミナルを立ち上げて、コピー元のpemファイルのディレクトリに移動して、ログインしちゃうのがいいと思ったりします。
具体的には、こんな感じ。
$ ssh -i コピー元の.pem ec2-user@コピー元のパブリックDNS.com
「コピー元の」って書いてあるところは、適時直してください。万が一、エラーとかでちゃって入れない人は、pemファイルのアクセス権限で読み込めない可能性がありますので、
$ chmod 400 鍵の名前
とか、やるといいかもしれません。ログインができたら、ls、pip listとかして、いろいろと見てみます。pipとか?の方は、こちらをどうぞ
 

3.pipの機能でrequirements.txtを作成する

ここまでで環境の確認ができましたら、コピー元のEC2インスタンスのpipを使って、環境を書き出します。書き出すファイルのファ入り名称は、requirements.txt なんていうファイル名がよく使われます。
コマンドは、至って簡単でして、
$ pip freeze > requirements.txt
だけです。lsあたりで、間違いなく、 requirements.txt が存在することを確認したら、中身を見てみましょう。more でもlessでもcatでもいいので、中身を見ます。
余談ですが、more と less と catの違いはこちらを参照いただけると。端的に言えば、catだけ、ファイルを連結して表示できるのですが、moreとlessは、スクロールができるのがいい感じです。
まぁ、なんだったらviで開いてもいいです。
 

4.tarを作る

DjangoのAppsのディレクトリをまとめてどかんと移動させるために、いわゆるたーぼーるを作ります。tarコマンドのご説明は、こんな感じで。具体的には、
$ tar -cvf 圧縮ファイル名.tar ディレクトリ名/
みたいにします。最後の/は、つけてもつけなくても同じみたいです。ここまでで、requirements.txtとtarファイルができたと思います。

5.tarをダウンロード & 6.tarをダウンロード

 
ということで、作成されたファイルをダウンロードするのですけども、scpというコマンドでダウンロードします。scpは、ファイルのアップロードもできるのですが、具体的には、
ファイルのダウンロード
$ scp -P 22 -i 鍵ファイル ec2-user@ドメイン:/home/ec2-user/requirements.txt ~/Downloads/
ファイルのアップロード
$ scp -P 22 -i 鍵ファイル ~/Downloads/requirements.txt ec2-user@ドメイン:/home/ec2-user/
とします。requirements.txtはファイルの名称なので、適宜変更してもらっても大丈夫です。またec2-userというのは、AWSでAmazon Linux AMIのインスタンスを立ち上げた場合、最初に作られるユーザーです。
まずは先ほど立ち上げていたターミナルとは別にターミナルを立ち上げます。Macのターミナルの場合、command+Nで、新しいターミナルウィンドウが起動します。command+Tで、ターミナルがタブで開きます。
ということで、command+Nで、新しいターミナルを起動して、scpコマンドでダウンロードします。ダウンロードですから、
$ scp -P 22 -i XXXXX.pem ec2-user@XXXXX.com:/home/ec2-user/xxxxx.tar ~/Downloads/
こんな感じになりますね。同じように、tarファイルもダウンロードします。
[/fusion_text][fusion_text]

7.pipでrequirements.txtの環境を再現

あとちょっとですので、がんばりましょう。まずは、新しい環境で、

  • python3.X
  • pip
  • Development tools
  • その他(zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel)

などの環境準備をします。ざーっと書いてしまいますが、
$ 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
$ sudo make
$ sudo make install
これで、python3.Xがインストールされます。途中、端折っていますが、一行ずつ、コマンドを入力してくださいね。さらに続けて
$ sudo yum groupinstall “Development tools”
$ sudo yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel
$ sudo make
$ sudo make install
これで、必要なものがインストールされたことになります。今回、一番重要なものは、pipなのですけども

  • python2.xのpip
  • python3.xのpip3

が、インストールされています。pipについては、こちらをご覧いただきたく。pipの使い方
$ pip list -o
などとやると、アップグレードが必要なソフトウェアが表示されます。ここで、sudo pip3 install・・・とやりたくなるのですが、その前に、pip3がインストールされたディレクトリにpathを通さないといけません。ちょっと面倒なので、これもざーっと書いてしまいますが、
$ sudo passwd root ←rootのパスワードを設定します
$ su ←rootになります
$ visudo ←sudoコマンドのための設定ファイル編集
という感じです。Defaultsという言葉を検索してもらいたいのですが、
/Defaults
としたうえで、
n 次を検索
N 前を検索
で、Defaults secure_pathに /ur/local/binを追加します。具体的には、こんなふうにしました。
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
記述を追加したら、:wqとして保存してください。完了したら、

$ sudo pip3 install pip -U

 
とやるといいかと思います。list -oで表示されたのを適時どうぞ。ここまでで、環境ができてきたので、requirements.txtをアップロードします。前述したとおり、scpを使ってアップロードします。
$ scp -P 22 -i 鍵ファイル ~/Downloads/requirements.txt ec2-user@ドメイン:/home/ec2-user/
requirements.txtは、~/Downloadsにある前提です。アップロードができたら、
$ sudo pip3 install -r requirements.txt
とします。python2.xを使いたい方は、pipとすると良いと思います。不要なモジュールがある場合には、requirements.txtをviなどで編集し、該当する行を削除すれば問題ありません。
[/fusion_text][fusion_text]

8.tarを展開

いよいよtarを展開します。さきほどscpコマンドをつかったアップロード
ファイルのアップロード
$ scp -P 22 -i 鍵ファイル ~/Downloads/xxxxx.tar ec2-user@ドメイン:/home/ec2-user/
で、tarをアップロードしておいてください。tarの展開は、
$ tar -xvf ファイル名
となります。ファイルが展開されていることを確認します。

9.展開したmanage.pyでrunserver

いよいよ最後に
 
$ sudo python3 manage.py runserver ec2-xx-xx-xxx-xxx.ap-northeast-1.compute.amazonaws.com:8000
とします。
[/fusion_text][/fusion_builder_column][fusion_builder_column type=”3_4″ last=”no” spacing=”yes” center_content=”no” hide_on_mobile=”no” background_color=”” background_image=”” background_repeat=”no-repeat” background_position=”left top” border_size=”0px” border_color=”” border_style=”” padding=”” margin_top=”” margin_bottom=”” animation_type=”” animation_direction=”” animation_speed=”0.1″ class=”” id=””][fusion_text]これで、すべての工程が終わりました。パブリックDNSのURLを表示すると、ブラウザで表示されると思います。/adminとすると、Djangoの管理画面が表示されます。
 
admin
 
AWSのコンソールが日本語になっているので、だいぶわかりやすくなりました。EC2インスタンスも微妙にアップデートされているので、時々、新しくインスタンスを作りなおしてみたいなと感じました。
今回ご紹介した以外にも、Djangoの環境を再現する方法として、EC2インスタンスをまるっとコピーしちゃうなんてのもできますが、今回のように一から環境を作るほうが勉強になるかなと感じました。
[/fusion_text][/fusion_builder_column][fusion_builder_column type=”1_4″ last=”yes” spacing=”yes” center_content=”no” hide_on_mobile=”no” background_color=”” background_image=”” background_repeat=”no-repeat” background_position=”left top” border_size=”0px” border_color=”” border_style=”” padding=”” margin_top=”” margin_bottom=”” animation_type=”” animation_direction=”” animation_speed=”0.1″ class=”” id=””][fusion_text][/fusion_text][/fusion_builder_column][/fusion_builder_row][/fusion_builder_container]