【发布时间】:2017-05-01 13:51:02
【问题描述】:
我正在尝试从 Amazon S3 提供我的 Django 项目(托管在 Heroku 上)中的静态和媒体文件。静态文件现在可以在本地和部署中正常服务,但媒体文件只能在本地工作。当 localhost 提供服务时,我可以验证文件是否已从我的存储桶中正确添加和提供服务,但在生产中既不保存也不加载工作。当我尝试提供媒体图像(我手动添加到存储桶中)时,我收到 403 access denied 错误:
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>7430A21BE321C26B</RequestId>
<HostId>
h/c1VQF57wrLJ7JdHXuJ8LCrQdZL9PfQZN4G38Ihg8UYCxSt0znbxWfiTSDxz0dCooQoqgW9tpw=
</HostId>
</Error>
当我尝试保存文件(通过 Wagtail 图像上传)时,我得到了相当通用的 Internal Server Error - 500。我不知道问题出在哪里。我可以获得静态文件但不能获得媒体文件的事实是令人困惑的一部分(并且让我认为这不仅仅是权限错误)。以下是我认为可能与问题相关的内容。
编辑:我意识到我的生产设置中有DEBUG = True 来自调试不同的生产错误。当我将其设置为 False 时,我现在收到静态文件 和 媒体文件的 403 错误。
我的存储桶政策:
{
"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"
]
}
}
]
}
settings.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 中的自定义存储:
# 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
【问题讨论】:
标签: django heroku amazon-s3 media