Chuyển đến nội dung chính

Azure Functions: Blob Index tag và metadata

Trong bài viết này, chúng ta sẽ đi qua các khái niệm về container, blobName, metadata và blob index. Từ đó chúng ta sẽ dễ dàng quản lý file trên container

Container

Container là một thư mục ảo để chứa các blob. Mỗi container phải có một tên duy nhất trong storage account

BlobName

BlobName là tên của một blob. BlobName phải là duy nhất trong container.

Ví dụ khi bạn mở Properties của 1 blob file trên Azure
Overview
Blob: TEMP/026a9132-16a3-4f14-9186-bfcb0eff4d3e
URL: https://abc-xyz.blob.core.windows.net/abc/TEMP/026a9132-16a3-4f14-9186-bfcb0eff4d3e
...
Metadata
Key    Value
...
Blob index tags
Key    Value
...
Trong đó:
  • container: abc
  • blobName: TEMP/026a9132-16a3-4f14-9186-bfcb0eff4d3e
Chúng ta triển khai hàm upload file như sau:
//...
var blobServiceClient = new BlobServiceClient(connectionString);
_blobContainerClient = blobServiceClient.GetBlobContainerClient(containerName);

//...

public BlobClient Upload(byte[] data, string blobName, string containerName)
{
    var binaryData = new BinaryData(data);
    var blobClient = _blobContainerClient.GetBlobClient($"{containerName}/{blobName}");
    blobClient.Upload(binaryData, true);
    return blobClient;
}

Metadata

Metadata là thông tin mô tả blob, ví dụ như name, status, type, v.v.

Ví dụ:
async Task SetMetadata(string storageAccountName, string accessKey, string blobBaseUri, string containerName, string blobName)
{
    var sharedKeyCredential = new StorageSharedKeyCredential(storageAccountName, accessKey);

    var blobServiceClient = new BlobServiceClient(new Uri(blobBaseUri), sharedKeyCredential);
    var containerClient = blobServiceClient.GetBlobContainerClient(containerName);

    var blobClient = containerClient.GetBlobClient(blobName);

    // Set the metadata.
    Dictionary<string, string> metadata = new();
    metadata.Add("Status", "1");
    blobClient.SetMetadata(metadata);

    // Get the metadata.
    BlobProperties blobProperties = await blobClient.GetPropertiesAsync();
    Console.WriteLine("Blob metadata:");

    // Enumerate the blob's metadata.
    foreach (var metadataItem in blobProperties.Metadata)
    {
        Console.WriteLine($"\tKey: {metadataItem.Key}");
        Console.WriteLine($"\tValue: {metadataItem.Value}");
    }
}

Nhược điểm của metadata là không thể dùng query để search trên Storage Account

Index tag

Vào tháng 5/2020, Microsoft thông báo một tính năng mới cho Azure blob Storage là Blob Index. Đây là tính năng cho phép bạn thêm key/value tags vào Blob object. Bạn có thể dễ dạng query Blob object mà không cần sử dụng dịch vụ Azure Search.

Có 1 số giới hạn có Index Tags

  • Mỗi blob có tối đa 10 blob index tag
  • Tag key có độ dài từ 1-128 kí tự
  • Tag value có độ dài từ 0-256 kí tự 
  • Tag key và value phân biệt chữ hoa và thường
  • Chỉ hỗ trợ string
  • ...

Dưới đây là Service dùng để upload và kiểm tra index tag

public class StorageService
{
    private readonly BlobServiceClient _client;

    public StorageService()
    {
        var connectionString = "DefaultEndpointsProtocol=https;AccountName=...";
        _client = new BlobServiceClient(connectionString);
    }

    public async Task UploadFile(string containerName, string filePath, Dictionary<string, string> tags)
    {
        string fileName = Path.GetFileName(filePath);
        BlobContainerClient container = _client.GetBlobContainerClient(containerName);
        BlobClient blob = container.GetBlobClient(fileName);

        using FileStream fileStream = File.OpenRead(filePath);
        await blob.UploadAsync(fileStream, true);
        fileStream.Close();
        await blob.SetTagsAsync(tags);
    }

    public async Task<List<TaggedBlobItem>> FindCustomerFiles(string customerName, string containerName = "")
    {
        var foundItems = new List<TaggedBlobItem>();
        string searchExpression = $"\"customer\"='{customerName}'";
        if (!string.IsNullOrEmpty(containerName))
            searchExpression = $"@container = '{containerName}' AND \"customer\" = '{customerName}'";

        await foreach (var page in _client.FindBlobsByTagsAsync(searchExpression).AsPages())
        {
            foundItems.AddRange(page.Values);
        }
        return foundItems;
    }
}
Kiểm tra Service:
var storageService = new StorageService();
var files = await storageService.FindCustomerFiles(customerName: "Acme Inc.", containerName: "abc");
foreach (var file in files)
{
    Console.WriteLine(file.BlobName);
}

Lưu ý: Hiện tại hàm FindBlobsByTagsAsync() chỉ hoạt động với Azure Storage Account, không hoạt động được với Emulator Storage Account. 

Một số quy tắc cho query

Sử dụng dấu nháy đơn cho key và dấu nháy kép cho value

Blob index filter chỉ hoạt động tốt cho query 1 tag hoặc sử dụng >, >=, <, <= trên 1 thẻ duy nhất.

Tham khảo

Searching Azure Blob Storage using Blob Index

Developing Solutions for Microsoft Azure AZ-204 Exam Guide

Azure Blob Storage Index Tags 

Nhận xét

Bài đăng phổ biến từ blog này

[ASP.NET MVC] Authentication và Authorize

Một trong những vấn đề bảo mật cơ bản nhất là đảm bảo những người dùng hợp lệ truy cập vào hệ thống. ASP.NET đưa ra 2 khái niệm: Authentication và Authorize Authentication xác nhận bạn là ai. Ví dụ: Bạn có thể đăng nhập vào hệ thống bằng username và password hoặc bằng ssh. Authorization xác nhận những gì bạn có thể làm. Ví dụ: Bạn được phép truy cập vào website, đăng thông tin lên diễn đàn nhưng bạn không được phép truy cập vào trang mod và admin.

ASP.NET MVC: Cơ bản về Validation

Validation (chứng thực) là một tính năng quan trọng trong ASP.NET MVC và được phát triển trong một thời gian dài. Validation vắng mặt trong phiên bản đầu tiên của asp.net mvc và thật khó để tích hợp 1 framework validation của một bên thứ 3 vì không có khả năng mở rộng. ASP.NET MVC2 đã hỗ trợ framework validation do Microsoft phát triển, tên là Data Annotations. Và trong phiên bản 3, framework validation đã hỗ trợ tốt hơn việc xác thực phía máy khách, và đây là một xu hướng của việc phát triển ứng dụng web ngày nay.

Tổng hợp một số kiến thức lập trình về Amibroker

Giới thiệu về Amibroker Amibroker theo developer Tomasz Janeczko được xây dựng dựa trên ngôn ngữ C. Vì vậy bộ code Amibroker Formula Language sử dụng có syntax khá tương đồng với C, ví dụ như câu lệnh #include để import hay cách gói các object, hàm trong các block {} và kết thúc câu lệnh bằng dấu “;”. AFL trong Amibroker là ngôn ngữ xử lý mảng (an array processing language). Nó hoạt động dựa trên các mảng (các dòng/vector) số liệu, khá giống với cách hoạt động của spreadsheet trên excel.