🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Amazon S3

Amazon S3 (Simple Storage Service)とはアマゾン・ウェブ・サービスが提供するオンラインストレージサービスです。

Q&A

解決済

2回答

3720閲覧

DjangoでAWSのS3の設定をすると動画投稿サイトがInternal Server Errorになる

motuni

総合スコア20

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Amazon S3

Amazon S3 (Simple Storage Service)とはアマゾン・ウェブ・サービスが提供するオンラインストレージサービスです。

0グッド

0クリップ

投稿2019/10/28 14:12

編集2019/10/29 01:06

数日前にこちらで質問した者です。以前の質問はこちらですDjangoで画像をS3にアップしたいのですがエラーが出てしまいます

前回のエラーは「502 Bad Gateway nginx/1.14.0 (Ubuntu)」というエラーが出ていました。
今回はもう一度デプロイをやり直しました。

恐らくエラーが変わった理由は以下。

■ 前回、実行したコマンド→ pip install django-storages
→ pip install boto3 

■ 今回、実行したコマンド→ pip3 install django-storages
→ pip3 install boto3  

pipに3を付けてコマンドを叩いたところ、エラー表示が「502 Bad Gateway」から、「Internal Server Error」に変わったのです。

■ S3のバケットにも「python3 manage.py collectstatic」コマンドの後、無事にstaticフォルダが作成されました。

■ EC2のインスタンスの権限はIAMロールのAmazonS3FullAccess権限を割り当てました。

■ 主に参考にしたサイトは以下ですが、この通りにやっても上手くいかずに困りましたので自分なりに調べながらやっています。

静的ファイル、メディアファイルをAmazon S3で管理 - Narito Blog

■ 気になる所として、マイグレーションをしようとすると

raise ImproperlyConfigured("Could not load Boto's S3 bindings.\n" django.core.exceptions.ImproperlyConfigured: Could not load Boto's S3 bindings.

以上のエラー表示が出ます。

これが問題の解決の糸口の可能性がありますでしょうか?
ぜひご教示お願い致します。

settings.pyの設定は以下です。

STATIC_URL = '/static/' STATIC_ROOT = os.path.join(BASE_DIR, "static/") STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static') ] # メディアファイル関連 MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media/') LOGIN_URL = 'login' # 共通の設定 AWS_ACCESS_KEY_ID = 'AK×××××××××××××××××××××' AWS_SECRET_ACCESS_KEY = '×××××××××××××××××××××' AWS_STORAGE_BUCKET_NAME = 'motuni' AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME AWS_S3_OBJECT_PARAMETERS = { 'CacheControl': 'max-age=86400', # 1日はそのキャッシュを使う } # 静的ファイルの設定 AWS_LOCATION = 'static' STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage' STATIC_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, AWS_LOCATION) # メディアファイルの設定 DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

恐らくNginxの設定が間違っていると思いますが、どこが間違いなのかわかりません。

server { listen 80; server_name motuni.xyz; location = /favicon.ico {access_log off; log_not_found off;} location /static/ { root /home/ubuntu/project4; } location /media/ { root /home/ubuntu/project4; } location /static/admin { root /home/ubuntu/py36/lib/python3.6/site-packages/django/contrib/admin; } location / { include proxy_params; proxy_pass http://unix:/home/ubuntu/project4/project4.sock; } }

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

解決した。原因はurls.pyだった。

from storages.backends.s3boto import S3BotoStorage  ←これを削除 urlpatterns = [ path('admin/', admin.site.urls), path('videos/', include('videos.urls')), path('accounts/', include('accounts.urls')), path('accounts/', include('django.contrib.auth.urls')), path('', RedirectView.as_view(url='/videos/')), ]+ static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) StaticRootS3BotoStorage = lambda: S3BotoStorage(location='static') ←これを削除 MediaRootS3BotoStorage = lambda: S3BotoStorage(location='media') ←これを削除

「←これを削除」の部分を削除したら、無事にサイトが表示され、mediaファイルもS3に保存されるようになりました。urls.pyに不要な記述をしてしまっていたわけです。どこかのサイトに書かれていたため、書いて置いた方が良いと思い、記入してしまいました。

数日間、S3のことで頭がいっぱいで、挫折しそうになりましたが、あきらめなくて本当に良かったと思います。解答していただいた方にも感謝しております。ありがとうございました!

投稿2019/10/29 03:43

motuni

総合スコア20

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

投稿2019/10/28 22:17

ak_suzuki

総合スコア194

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

motuni

2019/10/28 23:55

コメントありがとうございます。 拝見しました。 settings.pyにもそのように書いています。 以下はsettings.pyの抜粋です。 ``` STATIC_URL = '/static/' STATIC_ROOT = os.path.join(BASE_DIR, "static/") STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static') ] # メディアファイル関連 MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media/') LOGIN_URL = 'login' # 共通の設定 AWS_ACCESS_KEY_ID = 'AK×××××××××××××××××××××' AWS_SECRET_ACCESS_KEY = '×××××××××××××××××××××' AWS_STORAGE_BUCKET_NAME = 'motuni' AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME AWS_S3_OBJECT_PARAMETERS = { 'CacheControl': 'max-age=86400', # 1日はそのキャッシュを使う } # 静的ファイルの設定 AWS_LOCATION = 'static' STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage' STATIC_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, AWS_LOCATION) # メディアファイルの設定 DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage' ``` Internal Server Errorが出ているので、やはりマイグレーションできないというのが何か問題でしょうか?もちろんS3設定前にはマイグレーションできました。
ak_suzuki

2019/10/29 00:02

私もNaritoさんのブログを見てS3の設定をしたのですが、私はうまくいきました。 ちなみにデプロイ先はHerokuです。 表示しようとしているHTMLにはエラーはないですか? 例えば画像やCSS、JSのリンク先URLがエラーになっているとか。。こうしたことでもinternal server error となることもあります。
motuni

2019/10/29 00:08

リンク先で間違いでinternal server errorになるんですね! ちょっとリンクを消してからHTMLファイルを上げ直してみます!
motuni

2019/10/29 00:24

HTMLフェイルを<p>ハロー</p>だけにしました。 しかし同じくinternal server errorでした。 sudo systemctl restart nginxとEC2インスタンスの再起動も行いました。 どうやらリンク先エラーではなさそうです。
motuni

2019/10/29 03:38

解決しました!いろいろすいませんでした。ありがとうございました!
ak_suzuki

2019/10/29 04:25

よかったですね!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問