Share via


監視 Azure 佇列儲存體的最佳做法

本文聚焦於常見佇列儲存體監視案例的集合,並提供您完成這些案例的最佳做法指導。

監視每個佇列中的訊息計數

您可以使用 QueueMessageCount 計量來監視儲存體帳戶中所有佇列的訊息計數。 此計量會每日重新整理。

如果您使用的是 PowerShell,您可以使用類似於下列所示的命令:

(Get-AzMetric -ResourceId /subscriptions/xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/contosogroup/providers/Microsoft.Storage/storageAccounts/contoso/queueServices/default -MetricName "QueueMessageCount").data.Average

如果您需要動態決定是否要調整工作負載來處理訊息量,您可以在每個佇列上查詢大約的訊息計數,然後以適當的動作回應。 使用取得佇列中繼資料 REST 作業,或使用任何支援的 Blob 儲存體 SDK 來取得大約的訊息計數。

下列範例會使用 Azure 儲存體 .Net v12 程式庫來取得大約的訊息計數。

static async Task<string> RetrieveNextMessageAsync(QueueClient theQueue)
{
    if (await theQueue.ExistsAsync())
    {
        QueueProperties properties = await theQueue.GetPropertiesAsync();

        if (properties.ApproximateMessagesCount > 0)
        {
            QueueMessage[] retrievedMessage = await theQueue.ReceiveMessagesAsync(1);
            string theMessage = retrievedMessage[0].MessageText;
            await theQueue.DeleteMessageAsync(retrievedMessage[0].MessageId, retrievedMessage[0].PopReceipt);
            return theMessage;
        }

        return null;
    }

    return null;
}

也請考慮使用為每個實體支援訊息的服務匯流排。 若要深入瞭解,請參閱監視 Azure 服務匯流排資料參考

稽核帳戶活動

在許多情況下,您必須針對安全性和合規性來稽核儲存體帳戶的活動。 儲存體帳戶的作業分為兩類:控制平面和資料平面

控制平面作業是建立儲存體帳戶或更新現有儲存體帳戶屬性的任何 Azure Resource Manager 要求。 如需詳細資訊,請參閱 Azure Resource Manager

在儲存體帳戶中,對儲存體服務端點的要求會產生資料,而資料平面作業就是對這種資料執行的作業。 例如,當您將訊息新增至佇列時,資料平面作業就會執行。 如需詳細資訊,請參閱 Azure 儲存體 API

本節說明如何識別控制項和資料平面作業的「時間」、「主體」、「內容」和「方法」資訊。

稽核控制平面作業

Resource Manager 的作業會在 Azure 活動記錄中擷取。 若要檢視活動記錄,請在 Azure 入口網站中開啟您的儲存體帳戶,然後選取 [活動記錄]

Activity Log

開啟任何記錄項目,以檢視描述活動的 JSON。 下列 JSON 會顯示控制平面作業的「時間」、「內容」和「方法」資訊:

Activity Log JSON

「主體」資訊的可用性取決於用來執行控制平面作業的驗證方法。 如果授權是由 Microsoft Entra 安全性主體所執行,則該安全性主體的物件識別碼也會出現在此 JSON 輸出中 (例如:"http://schemas.microsoft.com/identity/claims/objectidentifier": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx")。 因為您可能不一定會看到其他身分識別相關資訊,例如電子郵件地址或名稱,所以物件識別碼一律是唯一識別安全性主體的最佳方式。

您可以取得該安全性主體的自訂名稱,方法是取得物件識別碼的值,並在 Azure 入口網站的 Microsoft Entra ID 頁面中搜尋安全性主體。 下列螢幕擷取畫面顯示 Microsoft Entra ID 中的搜尋結果。

Search Microsoft Entra ID

稽核資料平面作業

資料平面作業會在儲存體的 Azure 資源記錄中擷取。 您可以設定診斷設定,將記錄匯出至 Log Analytics 工作區,以獲得原生查詢體驗。

以下是可在記錄項目清單中擷取「時間」、「主體」、「內容」和「方法」資訊的 Log Analytics 查詢。

StorageQueueLogs 
| where TimeGenerated > ago(3d) 
| project TimeGenerated, AuthenticationType, RequesterObjectId, OperationName, Uri

針對稽核的「時間」部分,TimeGenerated 欄位會顯示記錄項目的記錄時間。

針對稽核的「內容」部分,Uri 欄位會顯示修改或讀取的項目。

針對稽核的「方法」部分,OperationName 欄位會顯示執行的作業。

針對稽核的「主體」部分,AuthenticationType 會顯示用於提出要求的驗證類型。 此欄位可顯示 Azure 儲存體支援的任何驗證類型,包括使用帳戶金鑰、SAS 權杖或 Microsoft Entra 驗證。

如果要求是使用 Microsoft Entra ID 進行驗證,則 RequesterObjectId 欄位會提供最可靠的方式來識別安全性主體。 您可以取得該安全性主體的自訂名稱,方法是取得 RequesterObjectId 欄位的值,並在 Azure 入口網站的 Microsoft Entra ID 頁面中搜尋安全性主體。 下列螢幕擷取畫面顯示 Microsoft Entra ID 中的搜尋結果。

Search Microsoft Entra ID-2

在某些情況下,使用者主體名稱或 UPN 可能會出現在記錄中。 例如,如果安全性主體是 Microsoft Entra 使用者,則可能會出現 UPN。 針對其他類型的安全性主體,例如使用者指派的受控識別,或在某些案例 (例如跨 Microsoft Entra 租用戶驗證) 中,UPN 不會出現在記錄內。

此查詢會顯示 OAuth 安全性主體執行的所有寫入作業。

StorageQueueLogs
| where TimeGenerated > ago(3d)
  and OperationName == "PutMessage"
  and AuthenticationType == "OAuth"
| project TimeGenerated, AuthenticationType, RequesterObjectId, OperationName, Uri

共用金鑰和 SAS 驗證不提供任何方法來稽核個別身分識別。 因此,如果您想要改善根據身分識別進行稽核的能力,建議您轉換至 Microsoft Entra ID,並避免使用共用金鑰和 SAS 驗證。 若要瞭解如何防止共用金鑰和 SAS 驗證,請參閱防止 Azure 儲存體帳戶的共用金鑰授權。 若要開始使用 Microsoft Entra ID,請參閱使用 Microsoft Entra ID 授權存取 Blob

最佳化不常查詢的成本

您可以將記錄匯出至 Log Analytics,以取得豐富的原生查詢功能。 當您的儲存體帳戶上具有大量交易時,使用 Log Analytics 記錄的成本可能會很高。 請參閱 Azure Log Analytics 價格。 如果您只打算定期查詢記錄 (例如,查詢記錄以進行合規性稽核),您可以考慮將記錄匯出至儲存體帳戶,然後在記錄資料上使用無伺服器查詢解決方案 (例如 Azure Synapse),以降低總成本。

有了 Azure Synapse,您就可以建立無伺服器的 SQL 集區,以在需要時查詢記錄資料。 這可能會大幅節省成本。

  1. 將記錄匯出至儲存體帳戶。 請參閱建立診斷設定

  2. 建立和設定您的 Synapse 工作區。 請參閱快速入門:建立 Synapse 工作區

  3. 查詢記錄。 請參閱在 Azure Synapse Analytics 中使用無伺服器 SQL 集區來查詢 JSON 檔案

    以下為範例:

     select
         JSON_VALUE(doc, '$.time') AS time,
         JSON_VALUE(doc, '$.properties.accountName') AS accountName,
         JSON_VALUE(doc, '$.identity.type') AS identityType,    
         JSON_VALUE(doc, '$.identity.requester.objectId') AS requesterObjectId,
         JSON_VALUE(doc, '$.operationName') AS operationName,
         JSON_VALUE(doc, '$.callerIpAddress') AS callerIpAddress,
         JSON_VALUE(doc, '$.uri') AS uri
         doc
     from openrowset(
             bulk 'https://demo2uswest4log.blob.core.windows.net/insights-logs-storageread/resourceId=/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/mytestrp/providers/Microsoft.Storage/storageAccounts/demo2uswest/blobServices/default/y=2021/m=03/d=19/h=*/m=*/PT1H.json',
             format = 'csv', fieldterminator ='0x0b', fieldquote = '0x0b'
         ) with (doc nvarchar(max)) as rows
     order by JSON_VALUE(doc, '$.time') desc
    
    

另請參閱