Példa: Az Azure Storage elérése a Pythonhoz készült Azure-kódtárak használatával

Ebből a cikkből megtudhatja, hogyan tölthet fel fájlokat egy Azure Blob Storage-tárolóba az Azure-ügyfélkódtárak Python-alkalmazáskódban való használatával. A cikk feltételezi, hogy a példában látható erőforrásokat hozta létre: Azure Storage létrehozása.

A cikkben szereplő összes parancs ugyanúgy működik a Linux/macOS bash és a Windows parancshéjakban, hacsak fel nem jegyezzük.

1. A helyi fejlesztési környezet beállítása

Ha még nem tette meg, hozzon létre egy környezetet, ahol futtathatja a kódot. Íme néhány lehetőség:

  • Python virtuális környezetet konfigurálhat az venv vagy más választott eszközzel. A virtuális környezet használatának megkezdéséhez feltétlenül aktiválja azt. A Python telepítéséhez lásd a Python telepítését.

    #!/bin/bash
    # Create a virtual environment
    python -m venv .venv
    # Activate the virtual environment
    source .venv/Scripts/activate # only required for Windows (Git Bash)
    
  • Használjon conda környezetet. A Conda telepítéséhez lásd a Miniconda telepítése című témakört.

  • Használjon Dev-tárolót a Visual Studio Code számára vagy a GitHub Codespaces-ben.

2. Kódtárcsomagok telepítése

A requirements.txt fájlban adjon hozzá sorokat a szükséges ügyfélkódtár-csomaghoz, és mentse a fájlt.

azure-storage-blob
azure-identity

Ezután telepítse a követelményeket a terminálban vagy a parancssorban.

pip install -r requirements.txt

3. Feltöltendő fájl létrehozása

Hozzon létre egy sample-source.txt nevű forrásfájlt. Ez a fájlnév az, amit a kód elvár.

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

4. Blob Storage használata alkalmazáskódból

Ez a szakasz bemutatja, hogyan lehet hozzáférni az adatokhoz a blobtárolóban, amelyet az Azure Storage például létrehozásával hozott létre kétféle módon. A blobtárolóban lévő adatok eléréséhez az alkalmazásnak képesnek kell lennie az Azure-ral való hitelesítésre, és jogosultnak kell lennie a tárolóban lévő adatok elérésére. Ez a szakasz a következő két módszert mutatja be:

  • A Jelszó nélküli (ajánlott) módszer DefaultAzureCredential használatával hitelesíti az alkalmazást. DefaultAzureCredential egy láncolt hitelesítő adat, amely különböző hitelesítő adatok sorozatával hitelesíthet egy alkalmazást (vagy felhasználót), beleértve a fejlesztői eszközök hitelesítő adatait, az alkalmazásszolgáltatás felelősöket és a felügyelt identitásokat.

  • A Kapcsolati karakterlánc metódus egy kapcsolati karakterláncot használ a tárolófiók közvetlen eléréséhez.

A következő okokból és egyebek miatt javasoljuk, hogy amikor csak lehetséges, használja a jelszó nélküli módszert:

  • Egy kapcsolati karakterlánc hitelesíti a csatlakozó ügynököt a Storage-fiókkal, nem pedig az adott fiókon belüli egyes erőforrásokkal. Ennek eredményeképpen egy kapcsolati sztring a szükségesnél szélesebb körű engedélyezést biztosít. Az DefaultAzureCredential segítségével a tárolási erőforrások felett részletesebb és minimális jogosultságokat adhat annak az identitásnak, amely alatt az alkalmazása fut, az Azure RBAC használatával.

  • A kapcsolati sztringek egyszerű szövegben tartalmazzák a hozzáférési adatokat, ezért potenciális biztonsági réseket jelentenek, ha nem megfelelően vannak kialakítva vagy védve. Ha egy ilyen kapcsolati sztring elérhetővé válik, a tárfiókon belüli erőforrások széles skálájához lehet hozzáférni.

  • A kapcsolati sztringet általában egy környezeti változóban tárolják, ami sebezhetővé válhat a visszaélésre, ha egy támadó hozzáfér az Ön környezetéhez. Számos olyan hitelesítő adattípus, amelyet DefaultAzureCredential támogat, nem igényel titkos kulcsok tárolását a környezetben.

  • Jelszó nélküli (ajánlott)
  • Kapcsolati lánc

DefaultAzureCredential egy kialakított, előre beállított hitelesítő adatok lánca. DefaultAzureCredential számos környezetet támogat, a leggyakoribb hitelesítési folyamatokkal és fejlesztői eszközökkel együtt. Egy DefaultAzureCredential példány meghatározza, hogy mely hitelesítő adattípusokhoz próbál meg jogkivonatot lekérni a futási környezet, bizonyos jól ismert környezeti változók értéke, és opcionálisan a konstruktornak átadott paraméterek kombinációja alapján.

Az alábbi lépésekben egy alkalmazásszolgáltatásnevet konfigurálhat alkalmazás-identitásként. Az alkalmazásszolgáltatás-tagok a helyi fejlesztés során és a helyszínen üzemeltetett alkalmazásokhoz egyaránt alkalmasak. Az DefaultAzureCredential alkalmazásszolgáltatási főnév használatára való konfiguráláshoz állítsa be a következő környezeti változókat: AZURE_CLIENT_ID, AZURE_TENANT_ID, és AZURE_CLIENT_SECRET.

Figyelje meg, hogy az ügyfélkulcs konfigurálva van. Az alkalmazás-szolgáltatásnévhez szükség van egy ügyfélkódra, de a forgatókönyvtől függően olyan hitelesítő adatok használatára is konfigurálható DefaultAzureCredential , amelyekhez nincs szükség titkos kulcs vagy jelszó beállítására egy környezeti változóban.

Például a helyi fejlesztés során, ha DefaultAzureCredential nem tud tokent lekérni a konfigurált környezeti változók használatával, megpróbál egyet lekérni az Azure CLI-hez hasonló fejlesztői eszközökbe már bejelentkezett felhasználó használatával. Egy Azure-ban üzemeltetett alkalmazás esetében a DefaultAzureCredential konfigurálható felügyelt identitás használatára. Az alkalmazásban lévő kód minden esetben ugyanaz marad, csak a konfiguráció és/vagy a futtatókörnyezet változik.

  1. Hozzon létre egy use_blob_auth.py nevű fájlt a következő kóddal. A megjegyzések ismertetik a lépéseket.

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

    Referenciákra mutató hivatkozások:

  2. Hozzon létre egy környezeti változót AZURE_STORAGE_BLOB_URL.

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

    Cserélje le a "pythonazurestorage12345" kifejezést a tárfiók nevére.

    A c0 környezeti változót csak ez a példa használja. Az Azure-kódtárak nem használják.

  3. Használja az az ad sp create-for-rbac paranccsal, hogy létrehozzon egy új szolgáltatási principált az alkalmazáshoz. A parancs egyidejűleg létrehozza az alkalmazás regisztrációját az alkalmazáshoz. Azonosítson egy szolgáltatási főazonost az Ön által választott névvel.

    az ad sp create-for-rbac --name <service-principal-name>
    

    A parancs kimenete a következő JSON-kódrészlethez hasonlít. Jegyezze fel ezeket az értékeket, vagy tartsa nyitva ezt az ablakot, mivel a következő lépésben szüksége lesz ezekre az értékekre, és nem fogja tudni újra megtekinteni a jelszó (titkos ügyfélkód) értékét. Később azonban hozzáadhat új jelszót anélkül, hogy szükség esetén érvénytelenítenék a szolgáltatásnevet vagy a meglévő jelszavakat.

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

    Az Azure CLI-parancsok futtathatók az Azure Cloud Shellben vagy egy olyan munkaállomáson, amelyen telepítve van az Azure CLI.

  4. Hozzon létre környezeti változókat az application service principal számára:

    Hozza létre az alábbi környezeti változókat az előző parancs kimenetéből származó értékekkel. Ezek a változók azt jelzik a DefaultAzureCredential-nek, hogy az application service principal használatát végezze.

    • AZURE_CLIENT_ID → Az alkalmazásazonosító érték.
    • AZURE_TENANT_ID → A bérlőazonosító értéke.
    • AZURE_CLIENT_SECRET → Az alkalmazáshoz generált jelszó/hitelesítő adat.
    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. Próbálja meg futtatni a kódot (amely szándékosan meghiúsul):

    python use_blob_auth.py
    
  6. Figyelje meg a következő hibaüzenetet: "Ez a kérés nem jogosult a művelet végrehajtására ezzel az engedéllyel". A hiba azért várható, mert a helyi szolgáltatásnév, amelyet használ, még nem rendelkezik engedéllyel a blobtároló eléréséhez.

  7. Adjon Storage Blob Data Contributor jogosultságokat a blobtárolón a szolgáltatási névhez az az role assignment create Azure CLI-parancs használatával.

    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"
    

    A --assignee argumentum azonosítja a szolgáltatás fő felelősét. Cserélje le <AZURE_CLIENT_ID> helyőrzőt a szolgáltatás-munkaállomás alkalmazásazonosítójára.

    A --scope argumentum azonosítja a szerepkör-hozzárendelés alkalmazási helyét. Ebben a példában a „blob-container-01” nevű tároló esetében a szolgáltatási fiók számára adja meg a „Storage Blob Data Contributor” szerepkört.

    • Cserélje le a PythonAzureExample-Storage-rg és pythonazurestorage12345 elemeket az Ön tárfiókját tartalmazó erőforráscsoporta és a tárfiók pontos nevére. Szükség esetén módosítsa a blobtároló nevét is. Ha nem a megfelelő nevet használja, a következő hibaüzenet jelenik meg: "Nem lehet végrehajtani a kért műveletet a beágyazott erőforráson. A "pythonazurestorage12345" szülőerőforrás nem található."

    • Cserélje le a <AZURE_SUBSCRIPTION_ID> helyőrzőt az Azure-előfizetés azonosítójára. (Futtathatja a az account show parancsot, és az id tulajdonságból lekérheti az előfizetésazonosítót a kimenetben.)

    Tipp.

    Ha a szerepkör-hozzárendelési parancs "Nem található kapcsolati adapter" hibaüzenetet ad vissza a Bash-rendszerhéj használatakor, próbálja meg beállítani export MSYS_NO_PATHCONV=1, hogy elkerülje az elérési út fordítását. További információkért tekintse meg ezt a problémát.

  8. Várjon egy-két percet az engedélyek propagálására, majd futtassa újra a kódot annak ellenőrzéséhez, hogy működik-e. Ha ismét megjelenik az engedélyhiba, várjon egy kicsit tovább, majd próbálkozzon újra a kóddal.

A szerepkör-hozzárendelésekkel kapcsolatos további információkért lásd a "Szerepkör-engedélyek hozzárendelése az Azure CLI használatával" útmutatót.

Fontos

Az előző lépésekben az alkalmazás egy alkalmazásszolgáltatásnév alatt futott. Az alkalmazásszolgáltatás-tagok konfigurációjában szükség van egy titkos ügyfélkódra. Ugyanezzel a kóddal azonban futtathatja az alkalmazást különböző hitelesítőadat-típusok esetén, amelyek nem igénylik, hogy explicit módon konfiguráljon egy jelszót vagy titkos kulcsot a környezetben. Fejlesztés során például a DefaultAzureCredential használhat fejlesztői eszközök hitelesítő adatait, mint amiket az Azure CLI-val való bejelentkezéshez használ; vagy az Azure-ban üzemeltetett alkalmazások esetében használhat egy felügyelt identitást, erről bővebben itt olvashat. További információért lásd: Python alkalmazások hitelesítése Azure szolgáltatásokhoz az Azure SDK for Python használatával.

5. Blob létrehozásának ellenőrzése

A metódus kódjának futtatása után lépjen az Azure Portalra, és lépjen a blobtárolóba, és ellenőrizze, hogy létezik-e egy új blob, amely a sample-blob-{random}.txt ugyanazzal a tartalommal rendelkezik, mint a sample-source.txt fájl:

A blob tároló Azure Portal oldalán látható a feltöltött fájl.

Ha létrehozott egy környezeti változót nevű AZURE_STORAGE_CONNECTION_STRING, az Azure CLI-t is használhatja annak ellenőrzésére, hogy a blob létezik-e a az storage blob list paranccsal.

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

Ha követte a jelszónélküli hitelesítés használatára vonatkozó utasításokat, hozzáadhatja a --connection-string paramétert az előző parancshoz a tárfiók kapcsolati karakterláncával. A kapcsolati sztring lekéréséhez használja az az "storage account show-connection-string" parancsot.

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

Használja a teljes kapcsolati sztringet a --connection-string paraméter értékeként.

Megjegyzés

Ha az Azure-felhasználói fiókja rendelkezik a tárolón a "Storage Blob Data Contributor" szerepkörével, a következő paranccsal listázhatja a tárolóban lévő blobokat:

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

6. Erőforrások tisztítása

Futtassa az az group delete parancsot, ha nem szükséges megtartania az ebben a példában használt erőforráscsoportot és tárolót. Az erőforráscsoportok nem számolnak fel folyamatos díjakat az előfizetésben, de az erőforráscsoportban lévő erőforrások, például a tárfiókok továbbra is díjakat vonhatnak maga után. Ajánlott minden olyan csoportot megtisztítani, amelyet nem használ aktívan. A --no-wait argumentum lehetővé teszi, hogy a parancs azonnal visszatérjen, ahelyett hogy megvárná a művelet befejezését.

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

A ResourceManagementClient.resource_groups.begin_delete metódussal egy erőforráscsoportot is törölhet kódból. A kód az "Példa: Erőforráscsoport létrehozása" című részben bemutatja a használatát.

Ha követte a jelszó nélküli hitelesítés használatára vonatkozó utasításokat, érdemes törölnie a létrehozott alkalmazás-szolgáltatásnevet. Az ad app delete parancsot használhatja. Cserélje le a <AZURE_CLIENT_ID> helyőrzőt a szolgáltatásnév alkalmazásazonosítójára.

az ad app delete --id <AZURE_CLIENT_ID>

Lásd még