Сбой Azure-storage-blob create_container в докернизированном приложении Django - PullRequest
0 голосов
/ 02 ноября 2019

У меня есть представление 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), и оно заработало нормально.

1 Ответ

0 голосов
/ 06 ноября 2019

Я попытался сравнить пакеты, установленные pip install azure-storage-logging azure-storage-blob, с пакетами, установленными pip install azure, и удалить эти несвязанные пакеты azure-storage из azure пакетов, чтобы получить список, как показано на рисунке ниже.

enter image description here

Я думаю, вы можете попытаться добавить только эти недостающие пакеты из левого списка (исключая azure), он также будет работать нормально для вас.

Надеюсь, это поможет.

...