FileUploadMiscError при сохранении выходного файла из пакетной службы Azure

Я столкнулся со следующей ошибкой при попытке сохранить файлы журнала в хранилище BLOB-объектов Azure из выполнения пакетной службы Azure - «FileUploadMiscError - возникла различная ошибка при загрузке одного из выходных файлов». Эта ошибка не дает много информации о том, что может пойти не так. Я попытался проверить документацию Microsoft на наличие этого кода ошибки, но он не упоминает этот конкретный код ошибки. Ниже приведен соответствующий код для добавления задачи в пакетную службу Azure, который я перенес с C # на Python для сохранения файлов журнала.

Примечание. Контейнер, который я сконфигурировал, создается при добавлении задачи, но внутри него нет большого двоичного объекта.

import datetime
import logging
import os

import azure.storage.blob.models as blob_model
import yaml
from azure.batch import models
from azure.storage.blob.baseblobservice import BaseBlobService
from azure.storage.common.cloudstorageaccount import CloudStorageAccount
from dotenv import load_dotenv

LOG = logging.getLogger(__name__)


def add_tasks(batch_client, job_id, task_id, io_details, blob_details):

    task_commands = "This is a placeholder. Actual code has an actual task. This gets completed successfully."

    LOG.info("Configuring the blob storage details")
    base_blob_service = BaseBlobService(
        account_name=blob_details['account_name'],
        account_key=blob_details['account_key'])
    LOG.info("Base blob service created")

    base_blob_service.create_container(
        container_name=blob_details['container_name'], fail_on_exist=False)
    LOG.info("Container present")

    container_sas = base_blob_service.generate_container_shared_access_signature(
        container_name=blob_details['container_name'],
        permission=blob_model.ContainerPermissions(write=True),
        expiry=datetime.datetime.now() + datetime.timedelta(days=1))
    LOG.info(f"Container SAS created: {container_sas}")

    container_url = base_blob_service.make_container_url(
        container_name=blob_details['container_name'], sas_token=container_sas)
    LOG.info(f"Container URL created: {container_url}")

    # fpath = task_id + '/output.txt'
    fpath = task_id

    LOG.info(f"Creating output file object:")
    out_files_list = list()

    out_files = models.OutputFile(
        file_pattern=r"../stderr.txt",
        destination=models.OutputFileDestination(
            container=models.OutputFileBlobContainerDestination(
                container_url=container_url, path=fpath)),
        upload_options=models.OutputFileUploadOptions(
            upload_condition=models.OutputFileUploadCondition.task_completion))

    out_files_list.append(out_files)
    LOG.info(f"Output files: {out_files_list}")

    LOG.info(f"Creating the task now: {task_id}")
    task = models.TaskAddParameter(
        id=task_id, command_line=task_commands, output_files=out_files_list)

    batch_client.task.add(job_id=job_id, task=task)
    LOG.info(f"Added task: {task_id}")

person Shashank Verma    schedule 10.01.2019    source источник


Ответы (1)


В пакетной обработке OutputFile имеется ошибка, из-за которой не удается загрузить в контейнеры, если полный URL-адрес контейнера включает какие-либо параметры строки запроса, кроме тех, которые включены в токен SAS. К сожалению, модуль azure-storage-blob Python включает дополнительный параметр строки запроса при генерации URL-адреса через make_container_url.

Нам только что сообщили об этой проблеме, и в ближайшие недели будет выпущено исправление, но простой обходной путь - вместо использования make_container_url для создания URL-адреса, создайте его самостоятельно следующим образом: container_url = 'https://{}/{}?{}'.format(blob_service.primary_endpoint, blob_details['container_name'], container_sas).

Результирующий URL-адрес должен выглядеть примерно так: https://<account>.blob.core.windows.net/<container>?se=2019-01-12T01%3A34%3A05Z&sp=w&sv=2018-03-28&sr=c&sig=<sig> - в частности, в нем не должно быть restype=container (это то, что входит в пакет azure-storage-blob)

person Hydraxy    schedule 12.01.2019
comment
Это правильно. Я разобрался и написал свою функцию для генерации URL без параметра restype. Спасибо - person Shashank Verma; 13.01.2019