Информация CreatedBy/LastModifiedBy для большого двоичного объекта в контейнере хранения Azure

Я пытаюсь обработать некоторые двоичные объекты в контейнере хранилища Azure. Наши бизнес-пользователи загружают csv файлы в blob container, Задача состоит в том, чтобы обработать эти файлы и сохранить данные в промежуточных таблицах в Azure SQL DB для них, чтобы проанализировать позже. Это включает в себя создание таблиц, динамически соответствующих файловой структуре csv файлы. У меня эта часть работает правильно. я использую python выполнить эту часть задачи.

Следующая часть задачи состоит в том, чтобы уведомить пользователя (который загрузил большой двоичный объект) по электронной почте, как только blob был обработан в БД, предоставив им имя таблицы, соответствующее blob, В идеале, я также должен иметь возможность устанавливать разрешения в БД, предоставляя пользователю права на чтение только для таблицы, соответствующей blob он загрузил.

Для этого я подумал, что прочитаю blobowner или же last modified by атрибуты из blob свойство и использовать эту информацию для уведомления / разрешения БД. Но я не могу найти такое свойство в свойствах BLOB-объектов. Я пытался использовать ведение журнала диагностики на уровне учетной записи хранения, но в журналах также не отображается информация о created by или же modified by,

Может кто-нибудь, пожалуйста, подскажите мне, как я могу заставить это работать?

2 ответа

BLOB-объекты в Azure поддерживают пользовательские метаданные в виде словаря пар ключ / значение, которые вы можете сохранить в файле foreach, но, по моему опыту, это не удобно во всех случаях, особенно потому, что вы не можете запрашивать те, которые не были прочитаны BLOB-объектом (Azure будет платить за стоимость) без учета передачи по сети.

от: https://docs.microsoft.com/en-us/azure/storage/blobs/storage-properties-metadata

Объекты в хранилище Azure поддерживают системные свойства и метаданные, определенные пользователем, в дополнение к содержащимся в них данным.

Системные свойства: Системные свойства существуют на каждом ресурсе хранения. Некоторые из них могут быть прочитаны или установлены, в то время как другие только для чтения. Под покровом некоторые системные свойства соответствуют определенным стандартным заголовкам HTTP. Клиентская библиотека хранилища Azure поддерживает их для вас.

Пользовательские метаданные: Пользовательские метаданные - это метаданные, которые вы указываете для данного ресурса в форме пары имя-значение. Вы можете использовать метаданные для хранения дополнительных значений с ресурсом хранения. Эти дополнительные значения метаданных предназначены только для ваших собственных целей и не влияют на поведение ресурса.

У меня было нечто очень похожее, чтобы сделать один раз и чтобы избежать создания внешних баз данных и подключения, я только что создал таблицу в хранилище, чтобы сохранить каждый URL-адрес файла из хранилища BLOB-объектов без всех необходимых вам свойств (пользовательских разрешений) в неструктурированной путь.

Вы можете найти чрезвычайно простой запрос информации из таблицы с помощью python (я сделал с.net), но я обнаружил, что это почти то же самое.

https://docs.microsoft.com/en-us/azure/cosmos-db/table-storage-how-to-use-python

Хранилище Azure Table и Azure Cosmos DB - это сервисы, которые хранят структурированные данные NoSQL в облаке, предоставляя хранилище ключей / атрибутов без схемы. Поскольку хранилище таблиц и база данных Azure Cosmos DB не содержат схем, ваши данные легко адаптировать по мере развития потребностей вашего приложения. Доступ к хранилищу таблиц и данным API таблиц является быстрым и экономичным для многих типов приложений и, как правило, дешевле по сравнению с традиционным SQL для аналогичных объемов данных.

Пример кода для фильтрации:

    from azure.cosmosdb.table.tableservice import TableService
    from azure.cosmosdb.table.models import Entity

table_service = TableService(connection_string='DefaultEndpointsProtocol=https;AccountName=myaccount;AccountKey=mykey;TableEndpoint=myendpoint;)

    tasks = table_service.query_entities('tasktable', filter="PartitionKey eq 'tasksSeattle'")
for task in tasks:
    print(task.description)
    print(task.priority)

Таким образом, вам нужно только создать таблицу и использовать ключи из Azure для ее подключения. Надеюсь, это поможет вам.

Поскольку информация о том, кто создал / последним изменил большой двоичный объект, недоступна в качестве системного свойства, вам нужно будет разработать собственную реализацию. Я могу придумать несколько решений для этого (без использования внешней базы данных для хранения этой информации):

  • Сохраните эту информацию как метаданные блоба: каждый блоб может иметь свои метаданные. Вы можете сохранить эту информацию в метаданных BLOB-объектов, создав два ключа: CreatedBy а также LastModifiedBy и хранить соответствующую информацию. Обратите внимание, что метаданные BLOB-объектов не являются запрашиваемыми, а также очень легко перезаписать метаданные. Это самый простой подход, который я мог придумать.
  • Использоватьx-ms-client-request-id: С каждым запросом к хранилищу Azure вы можете передать пользовательское значение в x-ms-client-request-id заголовок запроса. Если аналитика хранилища включена, эта информация регистрируется. Затем вы можете запросить данные аналитики, чтобы найти эту информацию. Однако найти эту информацию в журналах аналитики крайне обременительно, поскольку она сохраняется в виде отдельной позиции в BLOB-объекте. $logs контейнер. Чтобы найти эту информацию, вам сначала нужно найти соответствующий BLOB-объект, содержащий эту информацию. Затем вам нужно будет скачать блоб, найти соответствующую запись в журнале и извлечь эту информацию.

Учитывая, что ни одно из решений не является идеальным, я бы порекомендовал вам сохранить эту информацию во внешней базе данных. Было бы намного проще достичь вашей цели, если бы вы использовали внешнюю базу данных.

Другие вопросы по тегам