1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

お題は不問!Qiita Engineer Festa 2024で記事投稿!
Qiita Engineer Festa20242024年7月17日まで開催中!

Cloud Runへのデプロイでハマった、ModuleNotFoundErrorと.env参照の仕方

Last updated at Posted at 2024-06-23

個人開発しているwebアプリがやっと形になったので、Cloud Runを使って「よしデプロイしよう!」と意気込んだものの、わからないことだらけでハマりました。

ModuleNotFoundErrorにハマる

まずハマったのが、デプロイした直後のModuleNotFoundError: No module named 'config'というエラー。

gunicornを用いてwsgi.pyからDjangoプロジェクトを起動していくため、Dockerfileに以下を記述しています。

FROM python:3.11

ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1

WORKDIR /code

COPY requirements.txt ./
RUN python3 -m pip install --upgrade pip setuptools
RUN pip install -r requirements.txt

COPY . ./

CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 config.wsgi:application

gunicornで起動する先を指定するのにconfig.wsgi:applicationとしていますが、ここのconfigが見つけられないらしい。

ディレクトリ構成としてconfigからの指定で合っているはずなのになぜ…と悩んでいたら閃きました。

シークレットを記述したファイルのマウントの仕方を間違えていた

Clooud Runでは、機密情報を記載したシークレットを作成して、それを各プロジェクトで参照します。

シークレットを使用する際にファイルベースで読み込むには、マウントパスを指定するのですが、ここで間違いが。

マウントパスを指定した先は、ファイル等が存在する場合上書きされてしまうようです。

私はそのパスをプロジェクトルートに設定していたため、すべて上書きされ存在しないものになっていました…。

マウントパスを/conf/.envとして新規ディレクトリを指定し、無事Dockerfileがconfigを参照できるようになりました!

今度はpython側で.envが認識できない

無事起動できたと思いきや、今度は.envが認識されず、

KeyError: 'SECRET_KEY'

とログに記載が…。

.envを読み込むためのパスを忘れず設定すべし

結論、.envを読み込むパスの設定が間違っていました。
環境変数周りは、dotenvを使っているので、load_dotenvで以下のようにパスの設定が必要でした。

wsgi.py
import os

from django.core.wsgi import get_wsgi_application
from dotenv import load_dotenv

# wsgi.pyから見て、親の親ディレクトリがルートになるのでdirnameを2回適用している
dotenv_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), "environment/.env")
load_dotenv(dotenv_path=dotenv_path)
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.production")

application = get_wsgi_application()
project-root
├── Dockerfile
├── Dockerfile.dev
├── environment
│   └── .env
├── config
│   ├── __init__.py
│   ├── asgi.py
│   ├── settings
│   │   ├── __init__.py
│   │   ├── base.py
│   │   ├── devlopment.py
│   │   └── production.py
│   ├── urls.py
│   └── wsgi.py
├── manage.py
├── media
├── app
├── requirements.txt
├── static
├── staticfiles
└── templates

無事読み込めて、デプロイできました!!

1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?