LoginSignup
2
2

More than 3 years have passed since last update.

【Python/Django】よく使うコマンドのまとめ(4)-前編- <本番運用:Amazon EC2 (Amazon Linux 2)>

Last updated at Posted at 2020-12-15

背景

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 で構築します。

(構成図)
構成図_基本形.png

  • 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
/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の利用も併せて検討していきたいです。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2