Проблемы с разрешением S3 от Django CMS - PullRequest
0 голосов
/ 22 февраля 2020

У меня 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. Они выглядят правильно (у меня были печатные заявления, чтобы это проверить), но я не вижу альтернативы.

Любая помощь приветствуется.

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...