Azure存储容器中Blob的CreatedBy / LastModifiedBy信息

时间:2018-07-16 01:02:39

标签: python-3.x azure azure-blob-storage

我正在尝试处理Azure存储容器中的一些Blob。我们的业务用户将csv个文件上传到blob container。任务是处理这些文件,并将数据保留在Azure SQL DB中的登台表中,以供以后分析。这涉及创建动态匹配csv文件的文件结构的表。我的这部分工作正常。我正在使用python完成任务的这一部分。

任务的下一部分是在数据库中处理了blob之后,通过向用户(与他们上传表的名称相关)提供与{{1} }。理想情况下,我还应该能够通过仅在与他上载的blob相对应的表上向用户授予读取权限来设置数据库中的权限。

要实现此目的,我想我将从blob属性中读取blob ownerlast modified by属性,并将该信息用于通知/数据库权限。但是我无法在blob properties中找到任何此类属性。我尝试在存储帐户级别使用诊断日志记录,但是日志中也没有显示有关blobcreated by的任何信息。

有人可以指导我如何进行这项工作吗?

2 个答案:

答案 0 :(得分:0)

由于无法创建有关谁创建/最后修改blob的信息作为系统属性,因此您需要提出自己的实现。我可以想到一些解决方案(无需使用外部数据库来存储此信息):

  • 将此信息存储为Blob的元数据:每个Blob都可以具有自定义元数据。您可以通过创建两个键:CreatedByLastModifiedBy将信息存储在blob的元数据中,并存储适当的信息。请注意,blob的元数据不可查询,并且覆盖元数据非常容易。到目前为止,这是我能想到的最简单的方法。
  • 使用x-ms-client-request-id :对于每个向Azure存储的请求,您都可以在x-ms-client-request-id请求标头中传递自定义值。如果启用了存储分析,则会记录此信息。然后,您可以查询分析数据以查找此信息。但是,在分析日志中找到此信息非常麻烦,因为该信息已作为行项目保存在$logs容器的Blob中。要查找此信息,您首先需要找到包含此信息的适当的Blob。然后,您需要下载blob,找到适当的日志条目并提取此信息。

考虑到所有解决方案都不完美,我建议您将这些信息保存在外部数据库中。如果使用外部数据库,则可以轻松实现目标。

答案 1 :(得分:0)

azure中的斑点支持自定义元数据作为键/值对的字典,您可以保存foreach文件,但是根据我的经验,在所有情况下都不方便,特别是因为您无法在不读取斑点的情况下查询那些无需支付网络费用。

来自: https://docs.microsoft.com/en-us/azure/storage/blobs/storage-properties-metadata

  

Azure存储中的对象支持系统属性和用户定义   元数据,以及它们包含的数据。

     

系统属性:每个存储资源上都有系统属性。   其中一些可以读取或设置,而另一些则是只读的。在下面   涵盖,某些系统属性对应于某些标准HTTP   标头。 Azure存储客户端库为您维护这些。

     

用户定义的元数据:用户定义的元数据是您   在给定资源上以名称-值对的形式指定。您可以   使用元数据将其他值与存储资源一起存储。这些   其他元数据值仅用于您自己的目的,而不是   影响资源的行为。

我有一次非常相似的操作,并且避免创建外部数据库并进行连接,我刚刚在存储中创建了一个表,以保存blob存储中的每个文件url,而无需您需要的所有属性(用户权限)以非结构化的方式。

您可能会发现使用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中的键进行连接即可。 希望对您有帮助。