範例:使用適用於 Python 的 Azure 鏈接庫存取 Azure 儲存體

在本文中,您將瞭解如何使用 Python 應用程式程式代碼中的 Azure 用戶端連結庫,將檔案上傳至 Azure Blob 記憶體容器。 本文假設您已建立範例:建立 Azure 儲存體 中顯示的資源。

本文中的所有命令在Linux/macOS bash和 Windows 命令殼層中都相同,除非另有說明。

1:設定本機開發環境

如果您尚未設定環境,您可以在其中執行此程序代碼。 以下列出一些選項:

2:安裝連結庫套件

在您的 requirements.txt 檔案中,新增您將使用並儲存盤案之用戶端連結庫套件的行。

azure-storage-blob
azure-identity

然後,在您的終端機或命令提示字元中,安裝需求。

pip install -r requirements.txt

3:建立要上傳的檔案

建立名為 sample-source.txt 的來源檔案。 此檔名是程式代碼預期的內容。

Hello there, Azure Storage. I'm a friendly file ready to be stored in a blob.

4:從應用程式程式代碼使用 Blob 記憶體

下列兩節示範兩種方式,以存取透過範例建立的 Blob 容器:建立 Azure 儲存體

一個方法 (使用驗證) 會使用 驗證應用程式DefaultAzureCredential,如使用服務主體在本機開發期間向 Azure 服務驗證 Python 應用程式中所述。 使用此方法時,您必須先將適當的許可權指派給應用程式身分識別,這是建議的做法。

二種方法(含 連接字串)會使用 連接字串 直接存取記憶體帳戶。 雖然此方法看起來更簡單,但有兩個重大缺點:

  • 連接字串 原本會使用 儲存體 帳戶來驗證連線代理程式,而不是使用該帳戶內的個別資源。 因此,連接字串 授與比可能需要更廣泛的授權。

  • 連接字串 包含純文本的存取資訊,因此,如果未正確建構或受到保護,就會造成潛在的弱點。 如果公開這類 連接字串,它可以用來存取 儲存體 帳戶內的各種資源。

基於這些原因,我們建議在生產程序代碼中使用驗證方法。

4a:搭配驗證使用 Blob 記憶體

  1. 使用下列程式代碼建立名為 use_blob_auth.py 的檔案。 批註會說明步驟。

    import os
    import uuid
    
    from azure.identity import DefaultAzureCredential
    
    # Import the client object from the SDK library
    from azure.storage.blob import BlobClient
    
    credential = DefaultAzureCredential()
    
    # Retrieve the storage blob service URL, which is of the form
    # https://<your-storage-account-name>.blob.core.windows.net/
    storage_url = os.environ["AZURE_STORAGE_BLOB_URL"]
    
    # Create the client object using the storage URL and the credential
    blob_client = BlobClient(
        storage_url,
        container_name="blob-container-01",
        blob_name=f"sample-blob-{str(uuid.uuid4())[0:5]}.txt",
        credential=credential,
    )
    
    # Open a local file and upload its contents to Blob Storage
    with open("./sample-source.txt", "rb") as data:
        blob_client.upload_blob(data)
        print(f"Uploaded sample-source.txt to {blob_client.url}")
    

    參考連結:

  2. 建立名為的 AZURE_STORAGE_BLOB_URL環境變數:

    set AZURE_STORAGE_BLOB_URL=https://pythonazurestorage12345.blob.core.windows.net
    

    以記憶體帳戶的名稱取代 「pythonazurestorage12345」。。

    AZURE_STORAGE_BLOB_URL 範例只會使用環境變數。 Azure 連結庫不會使用它。

  3. 使用 az ad sp create-for-rbac 命令為應用程式建立新的服務主體。 命令會同時為應用程式建立應用程式註冊。 為服務主體指定您選擇的名稱。

    az ad sp create-for-rbac --name {service-principal-name}
    

    此命令的輸出會如下所示。 請記下這些值,或讓此視窗保持開啟,因為您在下一個步驟中需要這些值,且無法再次檢視密碼 (客戶端密碼) 值。 不過,您可以稍後新增密碼,而不需視需要使服務主體或現有密碼失效。

    {
      "appId": "00000000-0000-0000-0000-000000000000",
      "displayName": "{service-principal-name}",
      "password": "abcdefghijklmnopqrstuvwxyz",
      "tenant": "11111111-1111-1111-1111-111111111111"
    }
    

    Azure CLI 命令可以在 Azure Cloud Shell已安裝 Azure CLI 的工作站上執行。

  4. 建立應用程式服務主體的環境變數:

    使用上一個命令輸出中的值,建立下列環境變數。 這些變數會告知 DefaultAzureCredential 使用應用程式服務主體。

    • AZURE_CLIENT_ID → 應用程式識別碼的值。
    • AZURE_TENANT_ID → 租用戶識別碼的值。
    • AZURE_CLIENT_SECRET → 為應用程式產生的密碼/認證。
    set AZURE_CLIENT_ID=00000000-0000-0000-0000-000000000000
    set AZURE_TENANT_ID=11111111-1111-1111-1111-111111111111
    set AZURE_CLIENT_SECRET=abcdefghijklmnopqrstuvwxyz
    
  5. 試著執行程式碼(故意失敗):

    python use_blob_auth.py
    
  6. 請注意「此要求未獲授權使用此許可權執行這項作業」錯誤。因為您所使用的本機服務主體尚未具有存取 Blob 容器的許可權,因此預期會發生此錯誤。

  7. 使用 az role assignment create Azure CLI 命令,將 Blob 容器上的參與者許可權授與服務主體:

    az role assignment create --assignee <AZURE_CLIENT_ID> \
        --role "Storage Blob Data Contributor" \
        --scope "/subscriptions/<AZURE_SUBSCRIPTION_ID>/resourceGroups/PythonAzureExample-Storage-rg/providers/Microsoft.Storage/storageAccounts/pythonazurestorage12345/blobServices/default/containers/blob-container-01"
    

    --assignee 變數會識別服務主體。 以服務主體的應用程式識別碼取代 <AZURE_CLIENT_ID> 佔位元元。

    --scope 變數會識別套用此角色指派的位置。 在此範例中,您會將 「儲存體 Blob 數據參與者」角色授與名為 「blob-container-01」 之容器的服務主體。

    • 將和 pythonazurestorage12345 取代PythonAzureExample-Storage-rg為包含記憶體帳戶的資源群組,以及記憶體帳戶的確切名稱。 此外,如有必要,請調整 Blob 容器的名稱。 如果您使用錯誤的名稱,您會看到錯誤:「無法在巢狀資源上執行要求的作業。 找不到父資源 'pythonazurestorage12345'。」

    • 以 <您的 Azure 訂用帳戶標識碼取代AZURE_SUBSCRIPTION_ID> 位持有者。 (您可以執行 az account show 命令,並從輸出中的 屬性取得訂用帳戶標識碼id

    提示

    如果角色指派命令在使用bash殼層時傳回「找不到連線配接器」錯誤,請嘗試設定 export MSYS_NO_PATHCONV=1 以避免路徑轉譯。 如需詳細資訊,請參閱此問題

  8. 等候一兩分鐘,讓許可權傳播,然後再次執行程式代碼,確認它現在是否正常運作。 如果您再次看到許可權錯誤,請稍候一點,然後再試一次程序代碼。

如需角色指派的詳細資訊,請參閱 如何使用 Azure CLI 指派角色許可權。

4b:搭配 連接字串 使用 Blob 記憶體

  1. 使用下列程式代碼建立名為 use_blob_conn_string.py 的 Python 檔案。 批註會說明步驟。

    import os
    import uuid
    
    # Import the client object from the SDK library
    from azure.storage.blob import BlobClient
    
    # Retrieve the connection string from an environment variable. Note that a
    # connection string grants all permissions to the caller, making it less
    # secure than obtaining a BlobClient object using credentials.
    conn_string = os.environ["AZURE_STORAGE_CONNECTION_STRING"]
    
    # Create the client object for the resource identified by the connection
    # string, indicating also the blob container and the name of the specific
    # blob we want.
    blob_client = BlobClient.from_connection_string(
        conn_string,
        container_name="blob-container-01",
        blob_name=f"sample-blob-{str(uuid.uuid4())[0:5]}.txt",
    )
    
    # Open a local file and upload its contents to Blob Storage
    with open("./sample-source.txt", "rb") as data:
        blob_client.upload_blob(data)
        print(f"Uploaded sample-source.txt to {blob_client.url}")
    
  2. 建立名為AZURE_STORAGE_CONNECTION_STRING的環境變數,其值為記憶體帳戶的完整 連接字串。 (各種 Azure CLI 批注也會使用此環境變數。您可以執行 az storage account show-connection-string 命令,以取得記憶體帳戶的 連接字串。

    az storage account show-connection-string --resource-group PythonAzureExample-Storage-rg --name pythonazurestorage12345
    

    將和 pythonazurestorage12345 取代PythonAzureExample-Storage-rg為包含記憶體帳戶的資源群組,以及記憶體帳戶的確切名稱。

    當您設定環境變數時,請在輸出中使用屬性的 connectionString 整個值,包括引號。

  3. 執行程式代碼:

    python use_blob_conn_string.py
    

同樣地,雖然這個方法很簡單,但 連接字串 會授權記憶體帳戶中的所有作業。 使用生產程序代碼時,最好使用上一節中所述的特定許可權。

5.確認 Blob 建立

執行任一方法的程式代碼之後,請移至 Azure 入口網站,流覽至 Blob 容器,確認名為 sample-blob-{random}的新 Blob 存在,.txt與sample-source.txt檔案相同的內容

Azure portal page for the blob container, showing the uploaded file

如果您已建立名為 AZURE_STORAGE_CONNECTION_STRING的環境變數,您也可以使用 Azure CLI,使用 az storage blob list 命令來確認 Blob 是否存在:

az storage blob list --container-name blob-container-01

如果您依照指示搭配驗證使用 Blob 記憶體,您可以使用記憶體帳戶的 連接字串,將參數新增--connection-string至上述命令。 若要瞭解如何取得 連接字串,請參閱 4b:搭配 連接字串 使用 Blob 記憶體中的指示。 使用包含引號的整個 連接字串。

6:清除資源

如果您不需要保留此範例中使用的資源群組和記憶體資源,請執行 az group delete 命令。 資源群組不會在您的訂用帳戶中產生任何持續費用,但資源群組中的資源,例如記憶體帳戶,可能會產生費用。 最好清除您未主動使用的任何群組。 自 --no-wait 變數可讓命令立即傳回,而不是等待作業完成。

az group delete -n PythonAzureExample-Storage-rg  --no-wait

您也可以使用 ResourceManagementClient.resource_groups.begin_delete 方法,從程式代碼中刪除資源群組。 範例:建立資源群組中的程式代碼會示範使用方式。

如果您依照指示搭配驗證使用 Blob 記憶體,最好刪除您所建立的應用程式服務主體。 您可以使用 az ad app delete 命令。 以 <服務主體的應用程式識別碼取代AZURE_CLIENT_ID> 佔位元元。

az ad app delete --id <AZURE_CLIENT_ID>

另請參閱