Amazon S3から私のDjangoプロジェクト(Herokuでホストされている)で静的ファイルとメディアファイルを提供しようとしています。静的ファイルはローカルとデプロイの両方で適切に提供されていますが、メディアファイルはローカルでのみ動作します。 localhostが提供するファイルがバケットから正しく追加されていることを確認できますが、セーブやローディングのどちらも本番環境では動作しません。Herokuが展開したdjangoプロジェクトのS3メディアファイルがありません
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>7430A21BE321C26B</RequestId>
<HostId>
h/c1VQF57wrLJ7JdHXuJ8LCrQdZL9PfQZN4G38Ihg8UYCxSt0znbxWfiTSDxz0dCooQoqgW9tpw=
</HostId>
</Error>
私は(セキレイの画像アップロードを介して)、ファイルを保存しようとすると、私が手に:私は(私は手動でバケットに追加された)メディアイメージにサービスを提供しようとすると、私は403個のアクセス拒否エラーを取得しますむしろ一般的なInternal Server Error - 500
です。私は問題が何であるかについて迷っています。私が静的だがメディアファイルではないという事実は、とても混乱している(そしてそれは単なる許可エラーではないと思う)の一部です。問題に関連していると思われるものがあります。
編集:私の生産設定でDEBUG = True
が異なる生産エラーをデバッグすることがわかった。これをFalseに設定すると、静的ファイルとのメディアファイルに対して403エラーが発生するようになりました。
私のバケットポリシー:settings.py
の
{
"Version": "2008-10-17",
"Statement": [
{
"Sid": "PublicReadForGetBucketObjects",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::owen-tribune/*"
},
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::494147019987:user/jtebert"
},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::owen-tribune",
"arn:aws:s3:::owen-tribune/*"
]
},
{
"Sid": "somethingElse",
"Action": "s3:ListBucket",
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::owen-tribune",
"arn:aws:s3:::owen-tribune/*"
],
"Principal": {
"AWS": [
"arn:aws:iam::494147019987:user/jtebert"
]
}
}
]
}
関連部分:custom_storages.py
で
AWS_ACCESS_KEY_ID = '###########'
AWS_SECRET_ACCESS_KEY = '################'
AWS_S3_HOST = 's3-us-east-2.amazonaws.com'
#AWS_SECRET_ACCESS_KEY = env['AWS_SECRET_ACCESS_KEY']
#AWS_ACCESS_KEY_ID = env['AWS_ACCESS_KEY_ID']
AWS_STORAGE_BUCKET_NAME = 'owen-tribune'
AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME
STATICFILES_LOCATION = 'static'
STATICFILES_STORAGE = 'owen.custom_storages.StaticStorage'
STATIC_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, STATICFILES_LOCATION)
MEDIAFILES_LOCATION = 'media'
MEDIA_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, MEDIAFILES_LOCATION)
DEFAULT_FILE_STORAGE = 'custom_storages.MediaStorage'
カスタムストレージ:
# custom_storages.py
from django.conf import settings
from storages.backends.s3boto import S3BotoStorage
class StaticStorage(S3BotoStorage):
location = settings.STATICFILES_LOCATION
class MediaStorage(S3BotoStorage):
location = settings.MEDIAFILES_LOCATION