kamatimaru’s 勉強日記

技術トピック専用のブログです。自分用のメモ書きの投稿が多いです。あくまで「勉強日記」なので記事の内容は鵜呑みにしないでください。

DjangoをEC2インスタンス上で動かす環境を構築する(その3:ソースコードの配置)

参考文献

その3:ソースコードの配置

概要

Djangoソースコードを配置する。

方針

ディレクトリ構成は以下とする。

/var/application/
└── sources
    ├── mysite -> /var/application/sources/versions/django-tutorial/mysite
    └── versions
        └── django-tutorial
            └──  mysite  

ソースコードはバージョン管理できるようにシンボリックリンクを使用する。

手順

ディレクトリを作成する。

・adminユーザーで作業する。

$ whoami
admin
$ 

ディレクトリを作成する。
treeコマンドは便宜上インストールした。

$ sudo mkdir -p /var/application/sources/versions
$ sudo tree /var/application
/var/application
└── sources
    └── versions

2 directories, 0 files
$

/var/application/以下の所有者とパーミッションを確認する。

$ ls -ld /var/application
drwxr-xr-x 3 root root 21  524 20:15 /var/application
$ ls -ld /var/application/sources
drwxr-xr-x 3 root root 22  524 20:15 /var/application/sources
$ ls -ld /var/application/sources/versions
drwxr-xr-x 2 root root 6  524 20:15 /var/application/sources/versions

/var/application/sources以下の所有者をrelease:releaseに変更する。

$ sudo chown -R release:release /var/application/sources

・所有者がrelease:releaseパーミッション755になっていることを確認する。

$ ls -ld /var/application/sources
drwxr-xr-x 3 release release 22  524 20:15 /var/application/sources
$ ls -ld /var/application/sources/versions
drwxr-xr-x 2 release release 6  524 20:15 /var/application/sources/versions
ソースコードを配置する。

・releaseユーザーで作業する。

$ sudo su release
$ whoami
release

ソースコードを配置するディレクトリに移動する。

$ cd /var/application/sources/versions
$ pwd
/var/application/sources/versions

Githubからソースコードを取得する。

$ git clone https://github.com/kamatimaru/django-tutorial.git
Cloning into 'django-tutorial'...
remote: Enumerating objects: 312, done.
remote: Counting objects: 100% (312/312), done.
remote: Compressing objects: 100% (187/187), done.
remote: Total 312 (delta 180), reused 229 (delta 100), pack-reused 0
Receiving objects: 100% (312/312), 108.08 KiB | 7.72 MiB/s, done.
Resolving deltas: 100% (180/180), done.
$

シンボリックリンクを作成する。

$ cd ..
$ pwd
/var/application/sources
$ ln -s /var/application/sources/versions/django-tutorial/mysite mysite
動作確認のはずが...

今回はappserverユーザーでGunicornから起動するが、その前にreleaseユーザーからpython3 manage.py runserverで起動できるかどうか試してみたところ、以下のエラーが発生した。

$ python3 manage.py runserver
Watching for file changes with StatReloader
Exception in thread django-main-thread:
Traceback (most recent call last):
  File "/usr/lib64/python3.7/threading.py", line 926, in _bootstrap_inner
    self.run()
  File "/usr/lib64/python3.7/threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
  File "/usr/local/lib64/python3.7/site-packages/django/utils/autoreload.py", line 53, in wrapper
    fn(*args, **kwargs)
  File "/usr/local/lib64/python3.7/site-packages/django/core/management/commands/runserver.py", line 109, in inner_run
    autoreload.raise_last_exception()
  File "/usr/local/lib64/python3.7/site-packages/django/utils/autoreload.py", line 76, in raise_last_exception
    raise _exception[1]
  File "/usr/local/lib64/python3.7/site-packages/django/core/management/__init__.py", line 357, in execute
    autoreload.check_errors(django.setup)()
  File "/usr/local/lib64/python3.7/site-packages/django/utils/autoreload.py", line 53, in wrapper
    fn(*args, **kwargs)
  File "/usr/local/lib64/python3.7/site-packages/django/__init__.py", line 24, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/usr/local/lib64/python3.7/site-packages/django/apps/registry.py", line 114, in populate
    app_config.import_models()
  File "/usr/local/lib64/python3.7/site-packages/django/apps/config.py", line 211, in import_models
    self.models_module = import_module(models_module_name)
  File "/usr/lib64/python3.7/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
  File "<frozen importlib._bootstrap>", line 983, in _find_and_load
  File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 728, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/var/application/sources/versions/django-tutorial/mysite/polls/models.py", line 7, in <module>
    class Question(models.Model):
  File "/usr/local/lib64/python3.7/site-packages/django/db/models/base.py", line 121, in __new__
    new_class.add_to_class('_meta', Options(meta, app_label))
  File "/usr/local/lib64/python3.7/site-packages/django/db/models/base.py", line 325, in add_to_class
    value.contribute_to_class(cls, name)
  File "/usr/local/lib64/python3.7/site-packages/django/db/models/options.py", line 208, in contribute_to_class
    self.db_table = truncate_name(self.db_table, connection.ops.max_name_length())
  File "/usr/local/lib64/python3.7/site-packages/django/db/__init__.py", line 28, in __getattr__
    return getattr(connections[DEFAULT_DB_ALIAS], item)
  File "/usr/local/lib64/python3.7/site-packages/django/db/utils.py", line 207, in __getitem__
    backend = load_backend(db['ENGINE'])
  File "/usr/local/lib64/python3.7/site-packages/django/db/utils.py", line 111, in load_backend
    return import_module('%s.base' % backend_name)
  File "/usr/lib64/python3.7/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
  File "<frozen importlib._bootstrap>", line 983, in _find_and_load
  File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 728, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/usr/local/lib64/python3.7/site-packages/django/db/backends/sqlite3/base.py", line 68, in <module>
    check_sqlite_version()
  File "/usr/local/lib64/python3.7/site-packages/django/db/backends/sqlite3/base.py", line 65, in check_sqlite_version
    raise ImproperlyConfigured('SQLite 3.8.3 or later is required (found %s).' % Database.sqlite_version)
django.core.exceptions.ImproperlyConfigured: SQLite 3.8.3 or later is required (found 3.7.17).

どうやらAmazon Linux2のSQLite3のバージョンがDjangoの要件よりも古いバージョンのようである。

django.core.exceptions.ImproperlyConfigured: SQLite 3.8.3 or later is required (found 3.7.17).

このエラーの対応はその4に続く。