У меня есть представление django, которое должно принимать запросы POST с заархивированным файлом и загружать их в контейнер BLOB-объектов хранилища Azure.
Это представление работает на моем локальном компьютере, но завершается ошибкой после его контейнера и развертывания как в виде веб-приложения в облачных службах Azure, так и в качестве контейнера Docker на моем локальном компьютере.
Сначала я подумал, что это проблема с разрешениями, потому что:
Запуск приложения локально - Отправка zip-файла возвращает 204 (успешно)
ЕслиЯ отключаю VPN, отправляя zipfile возвращает 500 Я не понял, как получить 500 от запуска через Azure.
После добавления сетевого правила, позволяющего мой текущий IPадрес (который я удалил позже), отправка zipfile возвращает 204 еще раз. Однако мне пришлось добавить IP-адрес как в контейнер хранения, так и в базу данных (поскольку API должен проверять токен).
Запуск приложения в Azure
При отправке zip-файла возвращается 502
При добавлении IP-адреса в контейнер хранения и базу данных по-прежнему возвращается 502
Добавление всего диапазона IP-адресов (веб-приложения Azure могут иметь несколько возможных и одно виртуальное) не меняет этого. Существует третий список возможных IP-адресов, связанных с приложением, но это для главных приложений. Я не думаю, что это применимо, но я думаю, что могу вернуться и проверить это, чтобы быть уверенным.
Устранение проблемы: несмотря на получение 502, а не любого из кодов ошибокЯ спросил, я выделил проблему в строке:
block_blob_service.create_container(container_name)
Без этой строки я получаю соответствующие коды ошибок. Запуск этой строки локально, в REPL, я могу получить ответ, если я не покину VPN, в этом случае он говорит, что запрос не авторизован. Добавление сетевого правила через AZ CLI исправляет это.
Кроме того, Googling указал мне на настройки --default-action для контейнера хранения, а также на вышеупомянутые идеи IP. --default-action - разрешить или запретить создание контейнеров по новым / случайным IP-адресам. Изменение этого параметра на «разрешить» Давайте создадим контейнеры локально, вне VPN, без явного правила IP, используя строку 120 в REPL. Изменение его на «запретить» Запрещает мне создавать контейнер локально, вне VPN, используя линию 120Выдает ошибку. Ни одна из этих настроек не влияет на ошибку 502 в Azure. Я подумал, что это может быть причиной истечения времени ожидания, поскольку ошибка 502 возникает только для этой страницы. Следовательно, это не ошибка конфигурации сервера или оружия. Поэтому я добавил значение таймаута в объект block_blob_service. Это не помогло.
Я наконец загрузил контейнер локально и ssh'ed в него, чтобы попытаться получить больше результатов отладки. Похоже, что представление попадает в цикл аутентификации и вызывает сбой Python.
Вот представление, которое отвечает за загрузку:
class ZipUpload(APIView):
authentication_classes = [TokenAuthentication]
permission_classes = (IsAuthenticated,)
parser_classes = [FileUploadParser]
parser_classes = [MultiPartParser]
def post(self, request, format=None):
# Todo: add isAuthenticated check and response upon failure.
try:
try:
# Create the container from the settings file (fluxdb_clinical/settings_test.py, or prod, depending on stack).
account_name = settings.BLOCK_BLOB_SERVICE['account_name']
account_key = settings.BLOCK_BLOB_SERVICE['account_key']
block_blob_service = BlockBlobService(account_name=account_name, account_key=account_key, socket_timeout=60)
container_name = settings.BLOCK_BLOB_SERVICE['container_name']
# this next line breaks on the azure web-app platform. I think the container/blob must be
# IP restricted in some way, as this line works on my dev machine until I leave the VPN
block_blob_service.create_container(container_name)
# Disable public access, restricting access to requests using keys.
block_blob_service.set_container_acl(container_name, public_access=None)
except Exception as e:
logger.exception(e)
return(Response(status=STATUS['container_creation_failure']))
try:
# Create a filename, using the timestamp to ensure unique names.
# Do we need to make a way to name the file by the actual test name? Or should I use the token to look up the user
# and make a name that way so we can sort zipfiles by user?
now = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
filename = 'zipfile' + str(now) + '.zip'
except:
return(Response(status=STATUS['dunno why would be breaking shit']))
try:
file_obj = request.FILES['archive']
except:
return(Response(status=STATUS['archive_retrieval_failure']))
try:
zipp = file_obj.read()
block_blob_service.create_blob_from_bytes(container_name, filename, zipp)
except Exception as e:
return(Response(status=STATUS['zip_write_failure']))
return Response(status=STATUS['successful'])
except Exception as e:
return(Response(e))
Если бы проблема была связана с учетными данными или аутентификацией токена, я быожидайте, что сбои произойдут независимо от того, где приложение было запущено. Кроме того, если бы я неправильно создавал экземпляр контейнера, я бы ожидал, что он повалится везде
Насколько я могу судить, взаимодействие между http-запросами (используемыми методом) и докером вызывает проблему. Тем не менее, я могу открыть python REPL в контейнере Docker и запустить его там без проблем.
Вот выходные данные сервера, работающего в контейнере Docker - который, кажется, указывает на цикл аутентификации.
.
.
.
File "/usr/local/lib/python3.6/site-packages/azure_storage_logging/handlers.py", line 73 in put_file_into_storage
File "/usr/local/lib/python3.6/site-packages/azure_storage_logging/handlers.py", line 152 in doRollover
File "/usr/local/lib/python3.6/logging/handlers.py", line 72 in emit
File "/usr/local/lib/python3.6/logging/__init__.py", line 865 in handle
File "/usr/local/lib/python3.6/logging/__init__.py", line 1516 in callHandlers
File "/usr/local/lib/python3.6/logging/__init__.py", line 1454 in handle
File "/usr/local/lib/python3.6/logging/__init__.py", line 1444 in _log
File "/usr/local/lib/python3.6/logging/__init__.py", line 1308 in info
File "/usr/local/lib/python3.6/site-packages/azure/storage/common/storageclient.py", line 330 in _perform_request
File "/usr/local/lib/python3.6/site-packages/azure/storage/blob/baseblobservice.py", line 693 in create_container
File "/usr/local/lib/python3.6/site-packages/azure_storage_logging/handlers.py", line 73 in put_file_into_storage
File "/usr/local/lib/python3.6/site-packages/azure_storage_logging/handlers.py", line 152 in doRollover
File "/usr/local/lib/python3.6/logging/handlers.py", line 72 in emit
File "/usr/local/lib/python3.6/logging/__init__.py", line 865 in handle
File "/usr/local/lib/python3.6/logging/__init__.py", line 1516 in callHandlers
File "/usr/local/lib/python3.6/logging/__init__.py", line 1454 in handle
File "/usr/local/lib/python3.6/logging/__init__.py", line 1444 in _log
File "/usr/local/lib/python3.6/logging/__init__.py", line 1308 in info
File "/usr/local/lib/python3.6/site-packages/azure/storage/common/storageclient.py", line 330 in _perform_request
File "/usr/local/lib/python3.6/site-packages/azure/storage/blob/baseblobservice.py", line 693 in create_container
File "/usr/local/lib/python3.6/site-packages/azure_storage_logging/handlers.py", line 73 in put_file_into_storage
File "/usr/local/lib/python3.6/site-packages/azure_storage_logging/handlers.py", line 152 in doRollover
File "/usr/local/lib/python3.6/logging/handlers.py", line 72 in emit
File "/usr/local/lib/python3.6/logging/__init__.py", line 865 in handle
File "/usr/local/lib/python3.6/logging/__init__.py", line 1516 in callHandlers
File "/usr/local/lib/python3.6/logging/__init__.py", line 1454 in handle
File "/usr/local/lib/python3.6/logging/__init__.py", line 1444 in _log
File "/usr/local/lib/python3.6/logging/__init__.py", line 1308 in info
File "/usr/local/lib/python3.6/site-packages/azure/storage/common/storageclient.py", line 330 in _perform_request
File "/usr/local/lib/python3.6/site-packages/azure/storage/blob/baseblobservice.py", line 693 in create_container
File "/usr/local/lib/python3.6/site-packages/azure_storage_logging/handlers.py", line 73 in put_file_into_storage
.
.
.
File "/usr/local/lib/python3.6/site-packages/azure/storage/blob/baseblobservice.py", line 693 in create_container
File "/usr/local/lib/python3.6/site-packages/azure_storage_logging/handlers.py", line 73 in put_file_into_storage
File "/usr/local/lib/python3.6/site-packages/azure_storage_logging/handlers.py", line 152 in doRollover
File "/usr/local/lib/python3.6/logging/handlers.py", line 72 in emit
File "/usr/local/lib/python3.6/logging/__init__.py", line 865 in handle
File "/usr/local/lib/python3.6/logging/__init__.py", line 1516 in callHandlers
File "/usr/local/lib/python3.6/logging/__init__.py", line 1454 in handle
File "/usr/local/lib/python3.6/logging/__init__.py", line 1444 in _log
File "/usr/local/lib/python3.6/logging/__init__.py", line 1308 in info
File "/usr/local/lib/python3.6/site-packages/azure/storage/common/storageclient.py", line 330 in _perform_request
File "/usr/local/lib/python3.6/site-packages/azure/storage/blob/baseblobservice.py", line 693 in create_container
...
[2019-11-01 21:47:57 +0000] [33] [INFO] Booting worker with pid: 33
Я обрезал вывод пунктирными линиями.
Любая помощь приветствуется. Это моя вторая публикация, я старался быть тщательным, но если я что-то пропустил, пожалуйста, дайте мне знать.
Спасибо.
Редактировать: я нашел решение.
Мой pip-файл включал в себя только запись Azure-Storage-Logging и Azure-Storage-BLOB. Установив все лазурное колесо (pip install azure
затем pip freeze >> requirements.txt
), и оно заработало нормально.