Sdílet prostřednictvím


Příklad: Přístup ke službě Azure Storage pomocí knihoven Azure pro Python

V tomto článku se dozvíte, jak pomocí klientských knihoven Azure v kódu aplikace Pythonu nahrát soubor do kontejneru azure Blob Storage. V článku se předpokládá, že jste vytvořili prostředky uvedené v příkladu: Vytvoření služby Azure Storage.

Všechny příkazy v tomto článku fungují stejně v prostředích Bash pro Linux/macOS a Windows, pokud není uvedeno.

1: Nastavení místního vývojového prostředí

Pokud jste to ještě neudělali, nastavte prostředí, ve kterém můžete tento kód spustit. Zde je uvedeno několik možností:

2: Instalace balíčků knihovny

Do souboru requirements.txt přidejte řádky balíčku klientské knihovny, který použijete a uložíte.

azure-storage-blob
azure-identity

Potom v terminálu nebo příkazovém řádku nainstalujte požadavky.

pip install -r requirements.txt

3: Vytvoření souboru pro nahrání

Vytvořte zdrojový soubor s názvem sample-source.txt. Tento název souboru je to, co kód očekává.

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

4: Použití úložiště objektů blob z kódu aplikace

Následující dvě části ukazují dva způsoby přístupu ke kontejneru objektů blob vytvořenému prostřednictvím příkladu: Vytvoření služby Azure Storage.

První metoda (s ověřováním) ověří aplikaci DefaultAzureCredential podle popisu v části Ověřování aplikací Pythonu ve službách Azure během místního vývoje pomocí instančních objektů. Pomocí této metody musíte nejprve přiřadit příslušná oprávnění k identitě aplikace, což je doporučený postup.

Druhá metoda (s připojovací řetězec) používá připojovací řetězec pro přímý přístup k účtu úložiště. I když se tato metoda zdá jednodušší, má dvě významné nevýhody:

  • Připojovací řetězec ze své podstaty ověřuje připojovacího agenta pomocí účtu úložiště, nikoli s jednotlivými prostředky v rámci daného účtu. V důsledku toho připojovací řetězec uděluje širší autorizaci, než může být potřeba.

  • Připojovací řetězec obsahuje informace o přístupu ve formátu prostého textu, a proto představuje potenciální ohrožení zabezpečení, pokud není správně sestavená nebo zabezpečená. Pokud je takový připojovací řetězec vystavený, můžete ho použít pro přístup k široké škále prostředků v rámci účtu úložiště.

Z těchto důvodů doporučujeme použít metodu ověřování v produkčním kódu.

4a: Použití úložiště objektů blob s ověřováním

  1. Vytvořte soubor s názvem use_blob_auth.py s následujícím kódem. Komentáře vysvětlují kroky.

    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}")
    

    Referenční odkazy:

  2. Vytvořte proměnnou prostředí s názvem AZURE_STORAGE_BLOB_URL:

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

    Nahraďte "pythonazurestorage12345" názvem vašeho účtu úložiště.

    Proměnná AZURE_STORAGE_BLOB_URL prostředí se používá pouze v tomto příkladu. Knihovny Azure ji nepoužívají.

  3. Pomocí příkazu az ad sp create-for-rbac vytvořte pro aplikaci nový instanční objekt. Příkaz vytvoří registraci aplikace pro aplikaci ve stejnou dobu. Instančnímu objektu dejte název podle vašeho výběru.

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

    Výstup tohoto příkazu bude vypadat následovně. Poznamenejte si tyto hodnoty nebo nechte toto okno otevřené, protože je budete potřebovat v dalším kroku a nebudete moct znovu zobrazit hodnotu hesla (tajný klíč klienta). Nové heslo ale můžete později přidat bez zneplatnění instančního objektu nebo stávajících hesel v případě potřeby.

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

    Příkazy Azure CLI je možné spouštět v Azure Cloud Shellu nebo na pracovní stanici s nainstalovaným Azure CLI.

  4. Vytvořte proměnné prostředí pro instanční objekt aplikace:

    Vytvořte následující proměnné prostředí s hodnotami z výstupu předchozího příkazu. Tyto proměnné říkají DefaultAzureCredential použití instančního objektu aplikace.

    • AZURE_CLIENT_ID → hodnota ID aplikace.
    • AZURE_TENANT_ID → hodnota ID tenanta.
    • AZURE_CLIENT_SECRET → heslo nebo přihlašovací údaje vygenerované pro aplikaci.
    set AZURE_CLIENT_ID=00000000-0000-0000-0000-000000000000
    set AZURE_TENANT_ID=11111111-1111-1111-1111-111111111111
    set AZURE_CLIENT_SECRET=abcdefghijklmnopqrstuvwxyz
    
  5. Pokus o spuštění kódu (který záměrně selže):

    python use_blob_auth.py
    
  6. Podívejte se na chybu "Tento požadavek nemá oprávnění k provedení této operace pomocí tohoto oprávnění". Tato chyba se očekává, protože místní instanční objekt, který používáte, ještě nemá oprávnění pro přístup ke kontejneru objektů blob.

  7. Pomocí příkazu az role assignment create Azure CLI udělte oprávnění přispěvatele pro kontejner objektů blob instančnímu objektu:

    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"
    

    Argument --assignee identifikuje instanční objekt. Nahraďte <zástupný symbol AZURE_CLIENT_ID> ID aplikace instančního objektu.

    Argument --scope určuje, kde se toto přiřazení role vztahuje. V tomto příkladu udělíte roli Přispěvatel dat objektů blob úložiště instančnímu objektu kontejneru s názvem blob-container-01.

    • Nahraďte PythonAzureExample-Storage-rg skupinu pythonazurestorage12345 prostředků, která obsahuje váš účet úložiště a přesný název vašeho účtu úložiště. V případě potřeby také upravte název kontejneru objektů blob. Pokud použijete nesprávný název, zobrazí se chyba "Nelze provést požadovanou operaci s vnořeným prostředkem. Nadřazený prostředek pythonazurestorage12345 nebyl nalezen.

    • <Nahraďte držitel AZURE_SUBSCRIPTION_ID> místa SVÝM ID předplatného Azure. (Můžete spustit příkaz az account show a získat ID předplatného id z vlastnosti ve výstupu.)

    Tip

    Pokud příkaz přiřazení role vrátí při použití prostředí Bash chybu Nenašly se žádné adaptéry připojení, zkuste se vyhnout export MSYS_NO_PATHCONV=1 překladu cesty. Další informace najdete v tomto problému.

  8. Počkejte minutu nebo dvě, než se oprávnění rozšíří, a pak znovu spusťte kód a ověřte, že teď funguje. Pokud se chyba oprávnění zobrazí znovu, počkejte o něco déle a pak kód zkuste znovu.

Další informace o přiřazeních rolí najdete v tématu Přiřazení oprávnění role pomocí Azure CLI.

4b: Použití úložiště objektů blob s připojovací řetězec

  1. Vytvořte soubor Pythonu s názvem use_blob_conn_string.py s následujícím kódem. Komentáře vysvětlují kroky.

    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. Vytvořte proměnnou prostředí s názvem AZURE_STORAGE_CONNECTION_STRING, z níž je úplná připojovací řetězec pro účet úložiště. (Tato proměnná prostředí se používá také v různých komentářích Azure CLI.) Připojovací řetězec pro účet úložiště můžete získat spuštěním příkazu az storage account show-connection-string.

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

    Nahraďte PythonAzureExample-Storage-rg skupinu pythonazurestorage12345 prostředků, která obsahuje váš účet úložiště a přesný název vašeho účtu úložiště.

    Při nastavování proměnné prostředí použijte celou hodnotu connectionString vlastnosti ve výstupu včetně uvozovek.

  3. Spusťte kód:

    python use_blob_conn_string.py
    

I když je tato metoda jednoduchá, připojovací řetězec autorizuje všechny operace v účtu úložiště. S produkčním kódem je lepší použít konkrétní oprávnění, jak je popsáno v předchozí části.

5. Ověření vytvoření objektu blob

Po spuštění kódu některé z metod přejděte na web Azure Portal, přejděte do kontejneru objektů blob a ověřte, že nový objekt blob existuje s názvem sample-blob-{random}.txt se stejným obsahem jako soubor sample-source.txt:

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

Pokud jste vytvořili proměnnou prostředí s názvem AZURE_STORAGE_CONNECTION_STRING, můžete také pomocí Azure CLI ověřit, že objekt blob existuje, pomocí příkazu az storage blob list :

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

Pokud jste postupovali podle pokynů pro použití úložiště objektů blob s ověřováním, můžete parametr přidat --connection-string do předchozího příkazu s připojovací řetězec pro váš účet úložiště. Informace o tom, jak získat připojovací řetězec, najdete v pokynech v 4b: Použití úložiště objektů blob s připojovací řetězec. Použijte celý připojovací řetězec včetně uvozovek.

6: Vyčištění prostředků

Pokud v tomto příkladu nepotřebujete zachovat skupinu prostředků a prostředky úložiště, spusťte příkaz az group delete . Ve vašem předplatném se za skupiny prostředků neúčtují žádné průběžné poplatky, ale za prostředky, jako jsou účty úložiště, se můžou účtovat poplatky. Je vhodné vyčistit jakoukoli skupinu, kterou aktivně nepoužíváte. Argument --no-wait umožňuje, aby se příkaz vrátil okamžitě místo čekání na dokončení operace.

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

Metodu ResourceManagementClient.resource_groups.begin_delete můžete použít také k odstranění skupiny prostředků z kódu. Kód v příkladu: Vytvoření skupiny prostředků ukazuje použití.

Pokud jste postupovali podle pokynů k použití úložiště objektů blob s ověřováním, je vhodné odstranit vytvořený instanční objekt aplikace. Můžete použít příkaz az ad app delete . <Zástupný symbol AZURE_CLIENT_ID> nahraďte ID aplikace instančního objektu.

az ad app delete --id <AZURE_CLIENT_ID>

Viz také