背景
Python/Djangoで開発をすすめるにあたり、よく使うコマンドをまとめておきます。
先人たちの知恵をお借りするなどして解決できたことを、この場をお借りして感謝するとともに、大変恐縮ですが自分のメモとしても、こちらへまとめておきます。
環境
(本番環境)
- AWS EC2 (Amazon Linux 2)
- Python 3.7.9 ※2020/12/10時点のAmazon Linux2でのデフォルト
- Django 3.1.3
- PostgreSQL 11.5 ※同上
- Nginx 1.12 ※同上
- Gunicorn
- Putty 0.74
(開発環境)
- Windwos 10 Pro
- Python 3.9.0
- Django 3.1.3
- PostgreSQL 13.1
- Nginx 1.19.5
- Gunicorn
- Putty 0.74
前提
WEBサーバー、APサーバー、DBサーバーを、Amazon EC2(Elastic Computing Cloud) : Amazon Linux 2 で構築します。
- EC2インスタンスへSSH接続した状態で、以降のコマンドを実行します。
※ PuTTY を利用して、Amazon EC2(Elastic Compute Cloud)へ接続する際は、「PuTTY を使用した Windows から Linux インスタンスへの接続」をご参照ください。
1. Amazon Linux 2 のパッケージを更新する
$ sudo yum update -y
2. 日本仕様へ変更する
デフォルトはUTC(協定世界時)となっているため、日本標準時(JST)へ変更します。
2-1. タイムゾーン
$ sudo timedatectl set-timezone Asia/Tokyo
$ date
2020年 12月 10日 木曜日 11:23:45 JST
「date」コマンドは、現在の日付時刻を取得します。日本標準時(JST)に変更されていれば、末尾に「JST」と表示されます。
2-2. 言語設定
デフォルトはUS仕様となっているため、日本語文字コード(jz_JP.UTF-8)へ変更します。
$ sudo localectl set-locale LANG=ja_JP.UTF-8
$ localectl status
System Locale: LANG=ja_JP.UTF-8
VC Keymap: n/a
X11 Layout: n/a
3. 作業用ユーザーを作成し、ec2-userを削除する
デフォルトユーザー(ec2-user)は周知されているユーザー名のため、このまま使い続けるのはセキュリティ面のリスクが高過ぎます。
このため、作業用ユーザーを任意のユーザー名で新たに作成し、ec2-userを削除してしまいます。
3-1. 作業用ユーザーを作成します。
$ sudo useradd <任意のユーザー名>
3-2. ec2-userのホームディレクトリにあるSSH用ディレクトリ(.ssh)を、<任意のユーザー名>のホームディレクトリへコピーします。
$ sudo cp -arp /home/ec2-user/.ssh /home/<任意のユーザー名>
3-3. SSH用ディレクトリとその中身のすべての所有者を<任意のユーザー名>へ変更します。
$ sudo chown -R <任意のユーザー名> /home/<任意のユーザー名>/.ssh
3-4. <任意のユーザー名>へsudo権限を付与するために、 sudoer (sudo権限を管理するファイル) を編集します。
$ sudo visudo -f /etc/sudoers.d/90-cloud-init-users
# User rules for ec2-user
# ec2-user ALL=(ALL) NOPASSWD:ALL コメントアウト
<任意のユーザー名> ALL=(ALL) NOPASSWD:ALL 追加
3-5. <任意のユーザー名>でEC2へSSH接続し直します。
<任意のユーザー名>でSSH接続し、Roor(ルート)に切り替わるかを確認します。
$ sudo su -
root #
「root #」と表示が切り替われば、成功です。
確認が済みましたら、「exit」と入力して、Rootからログアウトします。
root # exit
ログアウト
$
3-6. ec2-userを削除します。
ec2-user のホームディレクトリも削除するために、「-r」オプションも付けます。
$ sudo userdel -r ec2-user
4. Python をインストールし、バージョンを確認する。
$ sudo yum install python3
$ python3 --version
Python 3.7.9
5. pip管理モジュールを一括してインストールする。
5-0. 予め、開発環境でpipインストールしていたモジュールを「requirements.txt」に出力しておきます。
(venv_<プロジェクト名>)$ pip freeze > requirements.txt
5-1. 出力された「requirements.txt」を、本番運用環境の作業用ユーザー(上述の<任意のユーザー名>)のホームディレクトリへ転送しておきます。
5-2. <任意のユーザー>のホームディレクトリにPython仮想環境を作成します。
$ python3 -m venv venv_<プロジェクト名>
5-3.Python仮想環境へ入ります。
$ source venv_<プロジェクト名>/bin/activate
5-4. 「requirements.txt」を読み込み、モジュールをインストールします。
$ pip install -r requirements.txt
5-5. Amazon SES(Simple Email Service)用モジュールをインストールします。
ユーザー認証を介したり問い合わせフォームを設置したりするWEBサイトやWEBアプリケーションを作成する際は、必ずお世話になるモジュールです。
$ pip install boto django-ses
5-6. Gunicorn用モジュールをインストールします。
$ pip install gunicorn
6. PostgreSQLをインストールし、初期設定をします。
6-1. PostgreSQLをインストールします。
$ amazon-linux-extras list | grep postgresql
5 postgresql9.6 available \
6 postgresql10 available [ =10 =stable ]
41 postgresql11=latest enabled [ =11 =stable ]
ver.11 がインストール可能な最も高いバージョンであることが分かりました。
下記を実行してインストールします。
$ sudo amazon-linux-extras install postgresql11
バージョンを確認します。
$ psql --version
psql (Postgres) 11.5
6-2. DBサーバーとして動作させるためのパッケージをインストールする。
$ sudo yum install postgresql-server
6-3. PostgreSQLの初期設定を行ないます。
6-3-1. データベースの初期化
$ sudo postgresql-setup initdb
以下のWARNINGメッセージが表示される場合があります。
これは、PostgreSQLが自動でオプションを最適化したためによるもので、初期化の処理自体に問題はありません。
WARNING: using obsoleted argument syntax, try --help
WARNING: arguments transformed to: postgresql-setup --initdb --unit postgresql
6-3-2. PostgreSQLサービスを自動起動させる設定
$ sudo systemctl enable postgresql
6-3-5. PostgreSQLサービスを起動させる
$ sudo systemctl start postgresql
6-3-6. PostgreSQL環境へログインし、データベース用のユーザーと、データベースをそれぞれ作成します。
$ sudo -u postgres -i psql
psql (11.5)
"help" でヘルプを表示します。
postgres=# create user <任意のユーザー名> with password '<任意のパスワード>';
CREATE ROLE
postgres=# create database <データベース名> owner <任意のユーザー名>;
CREATE DATABASE
6-3-7. PostgreSQL環境からログアウトします。
postgres=# \q
7. 本番運用環境にソースコードを配置する。
7-1. gitをインストールします。
$ sudo yum install git
7-2. 初回(全量をコピーする場合)
7-2-1. Python仮想環境へ移動します。
$ cd ~/venv_<プロジェクト名>
7-2-2. 下記を実行します。 ※筆者の環境では途中BitBucketのパスワード入力が必要です。
$ git clone https://<bitbucketのアカウント>@bitbucket.org/<bitbucketのアカウント>/<bitbucketのリモートリポジトリ名>.git
Cloning into '<リモートリポジトリ名>'...
Password for 'https://<bitbucketのアカウント>@bitbucket.org':
remote: Counting objects: 123, done.
remote: Compressing objects: 100% (123/123), done.
remote: Total 123 (delta 25), reused 0 (delta 0)
Unpacking objects: 100% (123/123), done.
7-3. 二回目以降(差分のみを更新する場合)
7-3-1. Python仮想環境へ移動します。(manage.pyの存在するディレクトリまで移動します。)
$ cd ~/venv_<プロジェクト名>/<プロジェクト名>
7-3-2. 下記を実行します。 ※筆者の環境では途中BitBucketのパスワード入力が必要です。
$ git pull
Password for 'https://<bitbucketのアカウント>@bitbucket.org':
remote: Counting objects: 8, done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 8 (delta 2), reused 0 (delta 0)
Unpacking objects: 100% (123/123), done.
From https://bitbucket.org/<bitbucketのアカウント>/<bitbucketのリモートリポジトリ名>
29912a3..c5aac44 master -> origin/master
fatal: refusing to merge unrelated histories
8. ログの出力先ディレクトリを作成する。
$ mkdir ~/venv_<プロジェクト名>/<プロジェクト名>/logs
(関連)
【Python/Django】よく使うコマンドのまとめ(1) <仮想環境、プロジェクト、アプリケーションの作成>
【Python/Django】よく使うコマンドのまとめ(2) <パッケージのインストール>
【Python/Django】よく使うコマンドのまとめ(3) <PostgreSQLの操作>
【Python/Django】よく使うコマンドのまとめ(4)-後編- <本番運用:Amazon EC2 (Amazon Linux 2)>
(編集後記)
本番運用時のみならず、開発環境としてEC2を利用することもできますので、Dockerの利用も併せて検討していきたいです。