EC2とPythonのvenvでDjango開発環境を構築しよう!

eyecatch-django-ec2-python-env
目次

Djangoとは?

概要

DjangoはPythonで書かれたフルスタックのWebフレームワークであり、迅速な開発を支援するために設計されています。優れた開発者体験を提供しつつ、セキュアでスケーラブルなWebアプリケーションを構築できるため、世界中で幅広く使われています。以下にDjangoの主な特徴を解説します。

  • フルスタックフレームワーク
    DjangoはWebアプリケーションを構築するために必要な多くの機能を一体化したフレームワークです。フロントエンドとバックエンド両方の作業をサポートするため、テンプレートエンジン、データベース接続、管理インターフェース、セキュリティ機能などが内蔵されています。特にフロントエンドはReactやVue.jsを知らなくても基本的なHTML/CSS、JavaScriptで開発することができます。
  • 「バッテリー付き」設計
    Djangoは「バッテリー付き」フレームワークと呼ばれることが多く、標準で提供される多くのツールや機能が用意されています。これにより、開発者は追加のライブラリをインストールせずに、ほぼすべてのWebアプリケーションの開発を進められます。たとえば、認証、管理画面、フォーム、テンプレート、URLルーティング、データベース管理などが内蔵されています。
  • MTVアーキテクチャ
    Djangoは、Model-Template-View (MTV) アーキテクチャに基づいて設計されています。この構造は、データ管理やビジネスロジックを分離し、効率的で保守性の高いコードを書くことを可能にします。細かい部分は異なりますが、MVCアーキテクチャと同様の構成を採用しているので、他のMVCフレームワークを経験していれば学習コストはそこまで高くない印象です。
  • 管理サイトの自動生成
    Djangoの最大の特徴の一つは、開発者が設定を行うだけで自動的に管理サイトを生成できることです。これにより、データの作成、編集、削除、検索などの管理タスクを簡単に行うことができます。特に、管理者向けのダッシュボードを素早く提供できる点で非常に便利です。
  • 高いセキュリティ性
    Djangoはセキュリティ面でも優れており、SQLインジェクションやクロスサイトスクリプティング(XSS)、クロスサイトリクエストフォージェリ(CSRF)、クリックジャッキングなどの攻撃に対する防御機能が標準で備わっています。開発者が特に意識せずとも、セキュアなWebアプリケーションを構築できます。

venv

Pythonの仮想環境であるvenvは、Pythonプロジェクトごとに独立した環境を作成しその環境内で特定のバージョンのPythonパッケージや依存関係を管理できる機能です。仮想環境を使用すると、異なるプロジェクト間でパッケージや依存関係の競合を避けることができ、効率的な開発が可能になります。

仮想環境を利用せずにPythonを利用するとPCに構築されたPythonを利用することになるため、他のPython開発環境と同じ環境を構築することが難しくなる場合があります。Pythonの開発環境が異なると思わぬエラーの原因となることがありますので、チーム開発をする場合はPythonの仮想環境やDockerを利用した開発環境で開発することをおススメします

ポートフォワーディング

EC2で起動したDjangoを確認する場合、パブリックIP経由とSSHポートフォワーディング経由があります。どちらでもDjangoの起動後にブラウザでアクセスすることができますが、SSHポートフォワーディングを利用することをおススメします。

理由としては実際のDjango開発ではVSCodeなどでEC2にSSH接続しながら開発することになるためです。SSHポートフォワーディングを利用しないとVSCodeなどのクライアントPCのIDEが使えないため、EC2のViエディタで開発をすることになってしまい開発効率が落ちてしまいます。手間はあまりかかりませんので、ポートフォワーディングを習得して効率のいい開発環境を構築してみてくださいね!

Djangoの環境構築

前提

AWS EC2(Amazon Linux 2023、t2.micro)
※セキュリティグループで8000ポートを開放済み
※筆者の環境はSSH(22ポート開放済み)で構築

venvを利用したDjango環境構築

Amazon Linux 2023にはデフォルトでpythonがインストールされています。このpythonはpython3コマンドで利用することができます。もしpythonコマンドで利用したい場合は別途環境構築が必要となります。今回はpythonの仮想環境を利用してDjango環境を構築します。そのために6-8行目で仮想環境を生成しアクティベーションを行っています。

# pythonバージョンの確認
python3 -V
Python 3.9.16

# pythonの仮想環境構築
python3 -m venv myenv
cd myenv
source bin/activate
(myenv) [ec2-user@ip-xxx-xxx-xxx-xxx myenv]$

# 仮想環境内でDjangoインストール
pip install django

# Djangoのプロジェクト準備
django-admin startproject sample .
ls 
bin  db.sqlite3  include  lib  lib64  manage.py  pyvenv.cfg  sample
cd sample/
ls
__init__.py  __pycache__  asgi.py  settings.py  urls.py  wsgi.py

#EC2のパブリックIPとローカルホスト(localhost, 127.0.0.1)を許可
vi settings.py
ALLOWED_HOSTS = ['xxx.xxx.xxx.xxx', 'localhost', '127.0.0.1'] 

# 仮想環境の終了(今は実施しない)
deactivate

Djangoのへアクセス確認

ここまででDjangoの基本的な準備が完了しました。そうしましたらDjangoを起動してブラウザからアクセスできるかを確認してみましょう。

パブリックIP経由で確認

これまでコマンド操作をしてきた画面でrunserverを実施します。runserverは開発用サーバーとしてDjangoが用意している機能になります。これを起動することでパブリックIP経由で確認することができます。

# EC2で下記コマンドを実行
# manage.pyがあるディレクトリでDjango開発用サーバー起動
ls
bin  db.sqlite3  include  lib  lib64  manage.py  pyvenv.cfg  sample
python manage.py runserver 0.0.0.0:8000

上記を実行した後、任意のブラウザでEC2のパブリックIP:8000(例えば10.1.1.1:8000など)を入力することで下記のサンプル画面が表示されるようになります。

SSHポートフォワーディングで確認

SSHのポートフォワーディング機能を利用してEC2に入りDjangoを操作します。ご自身の利用されているPCに応じて下記のコマンドを選択してください。また任意のパスにEC2のSSH接続のためのキー(.pemファイル)を配置します。

# windows(power shell、コマンドプロンプト)の場合
ssh -L 8000:localhost:8000 -i C:\path\to\your\private-key.pem ec2-user@<EC2のパブリックIP>
# 例)ssh -L 8000:localhost:8000 -i C:\Users\username\.ssh\ssh-ec2.pem ec2-user@xxx.xxx.xxx.xxx
# pemキーが上記にない場合はキーを配置しているパスを指定してください

# linux、macの場合
ssh -L 8000:localhost:8000 -i /path/to/your/private-key.pem ec2-user@<EC2のパブリックIP>

利用されているPCのOSとSSHキーが確認出来たら任意のコンソール(poweshellやコマンドプロンプトなど)でSSHコマンドを実行します。すると下記の3行目以降のようにEC2にログインした状態が確認できると思います。この状態で21行目のrunserver起動を実行してください。その後任意のブラウザで「パブリックIP経由で確認」で

# SSHコマンドの実行
ssh -L 8000:localhost:8000 -i C:\path\to\your\private-key.pem ec2-user@xxx.xxx.xxx.xxx
A newer release of "Amazon Linux" is available.
  Version 2023.5.20240903:
Run "/usr/bin/dnf check-release-update" for full release and version update info
   ,     #_
   ~\_  ####_        Amazon Linux 2023
  ~~  \_#####\
  ~~     \###|
  ~~       \#/ ___   https://aws.amazon.com/linux/amazon-linux-2023
   ~~       V~' '->
    ~~~         /
      ~~._.   _/
         _/ _/
       _/m/'
Last login: Sat Sep  7 17:05:16 2024 from xxx.xxx.xxx.xxx

# Djangoの起動(manage.pyがある階層まで移動)
ls
bin  db.sqlite3  include  lib  lib64  manage.py  pyvenv.cfg  sample
python manage.py runserver localhost:8000

上記を実行した後、任意のブラウザでlocalhost:8000を入力することで「パブリックIP経由で確認」の時と同じようにDjangoのサンプル画面が表示されるようになります。

django-sample-top

Tips

VSCodeで次回起動時にアクティブ状態が残っている場合

VSCodeを利用していてうっかりdeavtivateせずにVSCodeを閉じてしまうと、下記のようにアクティブ状態が残ってしまう場合があります。困ったことにこの現象が発生するとdeactivateコマンドを実行しても解消されません。

# VSCodeを閉じた後、再度接続するとmyenvが残ることがある
(myenv) [ec2-user@ip-xxx-xxx-xxx-xxx myenv]$

# 本来は下記のようにmyenvがない状態が正常
[ec2-user@ip-xxx-xxx-xxx-xxx myenv]$

対応策としては、VSCodeのキャッシュをクリアすることで解消するようです。解決策はこちらのを参考にしました。お使いのVSCodeを実行している環境に応じてキャッシュがある場所が異なりますので下記を参照ください。念のためキャッシュはバックアップをとっておくとよいでしょう。

  • Windows: %APPDATA%\Code\User
  • Mac: ~/Library/Application Support/Code/User
  • Linux: ~/.config/Code/User

まとめ

この記事ではDjango構築の基本について解説しました。Pythonの仮想環境やポートフォワーディングについてなじみがなかった方もこのDjango環境構築を機に使ってみてくださいね!Django開発の第一歩ですので何度も繰り返し構築しながらぜひご自身のスキルにして頂けたらと思います。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

Hack Luck Labの管理人hakula(ハクラ)です。2012年にSIerに新卒入社し、SE、新規事業、情シスを担当。その後、ITコンサルを経て、現在はバックエンドエンジニア。過去にはC#、SQL Server、JavaScriptで開発を行い、現在はPython、Rest Framework、Postgresql、Linux、AWSなどを使用しています。ノーコードツールやDX関連も興味あり。「技術は価値を生むために使う」ことが信条で、顧客や組織への貢献を重視しています。

目次