質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.36%

djangoでawsの設定をするとServer Error (500)となる

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,231

score 15

前提・実現したいこと

django+heroku+awsでECサイトを製作しています。herokuへのデプロイ完了後、画像が表示されないのでaws設定をここのサイトを見て追記しました。しかし、Server Error (500)となりなにも表示されません。
awsの設定記述前は画像以外は表示されていたため、そこに問題があると思い調べたのですが分かりませんでした。どなたかどこが間違っているか教えてください。
ローカル環境では画像含めすべて表示されます。また、https://私のサイト.herokuapp.com/admin/には入り、編集することができます。

発生している問題・エラーメッセージ

heroku logsを見る限り、これ以外のエラーメッセージはありませんでした。

2020-03-14T15:53:02.831680+00:00 heroku[router]: at=info method=GET path="/" host=aiecsite.herokuapp.com request_id=8bb35d57-85aa-41a8-a949-4739ba93053b fwd="123.227.40.180" dyno=web.1 connect=0ms service=913ms status=500 bytes=234 protocol=https
2020-03-14T15:53:02.829594+00:00 app[web.1]: 10.41.198.134 - - [15/Mar/2020:00:53:02 +0900] "GET / HTTP/1.1" 500 27 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36"
2020-03-14T15:56:20.111383+00:00 heroku[router]: at=info method=GET path="/" host=aiecsite.herokuapp.com request_id=9c88be55-4b5c-4c6d-a193-ef0ac5498e9c fwd="123.227.40.180" dyno=web.1 connect=0ms service=35ms status=500 bytes=234 protocol=https
2020-03-14T15:56:20.110689+00:00 app[web.1]: 10.16.250.243 - - [15/Mar/2020:00:56:20 +0900] "GET / HTTP/1.1" 500 27 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36"
2020-03-14T16:02:34.009582+00:00 app[web.1]: 10.156.16.229 - - [15/Mar/2020:01:02:34 +0900] "GET /admin/ HTTP/1.1" 200 5981 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36"
2020-03-14T16:02:34.011347+00:00 heroku[router]: at=info method=GET path="/admin/" host=aiecsite.herokuapp.com request_id=569721dd-4b8c-4f3e-bd58-df28132a9e36 fwd="123.227.40.180" dyno=web.1 connect=1ms service=387ms status=200 bytes=6433 protocol=https
2020-03-14T16:02:39.089861+00:00 app[web.1]: 10.156.16.229 - - [15/Mar/2020:01:02:39 +0900] "GET /admin/app/sale/ HTTP/1.1" 200 3377 "https://aiecsite.herokuapp.com/admin/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3
987.132 Safari/537.36"

settings.py

import os
import dj_database_url

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

DEBUG = False

ALLOWED_HOSTS = ['*']

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'users',
    'django.contrib.humanize',
    'app',
    'storages', ####追記
]

AUTH_USER_MODEL = 'users.User'
NUMBER_GROUPING = 3

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'whitenoise.middleware.WhiteNoiseMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'ecsite.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'ecsite.wsgi.application'

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'name',
        'USER': 'user',
        'PASSWORD': '',
        'HOST': 'host',
        'PORT': '',
    }
}

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]

LANGUAGE_CODE = 'ja'

TIME_ZONE = 'Asia/Tokyo'

USE_I18N = True

USE_L10N = True

USE_TZ = True

PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))

LOGIN_URL = 'app:login'
LOGIN_REDIRECT_URL = 'app:index'
LOGOUT_REDIRECT_URL = 'app:index'

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

STATIC_URL = '/static/'
STATICFILES_DIRS = (os.path.join(BASE_DIR, "static"),)
STATIC_ROOT = os.path.join(PROJECT_ROOT, 'static')

SESSION_SAVE_EVERY_REQUEST = True

try:
    from .local_settings import *
except ImportError:
    pass


if not DEBUG:

##################################追記した部分################################################

    SECRET_KEY = os.environ['SECRET_KEY']

    AWS_ACCESS_KEY_ID = os.environ['AWS_ACCESS_KEY_ID']
    AWS_SECRET_ACCESS_KEY = os.environ['AWS_SECRET_ACCESS_KEY']
    AWS_STORAGE_BUCKET_NAME = os.environ['AWS_STORAGE_BUCKET_NAME']

    DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
    S3_URL = 'http://%s.s3.amazonaws.com/' % AWS_STORAGE_BUCKET_NAME
    MEDIA_URL = S3_URL

    AWS_S3_FILE_OVERWRITE = False
    AWS_DEFAULT_ACL = None

##################################ここまで################################################

    import django_heroku
    django_heroku.settings(locals())

db_from_env = dj_database_url.config(conn_max_age=600, ssl_require=True)
DATABASES['default'].update(db_from_env)

backends.py(2020/03/15追記)

from storages.backends.s3boto3 import S3Boto3Storage

class MediaStorage(S3Boto3Storage):
    location = 'media'
    file_overwrite = False

補足情報(FW/ツールのバージョンなど)

python 3.8.0
appdirs==1.4.3
boto3==1.12.21
botocore==1.15.21
certifi==2019.11.28
chardet==3.0.4
distlib==0.3.0
dj-database-url==0.5.0
Django==2.2
django-heroku==0.3.1
django-storages==1.9.1
docutils==0.15.2
filelock==3.0.12
gunicorn==20.0.4
idna==2.9
jmespath==0.9.5
Pillow==7.0.0
psycopg2==2.8.4
python-dateutil==2.8.1
pytz==2019.3
requests==2.23.0
s3transfer==0.3.3
six==1.14.0
sqlparse==0.3.1
urllib3==1.25.8
virtualenv==20.0.10
whitenoise==4.1.3

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

settings.pyのS3_URLを次の様にしたらどうでしょうか?

S3_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, AWS_LOCATION)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/03/15 20:02

    回答ありがとうございます。ak_suzuki様の通りにしたところ、AWS_S3_CUSTOM_DOMAINとAWS_LOCATIONの変数が無いとエラーが出たので、2通り変更を試しました。


    try:
    from .local_settings import *
    except ImportError:
    pass

    if not DEBUG:
    SECRET_KEY = os.environ['SECRET_KEY']

    AWS_ACCESS_KEY_ID = os.environ['AWS_ACCESS_KEY_ID']
    AWS_SECRET_ACCESS_KEY = os.environ['AWS_SECRET_ACCESS_KEY']
    AWS_STORAGE_BUCKET_NAME = os.environ['AWS_STORAGE_BUCKET_NAME']
    AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME
    AWS_LOCATION = 'static'

    DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
    S3_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, AWS_LOCATION)
    MEDIA_URL = S3_URL

    AWS_S3_FILE_OVERWRITE = False
    AWS_DEFAULT_ACL = None

    import django_heroku
    django_heroku.settings(locals())

    db_from_env = dj_database_url.config(conn_max_age=600, ssl_require=True)
    DATABASES['default'].update(db_from_env)

    と書き直しましたが、Server Error (500)のままでした。

    https://blog.daisukekonishi.com/post/django-drf-storages/
    https://narito.ninja/blog/detail/27/
    上記のサイトを参考に、修正しました。

    try:
    from .local_settings import *
    except ImportError:
    pass

    if not DEBUG:
    SECRET_KEY = os.environ['SECRET_KEY']

    AWS_ACCESS_KEY_ID = os.environ['AWS_ACCESS_KEY_ID']
    AWS_SECRET_ACCESS_KEY = os.environ['AWS_SECRET_ACCESS_KEY']
    AWS_STORAGE_BUCKET_NAME = os.environ['AWS_STORAGE_BUCKET_NAME']
    AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME
    AWS_DEFAULT_ACL = os.environ.get('AWS_DEFAULT_ACL', 'public-read')
    AWS_LOCATION = 'static'
    AWS_S3_OBJECT_PARAMETERS = {'CacheControl': 'max-age=86400',}

    AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME
    STATIC_URL = 'https://%s/%s/' % (AWS_S3_CUSTOM_DOMAIN, AWS_LOCATION)
    STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
    DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

    import django_heroku
    django_heroku.settings(locals())

    db_from_env = dj_database_url.config(conn_max_age=600, ssl_require=True)
    DATABASES['default'].update(db_from_env)

    とし、settings.pyと同じ階層にbackends.py(内容は質問に追記しています。)を作成し、python manage.py collectstaticと実行し、デプロイ→heroku openしたところ、画像以外は表示され動作も問題ないです。画像のURLはhttps://aiecsite.s3.amazonaws.com/static/product/smartphone_hogo_film_3H9lnla.png
    とaws s3のURLになっています。

    キャンセル

  • 2020/03/15 20:32

    上記の②の状態で、https://私のサイト.herokuapp.com/adminから画像を登録したところ、無事表示されました。本当にありがとうございました。

    キャンセル

0

ak_suzuki様のサポートのおかげでdjango+heroku+awsを使用し、無事サイト・画像が表示できました。今後のために最終的な設定、参考サイトをまとめておきます。参考にしてください。

settings.py

******上は同じため省略**********

try:
    from .local_settings import *
except ImportError:
    pass

if not DEBUG:
    SECRET_KEY = os.environ['SECRET_KEY']

    AWS_ACCESS_KEY_ID = os.environ['AWS_ACCESS_KEY_ID']
    AWS_SECRET_ACCESS_KEY = os.environ['AWS_SECRET_ACCESS_KEY']
    AWS_STORAGE_BUCKET_NAME = os.environ['AWS_STORAGE_BUCKET_NAME']
    AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME
    AWS_S3_OBJECT_PARAMETERS = {'CacheControl': 'max-age=86400',}

    AWS_DEFAULT_ACL = os.environ.get('AWS_DEFAULT_ACL', 'public-read')
    AWS_LOCATION = 'static'
    STATIC_URL = 'https://%s/%s/' % (AWS_S3_CUSTOM_DOMAIN, AWS_LOCATION)
    STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

    DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

    import django_heroku
    django_heroku.settings(locals())

db_from_env = dj_database_url.config(conn_max_age=600, ssl_require=True)
DATABASES['default'].update(db_from_env)

backends.py(settings.pyと同じ階層に作成)

from storages.backends.s3boto3 import S3Boto3Storage

class MediaStorage(S3Boto3Storage):
    location = 'media'
    file_overwrite = False

ターミナルで、
python manage.py collectstatic
git add -A .
git commit -m "comment"
git push heroku master
heroku open
と実行。

https://サイト名.herokuapp.com/admin
に行き、画像を登録。

参考サイト様
静的ファイル、メディアファイルをAmazon S3で管理
PengNote
Djangoで画像をS3にアップしたいのですがエラーが出てしまいます
DjangoでAWSのS3の設定をすると動画投稿サイトがInternal Server Errorになる

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.36%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る