Help us understand the problem. What is going on with this article?

AWS Cloud9上でPython3 + Django + MySQL環境を構築する手順

More than 1 year has passed since last update.

はじめに

Python3 + Django + MySQLでペアプログラミングをする必要が生じたので、ペアプログラミングしやすいと評判のCloud9で環境構築してみたのですが、予想以上に難航しました。
特にPython周りについては、数か月前に書かれた記事の内容と実際の環境が違っていることが多くて大変でした。AWSの変化が早すぎるのでしょうね。おそらくこの記事の賞味期限もとても短いはずなので、鵜呑みにしないようご注意ください。

Cloud9とは

Cloud9はブラウザさえあれば利用できる統合開発環境(IDE)です。2016年にAmazonに買収され、現在はAWS Cloud9という名称になっています。以前はc9.ioというドメイン上でユーザー登録できましたが、現在はAWSからしか登録できなくなっているようです。c9.io版のCloud9とAWS版のCloud9は見た目も機能もかなり違います。

こちらがc9.io版のCloud9です。黒い。
image.png

AWS版はこちら。白い。
image.png

前提条件

  • AWSのアカウントを取得していること。
  • ペアプログラミングする場合は人数分のIAMアカウントが必要。

目標

  • Cloud9上でPython3, Django, MySQLを利用可能にする。
  • Djangoチュートリアルを一通り実施する。
  • Share機能を利用してペアプログラミングを可能にする。

IDEの環境を新規作成する

AWSのダッシュボードからCloud9を検索して下の画面を表示します。
image.png
Create environmentをクリックします。

image.png
プロジェクト名を適当に入力してNext stepをクリック。

image.png
デフォルトのまま次へ。

image.png
Create environmentをクリックすると環境が作成され(少し時間がかかります)、IDE画面に遷移します。

Python3の設定

pythonコマンドをPython3系にする

Cloud9のPythonは2系がデフォルトになっているので3系に変更します。ネット上で見つけた色々な記事は、書かれていることと実際の状況が全然違っていて、調査するのが大変でした。書かれた時点では正しい情報だったのだと思います。

まず右上の歯車アイコンからPreferenceを開いて、Python Supportをクリックします。
image.png

次にPython Version:をPython 2からPython 3に変更します。

次にPYTHONPATH:の内容を確認します。私の環境では下記のようになっていました。

/usr/local/lib/python2.7/dist-packages:/usr/local/lib/python3.4/dist-packages:/usr/local/lib/python3.5/dist-packages

IDE右下のターミナルで実際に存在するパスを調べてみます。

 $ cd /usr/local/lib
 $ ls
python2.7  python3.6
 $ ls python*
python2.7:
site-packages

python3.6:
site-packages
 $ 

なんと、正しいパスがひとつもない・・・。ということでPYTHONPATH:を下記のように修正します。

/usr/local/lib/python3.6/site-packages:/usr/local/lib/python2.7/site-packages

次に/usr/binに存在するpythonコマンドとシンボリックリンクを調べます。
現時点では下記の通りでした。

 $ ls -l /usr/bin/python*
lrwxrwxrwx 1 root root   24 May 17 13:03 /usr/bin/python -> /etc/alternatives/python
lrwxrwxrwx 1 root root   17 May 17 13:03 /usr/bin/python2 -> /usr/bin/python27
-rwxr-xr-x 1 root root 5120 May  2 18:32 /usr/bin/python27
-rwxr-xr-x 1 root root 5120 May  2 18:32 /usr/bin/python2.7
-rwxr-xr-x 1 root root 1846 May  2 18:31 /usr/bin/python2.7-config
lrwxrwxrwx 1 root root   25 May 17 13:03 /usr/bin/python3 -> /etc/alternatives/python3
-rwxr-xr-x 3 root root 6872 Apr 26 00:16 /usr/bin/python36
-rwxr-xr-x 3 root root 6872 Apr 26 00:16 /usr/bin/python3.6
lrwxrwxrwx 1 root root   17 May 17 13:03 /usr/bin/python3.6-config -> python3.6m-config
-rwxr-xr-x 3 root root 6872 Apr 26 00:16 /usr/bin/python3.6m
-rwxr-xr-x 1 root root  173 Apr 26 00:16 /usr/bin/python3.6m-config
-rwxr-xr-x 1 root root 3373 Apr 25 23:57 /usr/bin/python3.6m-x86_64-config
lrwxrwxrwx 1 root root   32 May 17 13:03 /usr/bin/python3-config -> /etc/alternatives/python3-config
lrwxrwxrwx 1 root root   31 May 17 13:03 /usr/bin/python-config -> /etc/alternatives/python-config

/usr/bin/python/etc/alternatives/pythonにリンクされているのでそちらも調べます。

 $ ls -l /etc/alternatives/python*
lrwxrwxrwx 1 root root 18 May 17 13:03 /etc/alternatives/python -> /usr/bin/python2.7
lrwxrwxrwx 1 root root 34 May 17 13:03 /etc/alternatives/python.1.gz -> /usr/share/man/man1/python2.7.1.gz
lrwxrwxrwx 1 root root 18 May 17 13:03 /etc/alternatives/python3 -> /usr/bin/python3.6
lrwxrwxrwx 1 root root 34 May 17 13:03 /etc/alternatives/python3.1.gz -> /usr/share/man/man1/python3.6.1.gz
lrwxrwxrwx 1 root root 25 May 17 13:03 /etc/alternatives/python3-config -> /usr/bin/python3.6-config
lrwxrwxrwx 1 root root 25 May 17 13:03 /etc/alternatives/python-config -> /usr/bin/python2.7-config

結局/usr/bin/python2.7にリンクされていることが分かったので/usr/bin/python3.6にリンクし直します。

 $ sudo rm /etc/alternatives/python
 $ sudo ln -s /usr/bin/python3.6 /etc/alternatives/python

バージョンを確認してみます。

 $ python --version
Python 2.7.14
 $ /usr/bin/python --version                                                                                                         
Python 3.6.5
 $ 

まだおかしいですね。絶対パスで指定した場合はきちんと3.6.5になっているので、こういう場合はエイリアスを疑います。

 $ alias python
alias python='python27'
 $ 

エイリアスが設定されていました。(なんでこれほどpython2を使わせたいんだろう・・・)
このエイリアスの設定箇所は~/.bashrcでした。

~/.bashrc
# User specific aliases and functions
alias python=python27

コメントアウトしてしまいましょう。

~/.bashrc
# User specific aliases and functions
#alias python=python27

エイリアスを解除します。

 $ unalias python
 $ python --version
Python 3.6.5
 $ 

ようやくPythonを3系にすることができました。

追記)別解
同僚は別の方法で解決していたのでご紹介します。

~/.bashrcを以下のように修正します。

~/.bashrc
# User specific aliases and functions
#alias python=python36

修正したら再読込します。

 $ source ~/.bashrc

シンボリックリンクはデフォルトのままです。これでも正常に動作していました。
こちらの方が作業はシンプルですね。

pipを3系にする

次はpipです。pythonコマンドと同様なので一気に行きます。

 $ pip --version
pip 9.0.3 from /usr/lib/python2.7/dist-packages (python 2.7)
 $ ls -l /usr/bin/pip*
lrwxrwxrwx 1 root root  21 May 17 13:03 /usr/bin/pip -> /etc/alternatives/pip
-rwxr-xr-x 1 root root 370 Apr 25 23:47 /usr/bin/pip-2.7
-rwxr-xr-x 1 root root 370 Apr 25 23:47 /usr/bin/pip-3.6
 $ ls -l /etc/alternatives/pip
lrwxrwxrwx 1 root root 16 May 17 13:03 /etc/alternatives/pip -> /usr/bin/pip-2.7
 $ sudo rm /etc/alternatives/pip
 $ sudo ln -s /usr/bin/pip-3.6 /etc/alternatives/pip
 $ pip --version
pip 9.0.3 from /usr/lib/python3.6/dist-packages (python 3.6)
 $ 

Djangoは最初からインストールされていました。下記コマンドでバージョンを確認します。

 $ python -m django --version
2.0.2
 $ 

MySQLの環境設定

起動と終了

AWS Cloud9にはMySQLがインストール済みでした。
起動と終了は普通に/etc/init.d/mysqldからできます。

 $ mysql --version
mysql  Ver 14.14 Distrib 5.5.59, for Linux (x86_64) using readline 5.1
 $ sudo /etc/init.d/mysqld start
Initializing MySQL database:  Installing MySQL system tables...
〜中略〜
Please report any problems at http://bugs.mysql.com/

                                                           [  OK  ]
Starting mysqld:                                           [  OK  ]
 $ sudo /etc/init.d/mysqld stop
Stopping mysqld:                                           [  OK  ]
 $ 

文字コードの設定

AWS Cloud9のMySQLの文字コードは、デフォルトでは下記のようになっています。

mysql> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

character_set_databasecharacter_set_serverlatin1ですね。
このままだと日本語を書き込もうとしたときにエラーで落ちるので、/etc/my.cnfに設定を追加します。

/etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mysqld according to the
# instructions in http://fedoraproject.org/wiki/Systemd
character-set-server=utf8mb4

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

character-set-server=utf8mb4という行を追加しました。

編集が終わったらサーバーを再起動します。

 $ sudo /etc/init.d/mysqld restart
Stopping mysqld:                                           [  OK  ]
Starting mysqld:                                           [  OK  ]

変更されていることを確認します。

mysql> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

これでデフォルト値がutf8mb4になったので、DBやテーブルを新規作成すると、この設定が引き継がれます。
テーブルを作った後で変更するのはとても大変だったので、最初に行いましょう。

Django用のユーザーとDBの作成

rootでdjango用のユーザーを作成します。ユーザー名は何でもOKです。ここでは"django"としました。

 $ mysql -u root
mysql> create user django@localhost identified by {パスワード};

次にdjango用のデータベースを作成します。

mysql> create database django;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| django             |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.00 sec)

djangoユーザーにdjangoデータベースへの権限を与えます。

mysql> grant all on django.* to django@localhost identified by {パスワード};

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

Djangoチュートリアルの実施

AWS Cloud9で実施する場合のポイントだけ記載します。詳しくは下記のリンク先をお読みください。
https://docs.djangoproject.com/ja/2.0/intro/

サーバーの起動

下記のようにして起動します。

 $ python manage.py runserver $IP:$PORT  

また、settings.pyのALLOWED_HOSTSにCloud9が動いているサーバーのドメインを記載する必要があります。
何も記載せずに動かそうとすると「You may need to add '○○.amazonaws.com' to ALLOWED_HOSTS.」と言われるので、コピー&ペーストしましょう。

settings.py
ALLOWED_HOSTS = ['{動かしたい環境のドメイン}']

DjangoとMySQLの接続

まずmysqlclientをインストールします。

 $ pip install mysqlclient
Collecting mysqlclient
  Downloading https://files.pythonhosted.org/packages/6f/86/bad31f1c1bb0cc99e88ca2adb7cb5c71f7a6540c1bb001480513de76a931/mysqlclient-1.3.12.tar.gz (89kB)
    100% |████████████████████████████████| 92kB 5.7MB/s 
Installing collected packages: mysqlclient
  Running setup.py install for mysqlclient ... error
〜中略〜
    _mysql.c:29:19: fatal error: mysql.h: No such file or directory
     #include "mysql.h"
                       ^
    compilation terminated.
    error: command 'gcc' failed with exit status 1

    ----------------------------------------
Command "/usr/bin/python3.6 -u -c "import setuptools, tokenize;__file__='/tmp/pip-build-pmug2l72/mysqlclient/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record /tmp/pip-bu4b812r-record/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /tmp/pip-build-pmug2l72/mysqlclient/
You are using pip version 9.0.3, however version 10.0.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
 $ 

エラーになってしまいました。いろいろと出ていますが、原因はmysql-develが入っていないためなので、先にインストールします。

 $ sudo yum install mysql-devel
Loaded plugins: priorities, update-motd, upgrade-helper
amzn-main                                                                                                     | 2.1 kB  00:00:00     
〜中略〜
Installed:
  mysql-devel.noarch 0:5.5-1.6.amzn1                                                                                                 

Dependency Installed:
  mysql55-devel.x86_64 0:5.5.60-1.21.amzn1                                                                                           

Dependency Updated:
  mysql55.x86_64 0:5.5.60-1.21.amzn1      mysql55-libs.x86_64 0:5.5.60-1.21.amzn1      mysql55-server.x86_64 0:5.5.60-1.21.amzn1     

Complete!
 $ 

もう一度mysqlclientをインストールします。

 $ pip install mysqlclient
Collecting mysqlclient
  Using cached https://files.pythonhosted.org/packages/6f/86/bad31f1c1bb0cc99e88ca2adb7cb5c71f7a6540c1bb001480513de76a931/mysqlclient-1.3.12.tar.gz
Installing collected packages: mysqlclient
  Running setup.py install for mysqlclient ... error
〜中略〜
    error: could not create '/usr/lib64/python3.6/dist-packages/MySQLdb': Permission denied

    ----------------------------------------
Command "/usr/bin/python3.6 -u -c "import setuptools, tokenize;__file__='/tmp/pip-build-78z56hhq/mysqlclient/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record /tmp/pip-i2s469l2-record/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /tmp/pip-build-78z56hhq/mysqlclient/
You are using pip version 9.0.3, however version 10.0.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
 $  

今度はPermission deniedが出てしまいました。sudoをつけて再実施してみます。

 $ sudo pip install mysqlclient                                                                                                      
Collecting mysqlclient
  Downloading https://files.pythonhosted.org/packages/6f/86/bad31f1c1bb0cc99e88ca2adb7cb5c71f7a6540c1bb001480513de76a931/mysqlclient-1.3.12.tar.gz (89kB)
    100% |████████████████████████████████| 92kB 5.9MB/s 
Installing collected packages: mysqlclient
  Running setup.py install for mysqlclient ... done
Successfully installed mysqlclient-1.3.12
You are using pip version 9.0.3, however version 10.0.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
 $ 

ようやくmysqlclientをインストールできました。

次にDjangoがMySQLを使うようにsettings.pyを編集します。

settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'OPTIONS': {
            'read_default_file': './my.cnf',
            'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
        }
    }
}

また、プロジェクト直下にmy.cnfを作成し、以下のように記述します。

my.cnf
[client]
database = django
user = django
password = {設定したパスワード}
default-character-set = utf8mb4

これでDjangoからMySQLに接続できるようになりました。

言語設定とタイムゾーン

今回のプロジェクトは完全に日本国内向けだったので以下のように設定しました。

settings.py
LANGUAGE_CODE = 'ja'

TIME_ZONE = 'Asia/Tokyo'

USE_I18N = True

USE_L10N = True

USE_TZ = False

以上でDjangoチュートリアルを実施するのに必要な設定はすべて完了です。

今回はこちらの記事のチュートリアルも実施してみました。

[Python] Djangoチュートリアル - 汎用業務Webアプリを最速で作る
https://qiita.com/okoppe8/items/54eb105c9c94c0960f14

本家のチュートリアルではよくわからなかったところが網羅されていて、とても参考になりました。

ペアプログラミング

Cloud9にはペアプログラミングを円滑に進められる機能が搭載されています。

image.png
まず右上のShareをクリックしましょう。

image.png
ペアプログラミングする相手のIAMアカウントを入力してInviteします。

image.png
Inviteされた側はShared with youを開くと、共有されたプロジェクトを見ることができます。
IDEに入った後の使い勝手は、Inviteした側もされた側も変わりません。
今回は30分おきにドライバーとナビゲーターを交代してペアプログラミングをしましたが、ドライバー役のときは自分のマシンで作業できるので入力がかなり楽でした。
ナビゲーター役のときは、ドライバーが作業している間に自分の環境で調べ物をすることができるのがよかったです。

ローカルに構築した開発環境でVisual Studio Live Shareも試してみましたが、こちらもかなり便利でした。

まとめ

  • Cloud9をPython3系にするにはPreferenceとシンボリックリンクおよびエイリアスの設定を変更する必要がある。
  • DjangoとMySQLは最初からインストール済み。
  • でもmysql-develとmysqlclientは自分で入れる必要がある。
  • MySQLのデフォルト文字コードはlatin1なのでUTF-8に変更する必要がある。
  • Share機能は便利。
sikkim
サーバーサイドエンジニア。情報処理安全確保支援士(登録番号:020092)。PythonやNode.js、FileMaker、Nuxt.jsで開発することが多いです。
https://github.com/sikkimtemi
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした