Udostępnij za pomocą


Przykład: uzyskiwanie dostępu do usługi Azure Storage przy użyciu bibliotek platformy Azure dla języka Python

Z tego artykułu dowiesz się, jak za pomocą bibliotek klienckich platformy Azure w kodzie aplikacji języka Python przekazać plik do kontenera usługi Azure Blob Storage. W artykule założono, że utworzono zasoby pokazane w temacie Przykład: Tworzenie usługi Azure Storage.

Wszystkie polecenia w tym artykule działają tak samo w powłokach poleceń systemu Linux/macOS i Windows, chyba że zaznaczono inaczej.

1. Konfigurowanie lokalnego środowiska projektowego

Jeśli jeszcze tego nie zrobiono, skonfiguruj środowisko, w którym można uruchomić kod. Oto kilka opcji:

  • Skonfiguruj środowisko wirtualne języka Python przy użyciu venv lub wybranego narzędzia. Aby rozpocząć korzystanie ze środowiska wirtualnego, pamiętaj, aby go aktywować. Aby zainstalować język Python, zobacz Instalowanie języka Python.

    #!/bin/bash
    # Create a virtual environment
    python -m venv .venv
    # Activate the virtual environment
    source .venv/Scripts/activate # only required for Windows (Git Bash)
    
  • Użyj środowiska conda. Aby zainstalować aplikację Conda, zobacz Instalowanie narzędzia Miniconda.

  • Użyj kontenera deweloperskiego w Visual Studio Code lub GitHub Codespaces.

2. Instalowanie pakietów bibliotek

W pliku requirements.txt dodaj linie z pakietem biblioteki klienta, którego potrzebujesz i zapisz plik.

azure-storage-blob
azure-identity

Następnie w terminalu lub wierszu polecenia zainstaluj wymagania.

pip install -r requirements.txt

3. Utwórz plik do przesłania

Utwórz plik źródłowy o nazwie sample-source.txt. Ta nazwa pliku jest oczekiwana w kodzie.

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

4. Używanie magazynu obiektów blob z kodu aplikacji

W tej sekcji pokazano dwa sposoby uzyskiwania dostępu do danych w kontenerze blob, który utworzyłeś w Przykład: Tworzenie usługi Azure Storage. Aby uzyskać dostęp do danych w kontenerze obiektów blob, aplikacja musi mieć możliwość uwierzytelniania za pomocą platformy Azure i mieć autoryzację dostępu do danych w kontenerze. W tej sekcji przedstawiono dwa sposoby wykonywania następujących czynności:

  • Metoda bezhasłowa (zalecana) uwierzytelnia aplikację za pomocą DefaultAzureCredential. DefaultAzureCredential to poświadczenie łańcuchowe, które może uwierzytelniać aplikację (lub użytkownika) za pomocą sekwencji różnych poświadczeń, w tym poświadczeń narzędzi dewelopera, głównych elementów usługi aplikacji i zarządzanych tożsamości.

  • Metoda ciągu połączenia używa ciągu połączenia do bezpośredniego uzyskiwania dostępu do konta magazynu.

Z następujących powodów i nie tylko zalecamy użycie metody bez hasła, jeśli jest to możliwe:

  • Parametry połączenia uwierzytelniają agenta łączącego się z kontem pamięci, a nie z poszczególnymi zasobami w ramach tego konta. W związku z tym ciąg połączenia przyznaje szersze uprawnienia niż może być potrzebne. Dzięki DefaultAzureCredential możesz przyznać bardziej szczegółowe, najmniej uprzywilejowane uprawnienia do zasobów magazynu tożsamości, w ramach której działa Twoja aplikacja, używając kontroli dostępu opartej na rolach Azure (RBAC).

  • Parametry połączenia zawierają informacje o dostępie w postaci zwykłego tekstu i w związku z tym stanowią potencjalne luki w zabezpieczeniach, jeśli nie zostały prawidłowo skonstruowane lub zabezpieczone. Jeśli taki ciąg połączenia jest ujawniony, może być użyty do uzyskania dostępu do szerokiego zakresu zasobów na koncie magazynu.

  • Parametr połączenia jest zwykle przechowywany w zmiennej środowiskowej, co sprawia, że może być podatny na naruszenie bezpieczeństwa, jeśli atakujący uzyska dostęp do twojego środowiska. Wiele typów poświadczeń obsługiwanych przez DefaultAzureCredential nie wymaga przechowywania wpisów tajnych w środowisku.

DefaultAzureCredential jest opiniotwórczym, wstępnie skonfigurowanym łańcuchem poświadczeń. DefaultAzureCredential obsługuje wiele środowisk wraz z najczęściej używanymi przepływami uwierzytelniania i narzędziami deweloperskich. Instancja DefaultAzureCredential określa typy poświadczeń, które należy wypróbować, aby uzyskać token, w oparciu o kombinację środowiska uruchomieniowego, wartości niektórych dobrze znanych zmiennych środowiskowych oraz opcjonalnie parametrów przekazanych do konstruktora.

W poniższych krokach skonfigurujesz główny element usługi jako tożsamość aplikacji. Jednostki usługi aplikacji są odpowiednie do użycia zarówno podczas programowania lokalnego, jak i aplikacji hostowanych lokalnie. Aby skonfigurować do używania jednostki usługi aplikacji, należy ustawić następujące zmienne środowiskowe: AZURE_CLIENT_ID, AZURE_TENANT_ID i AZURE_CLIENT_SECRET.

Zwróć uwagę, że skonfigurowano tajemnicę klienta. Tajny klucz klienta jest niezbędny dla głównego doradcy aplikacji, ale w zależności od scenariusza można również skonfigurować DefaultAzureCredential tak, aby używał poświadczeń, które nie wymagają wprowadzania tajnego klucza ani hasła w zmiennej środowiskowej.

Na przykład w przypadku rozwoju lokalnego, jeśli DefaultAzureCredential nie może uzyskać tokenu przy użyciu skonfigurowanych zmiennych środowiskowych, próbuje go pobrać przy użyciu użytkownika (już) zalogowanego do narzędzi programistycznych, takich jak interfejs wiersza polecenia platformy Azure, a dla aplikacji hostowanej na platformie Azure można skonfigurować DefaultAzureCredential, aby korzystała z tożsamości zarządzanej. We wszystkich przypadkach kod w aplikacji pozostaje taki sam, zmienia się tylko konfiguracja i/lub środowisko uruchomieniowe.

  1. Utwórz plik o nazwie use_blob_auth.py z następującym kodem. Komentarze wyjaśniają kroki.

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

    Linki do dokumentacji:

  2. Utwórz zmienną środowiskową o nazwie AZURE_STORAGE_BLOB_URL:

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

    Zastąp ciąg "pythonazurestorage12345" nazwą konta magazynu.

    Zmienna środowiskowa AZURE_STORAGE_BLOB_URL jest używana tylko w tym przykładzie. Nie jest ona używana przez biblioteki platformy Azure.

  3. Użyj polecenia az ad sp create-for-rbac, aby utworzyć nową jednostkę usługi dla aplikacji. Polecenie tworzy rejestrację aplikacji dla aplikacji w tym samym czasie. Nadaj jednostce usługi wybraną nazwę.

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

    Dane wyjściowe tego polecenia wyglądają podobnie do poniższego fragmentu kodu JSON. Zanotuj te wartości lub pozostaw to okno otwarte, ponieważ te wartości będą potrzebne w następnym kroku i nie będą mogły ponownie wyświetlić wartości hasła (klucza tajnego klienta). Możesz jednak w razie potrzeby dodać nowe hasło później, bez unieważniania jednostki usługi lub istniejących haseł.

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

    Polecenia Azure CLI można uruchamiać w Azure Cloud Shell lub na stacji roboczej z zainstalowanym Azure CLI.

  4. Utwórz zmienne środowiskowe dla głównego użytkownika usługi aplikacji.

    Utwórz następujące zmienne środowiskowe przy użyciu wartości z danych wyjściowych poprzedniego polecenia. Te zmienne informują DefaultAzureCredential o użyciu jednostki usługi aplikacji.

    • AZURE_CLIENT_ID → wartość identyfikatora aplikacji.
    • AZURE_TENANT_ID → wartość AZURE_TENANT_ID identyfikatora dzierżawy.
    • AZURE_CLIENT_SECRET → hasło/poświadczenia wygenerowane dla aplikacji.
    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. Spróbuj uruchomić kod (który celowo kończy się niepowodzeniem):

    python use_blob_auth.py
    
  6. Zwróć uwagę na błąd "To żądanie nie ma autoryzacji do wykonania tej operacji przy użyciu tego uprawnienia". Błąd jest oczekiwany, ponieważ używana jednostka usługi lokalnej nie ma jeszcze uprawnień dostępu do kontenera obiektów blob.

  7. Udziel uprawnień Współautor danych obiektu blob usługi Storage w kontenerze obiektów blob do jednostki usługi przy użyciu polecenia az role assignment create interfejsu wiersza polecenia platformy Azure:

    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 argument identyfikuje tożsamość usługi. Zastąp symbol zastępczy <AZURE_CLIENT_ID> identyfikatorem aplikacji głównego elementu usługi.

    Argument --scope określa, gdzie ma zastosowanie to przypisanie roli. W tym przykładzie przyznasz rolę "Współautor danych obiektu blob usługi Storage" jednostce usługi dla kontenera o nazwie "blob-container-01".

    • Zastąp PythonAzureExample-Storage-rg grupą zasobów, która zawiera Twoje konto magazynu, oraz pythonazurestorage12345 dokładną nazwą Twojego konta magazynu. Ponadto w razie potrzeby dostosuj nazwę pojemnika blob. Jeśli używasz nieprawidłowej nazwy, zostanie wyświetlony błąd "Nie można wykonać żądanej operacji na zagnieżdżonym zasobie. Nie można odnaleźć zasobu nadrzędnego "pythonazurestorage12345".

    • Zastąp symbol <AZURE_SUBSCRIPTION_ID> swoim identyfikatorem subskrypcji Azure. (Możesz uruchomić polecenie az account show i pobrać identyfikator subskrypcji z właściwości id w danych wyjściowych.)

    Napiwek

    Jeśli polecenie przypisania roli zwraca błąd "Nie znaleziono kart połączenia" podczas korzystania z powłoki bash, spróbuj ustawić ustawienie export MSYS_NO_PATHCONV=1 , aby uniknąć tłumaczenia ścieżki. Aby uzyskać więcej informacji, sprawdź ten wątek.

  8. Zaczekaj minutę lub dwie na propagację uprawnień, a następnie ponownie uruchom kod i sprawdź, czy działa. Jeśli ponownie zostanie wyświetlony błąd uprawnień, zaczekaj nieco dłużej, a następnie spróbuj ponownie wykonać kod.

Aby uzyskać więcej informacji dotyczących przypisywania ról, zobacz Jak przypisywać uprawnienia ról za pomocą Azure CLI.

Ważne

W poprzednich krokach aplikacja była uruchamiana w ramach jednostki usługi aplikacji. Główny obiekt usługi aplikacji wymaga wpisu tajnego klienta w konfiguracji. Można jednak użyć tego samego kodu, aby uruchomić aplikację z różnymi rodzajami poświadczeń, które nie wymagają jawnego konfigurowania hasła lub sekretu w środowisku. Na przykład podczas rozwoju, DefaultAzureCredential można użyć poświadczeń narzędzi deweloperskich takich jak poświadczenia używane do logowania się za pośrednictwem interfejsu wiersza polecenia platformy Azure; lub, w przypadku aplikacji hostowanych na platformie Azure, może korzystać z zarządzanej tożsamości. Aby dowiedzieć się więcej, zobacz Uwierzytelnianie aplikacji języka Python w usługach platformy Azure przy użyciu zestawu Azure SDK dla języka Python.

5. Weryfikowanie tworzenia obiektów blob

Po uruchomieniu kodu dowolnej metody, przejdź do Azure portal, przejdź do kontenera obiektów blob, aby sprawdzić, czy istnieje nowy obiekt blob, który ma nazwę sample-blob-{random}.txt, o tej samej zawartości co plik sample-source.txt:

Strona portalu Azure dla kontenera obiektów blob, pokazująca przekazany plikStrona portalu Azure dla kontenera obiektów blob, pokazująca przekazany plik

Jeśli utworzyłeś zmienną środowiskową o nazwie AZURE_STORAGE_CONNECTION_STRING, możesz również użyć interfejsu wiersza poleceń Azure, aby sprawdzić, czy obiekt blob istnieje za pomocą polecenia az storage blob list.

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

Jeśli wykonałeś instrukcje dotyczące korzystania z uwierzytelniania bez hasła, możesz dodać parametr --connection-string do poprzedniego polecenia razem z łańcuchem połączenia dla swojego konta przechowywania. Aby uzyskać łańcuch połączenia, użyj polecenia az storage account show-connection-string.

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

Użyj całego ciągu połączenia jako wartości dla parametru --connection-string.

Uwaga

Jeśli konto użytkownika platformy Azure ma rolę "Współautor danych obiektu blob usługi Storage" w kontenerze, możesz użyć następującego polecenia, aby wyświetlić listę obiektów blob w kontenerze:

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

6. Czyszczenie zasobów

Uruchom polecenie az group delete, jeśli nie musisz przechowywać grupy zasobów i zasobów magazynu używanych w tym przykładzie. Grupy zasobów nie generują żadnych bieżących opłat w ramach subskrypcji, ale zasoby, takie jak konta magazynowe, w grupie zasobów mogą nadal generować opłaty. Dobrym rozwiązaniem jest wyczyszczenie każdej grupy, której nie używasz aktywnie. Argument --no-wait pozwala poleceniu na natychmiastowe zwrócenie wyniku zamiast oczekiwania na zakończenie operacji.

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

Możesz również użyć metody ResourceManagementClient.resource_groups.begin_delete, aby usunąć grupę zasobów z kodu. Kod w Przykład: Tworzenie grupy zasobów demonstruje użycie.

Jeśli postępowałeś zgodnie z instrukcjami dotyczącymi korzystania z uwierzytelniania bez hasła, dobrym pomysłem jest usunięcie utworzonej głównej jednostki usługi aplikacji. Możesz użyć polecenia az ad app delete. Zastąp <symbol zastępczy AZURE_CLIENT_ID> identyfikatorem aplikacji jednostki usługi.

az ad app delete --id <AZURE_CLIENT_ID>

Zobacz też