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í:

  • Nakonfigurujte virtuální prostředí Pythonu pomocí venv libovolného nástroje nebo nástroje. Virtuální prostředí můžete vytvořit místně nebo v Azure Cloud Shellu a spustit ho tam. Nezapomeňte aktivovat virtuální prostředí, abyste ho mohli začít používat.

  • Použijte prostředí Conda.

  • Použijte vývojový kontejner v editoru Visual Studio Code nebo GitHub Codespaces.

2. Instalace balíčků knihovny

Do souboru requirements.txt přidejte řádky pro balíček klientské knihovny, který potřebujete, a soubor 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

Tato část ukazuje dva způsoby přístupu k datům v kontejneru objektů blob, který jste vytvořili v příkladu: Vytvoření služby Azure Storage. Aby mohla vaše aplikace přistupovat k datům v kontejneru objektů blob, musí být schopná se ověřit v Azure a mít oprávnění pro přístup k datům v kontejneru. Tato část představuje dva způsoby, jak to udělat:

  • Metoda bez hesla (doporučeno) ověřuje aplikaci pomocí DefaultAzureCredential. DefaultAzureCredential je zřetězený přihlašovací údaje, které můžou ověřovat aplikaci (nebo uživatele) pomocí posloupnosti různých přihlašovacích údajů, včetně přihlašovacích údajů vývojářských nástrojů, instančních objektů aplikací a spravovaných identit.

  • Metoda připojovacího řetězce používá k přímému přístupu k účtu úložiště připojovací řetězec.

Z následujících důvodů a dalších důvodů doporučujeme použít metodu bez hesla, kdykoli je to možné:

  • Připojovací řetězec ověří 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. S DefaultAzureCredential využitím Azure RBAC můžete udělit podrobnější a nejméně privilegovaná oprávnění k prostředkům úložiště identitě, pod kterou vaše aplikace běží.

  • 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ě.

  • Připojovací řetězec je obvykle uložená v proměnné prostředí, což z ní může být ohroženo, pokud útočník získá přístup k vašemu prostředí. Mnoho typů přihlašovacích údajů, které DefaultAzureCredential podporuje, nevyžadují ukládání tajných kódů do vašeho prostředí.

DefaultAzureCredential je předkonfigurovaný řetěz přihlašovacích údajů. Je navržená tak, aby podporovala mnoho prostředí spolu s nejběžnějšími toky ověřování a vývojářskými nástroji. Instance určuje, které typy přihlašovacích DefaultAzureCredential údajů se mají pokusit získat token pro základě kombinace jeho prostředí runtime, hodnoty určitých dobře známých proměnných prostředí a volitelně parametrů předaných do jeho konstruktoru.

V následujících krocích nakonfigurujete instanční objekt aplikace jako identitu aplikace. Instanční objekty aplikací jsou vhodné pro místní vývoj i pro aplikace hostované místně. Pokud chcete nakonfigurovat DefaultAzureCredential použití instančního objektu aplikace, nastavte následující proměnné prostředí: AZURE_CLIENT_ID, AZURE_TENANT_IDa AZURE_CLIENT_SECRET.

Všimněte si, že je nakonfigurovaný tajný klíč klienta. To je nezbytné pro instanční objekt aplikace, ale v závislosti na vašem scénáři můžete také nakonfigurovat DefaultAzureCredential použití přihlašovacích údajů, které nevyžadují nastavení tajného kódu nebo hesla v proměnné prostředí.

Pokud například místní vývoj DefaultAzureCredential nemůže získat token pomocí nakonfigurovaných proměnných prostředí, pokusí se získat token pomocí vývojářskými nástroji (už přihlášeným uživatelem), jako je Azure CLI. Pro aplikaci hostovanou v Azure DefaultAzureCredential je možné nakonfigurovat použití spravované identity. Ve všech případech zůstane kód ve vaší aplikaci stejný, pouze konfigurace a/nebo změny prostředí runtime.

  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": "00001111-aaaa-2222-bbbb-3333cccc4444",
      "displayName": "<service-principal-name>",
      "password": "Aa1Bb~2Cc3.-Dd4Ee5Ff6Gg7Hh8Ii9_Jj0Kk1Ll2",
      "tenant": "aaaabbbb-0000-cccc-1111-dddd2222eeee"
    }
    

    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=00001111-aaaa-2222-bbbb-3333cccc4444
    set AZURE_TENANT_ID=aaaabbbb-0000-cccc-1111-dddd2222eeee
    set AZURE_CLIENT_SECRET=Aa1Bb~2Cc3.-Dd4Ee5Ff6Gg7Hh8Ii9_Jj0Kk1Ll2
    
  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 instančnímu objektu instančnímu objektu oprávnění přispěvatele dat objektu blob služby Storage:

    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 Nejde 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.

Důležité

V předchozích krocích se vaše aplikace spustila pod instančním objektem aplikace. Instanční objekt aplikace vyžaduje v konfiguraci tajný klíč klienta. Stejný kód ale můžete použít ke spuštění aplikace v různých typech přihlašovacích údajů, které nevyžadují explicitní konfiguraci hesla nebo tajného kódu v prostředí. Během vývoje můžete například použít přihlašovací údaje vývojářského nástroje, jako jsou přihlašovací údaje, DefaultAzureCredential které používáte k přihlášení přes Azure CLI, nebo pro aplikace hostované v Azure můžou používat spravovanou identitu. Další informace najdete v tématu Ověřování aplikací Pythonu ve službách Azure pomocí sady Azure SDK pro Python.

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:

Stránka webu Azure Portal pro kontejner objektů blob zobrazující nahraný soubor

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í ověřování bez hesla, můžete parametr přidat --connection-string do předchozího příkazu s připojovací řetězec pro váš účet úložiště. K získání připojovací řetězec použijte příkaz az storage account show-connection-string.

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

Jako hodnotu parametru --connection-string použijte celý připojovací řetězec.

Poznámka:

Pokud má váš uživatelský účet Azure v kontejneru roli Přispěvatel dat objektů blob úložiště, můžete k výpisu objektů blob v kontejneru použít následující příkaz:

az storage blob list --container-name blob-container-01 --account-name pythonazurestorage12345 --auth-mode login

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 ve skupině prostředků můžou dál úč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žívání ověřování bez hesla, je vhodné odstranit instanční objekt aplikace, který jste vytvořili. 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é