Информация CreatedBy/LastModifiedBy для большого двоичного объекта в контейнере хранения Azure
Я пытаюсь обработать некоторые двоичные объекты в контейнере хранилища Azure. Наши бизнес-пользователи загружают csv
файлы в blob container
, Задача состоит в том, чтобы обработать эти файлы и сохранить данные в промежуточных таблицах в Azure SQL DB
для них, чтобы проанализировать позже. Это включает в себя создание таблиц, динамически соответствующих файловой структуре csv
файлы. У меня эта часть работает правильно. я использую python
выполнить эту часть задачи.
Следующая часть задачи состоит в том, чтобы уведомить пользователя (который загрузил большой двоичный объект) по электронной почте, как только blob
был обработан в БД, предоставив им имя таблицы, соответствующее blob
, В идеале, я также должен иметь возможность устанавливать разрешения в БД, предоставляя пользователю права на чтение только для таблицы, соответствующей blob
он загрузил.
Для этого я подумал, что прочитаю blob
owner
или же 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-объект, содержащий эту информацию. Затем вам нужно будет скачать блоб, найти соответствующую запись в журнале и извлечь эту информацию.
Учитывая, что ни одно из решений не является идеальным, я бы порекомендовал вам сохранить эту информацию во внешней базе данных. Было бы намного проще достичь вашей цели, если бы вы использовали внешнюю базу данных.