У меня Django CMS, работающая на экземпляре Elasti c Beanstalk. Носитель хранится в корзине S3. CMS может получить доступ к файлам мультимедиа, если корзина опубликована c, но CMS не может получить к ней доступ, даже с действительными учетными данными, если корзина не опубликована c. Я хотел бы, чтобы корзина была приватной и все еще могла иметь доступ к файлам через CMS.
Я следовал инструкциям здесь: https://simpleisbetterthancomplex.com/tutorial/2017/08/01/how-to-setup-amazon-s3-in-a-django-project.html, чтобы настроить экземпляр для использования S3 ведро для СМИ. Цель состоит в том, чтобы заблокировать доступ к S3 publi c (как показано в руководстве) и файлы корзины, доступные только через CMS.
CMS находится в той же учетной записи, что и корзина. Я могу подключить sh к экземпляру CMS и использовать инструменты командной строки для доступа к корзине (предположительно, потому что у учетной записи экземпляра EB есть пользователь, который входит в группу с политикой AmazonS3FullAccess).
CMS Доступ к файлам в хранилище мультимедиа возможен только в том случае, если я (1) заставляю хранилище publi c и (2) выбираю подкаталоги высокого уровня в хранилище и нажимаю «Actions / Make Publi c».
Если эти два действия не предприняты, доступ CMS к медиа-файлам возвращает 403.
Когда корзина опубликована c, CMS может добавлять файлы в корзину, но не может их читать пока я не опубликую объект c (как в шаге 2 выше).
Настройки AWS в файле settings.py:
AWS_DEFAULT_ACL = None
AWS_ACCESS_KEY_ID = <aws_access_key_id>
AWS_SECRET_ACCESS_KEY = <aws_secret_key_id>
AWS_STORAGE_BUCKET_NAME = <cms_bucket_name>
AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME
AWS_S3_OBJECT_PARAMETERS = {
'CacheControl': 'max-age=86400',
}
AWS_MEDIA_LOCATION = 'media'
DEFAULT_FILE_STORAGE = 'mycms.storage_backends.MediaFileStorage'
MEDIA_ROOT = os.path.join(DATA_DIR, 'media')
Я проверил ключи доступа используя код ниже (модифицированный, чтобы скрыть детали). Когда корзина CMS является закрытой, приведенный ниже код работает, если учетные данные установлены правильно, и завершается ошибкой, если учетные данные установлены неправильно, поэтому я думаю, что учетные данные действительны.
import boto3
def get_file_from_bucket ():
key_id = '<access_key_id>'
key_value = '<secret_key>'
s3 = boto3.client ('s3', aws_access_key_id = key_id, aws_secret_access_key = key_value)
s3.download_file('<cms_bucket>', '<a_file_in_the_bucket>', 'out.txt')
if __name__ == "__main__":
get_file_from_bucket ()
На основании того, что я видел Я думаю, что значения имени сегмента settings.py действительны, потому что экземпляр CMS может обращаться к файлам, если корзина общедоступна; Я думаю, что учетные данные действительны, потому что клиент boto3 может получить доступ к файлам, даже если корзина не опубликована c. Я предполагаю, что я неправильно устанавливаю учетные данные в settings.py. Они выглядят правильно (у меня были печатные заявления, чтобы это проверить), но я не вижу альтернативы.
Любая помощь приветствуется.
Спасибо.