Процесс Django-Celery на Heroku с AWS S3 Access Forbidden
Это довольно специфическая проблема, с которой я столкнулся, но я очень застрял. Я развернул свое приложение Django на Heroku. Это приложение позволяет пользователю загрузить pdf, который затем хранится в ведерном хранилище AWS S3. Затем приложение перенаправляет пользователя на страницу загрузки, пока pdf обрабатывается в фоновом процессе. Когда обработка завершена, пользователю предоставляется возможность просмотреть и принять изменения в записях базы данных.
Я использую celery на сервере Heroku-redis для асинхронной обработки. КАК бы то ни было, кажется, что у сервера Redis нет правильных прав на чтение и запись в мой AWS bucket. Важно отметить, что главный сервер имеет. Я знаю это, потому что когда пользователь загружает свой файл, результат сохраняется в нужной папке внутри ведра S3, и потому что у меня четко есть доступ к моим статическим файлам на сайте.
Очевидно, что произошел какой-то сбой в передаче учетных данных от сервера к брокеру, но я понятия не имею, как это исправить. Код и подробности ниже.
Вот мой файл celery.py:
from __future__ import absolute_import
import os
from celery import Celery
from django.conf import settings
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'propertybook.settings')
app = Celery('propertybook')
# Using a string here means the worker will not have to
# pickle the object when using Windows.
app.config_from_object('django.conf:settings',namespace='CELERY')
app.autodiscover_tasks()
#lambda: settings.INSTALLED_APPS
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))
А вот некоторые соответствующие настройки:
AWS_S3_OBJECT_PARAMETERS = {
'Expires': 'Thu, 31 Dec 2099 20:00:00 GMT',
'CacheControl': 'max-age=94608000',
}
AWS_STORAGE_BUCKET_NAME = '**************'
AWS_S3_REGION_NAME = 'us-east-2'
AWS_ACCESS_KEY_ID = '*****************'
AWS_SECRET_ACCESS_KEY = '********************************'
# Tell django-storages the domain to use to refer to static files.
AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME
# CELERY STUFF
CELERY_BROKER_URL = '*******.amazonaws.com:*****'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TIMEZONE = 'UTC'
CELERY_RESULT_BACKEND = 'django-db'
Для ясности, я использую плагины celery-results и celery-progress. Я уверен, что это связано с конфигурацией celery, но я не могу понять, что я сделал не так.
Разрешения ведра S3 установлены на блокирование публичного доступа, но существует политика, позволяющая пользователям из этой IAM-группы получать и отправлять объекты. Все отлично работает, когда я разрешаю публичный доступ, но это явно не долгосрочное решение.
***** UPDATE ******** Теперь похоже, что сам сервер тоже не может получить доступ к ведру S3. Я много читал о разрешениях AWS, но я явно упускаю большой кусок того, как они работают. Любая помощь будет очень признательна.