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 tym 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 zostały zaznaczone.

1: Konfigurowanie lokalnego środowiska projektowego

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

2. Instalowanie pakietów bibliotek

W pliku requirements.txt dodaj wiersze dla pakietu biblioteki klienta, którego użyjesz i zapiszesz plik.

azure-storage-blob
azure-identity

Następnie w terminalu lub wierszu polecenia zainstaluj wymagania.

pip install -r requirements.txt

3. Tworzenie pliku do przekazania

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 poniższych dwóch sekcjach przedstawiono dwa sposoby uzyskiwania dostępu do kontenera obiektów blob utworzonych za pomocą przykładu: Tworzenie usługi Azure Storage.

Pierwsza metoda (z uwierzytelnianiem) uwierzytelnia aplikację zgodnie z opisem DefaultAzureCredential w temacie Uwierzytelnianie aplikacji języka Python w usługach platformy Azure podczas tworzenia lokalnego przy użyciu jednostek usługi. W przypadku tej metody należy najpierw przypisać odpowiednie uprawnienia do tożsamości aplikacji, co jest zalecaną praktyką.

Druga metoda (z parametry połączenia) używa parametry połączenia do bezpośredniego uzyskiwania dostępu do konta magazynu. Chociaż ta metoda wydaje się prostsza, ma dwie znaczące wady:

  • Parametry połączenia z założenia uwierzytelnia agenta łączącego przy użyciu konta magazynu, a nie z poszczególnymi zasobami w ramach tego konta. W związku z tym parametry połączenia przyznaje szerszą autoryzację niż może być potrzebna.

  • Parametry połączenia zawiera informacje o dostępie w postaci zwykłego tekstu i w związku z tym przedstawia potencjalne luki w zabezpieczeniach, jeśli nie są prawidłowo skonstruowane lub zabezpieczone. Jeśli taki parametry połączenia jest uwidoczniony, może służyć do uzyskiwania dostępu do szerokiego zakresu zasobów na koncie magazynu.

Z tych powodów zalecamy użycie metody uwierzytelniania w kodzie produkcyjnym.

4a: Używanie usługi Blob Storage z uwierzytelnianiem

  1. Utwórz plik o nazwie use_blob_auth.py przy użyciu następującego kodu. 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 AZURE_STORAGE_BLOB_URL środowiskowa 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 będą wyglądać następująco. 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 dodać nowe hasło później bez unieważnienia jednostki usługi lub istniejących haseł w razie potrzeby.

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

    Polecenia interfejsu wiersza polecenia platformy Azure można uruchamiać w usłudze Azure Cloud Shell lub na stacji roboczej z zainstalowanym interfejsem wiersza polecenia platformy Azure.

  4. Utwórz zmienne środowiskowe dla jednostki 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ść identyfikatora dzierżawy.
    • AZURE_CLIENT_SECRET → hasło/poświadczenia wygenerowane dla aplikacji.
    set AZURE_CLIENT_ID=00000000-0000-0000-0000-000000000000
    set AZURE_TENANT_ID=11111111-1111-1111-1111-111111111111
    set AZURE_CLIENT_SECRET=abcdefghijklmnopqrstuvwxyz
    
  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ółautora 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 jednostkę usługi. Zastąp <symbol zastępczy AZURE_CLIENT_ID> identyfikatorem aplikacji jednostki usługi.

    --scope Argument 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 wartości i pythonazurestorage12345 grupą zasobów zawierającą konto magazynu oraz dokładną nazwę konta magazynu. Ponadto w razie potrzeby dostosuj nazwę kontenera obiektów 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 <element zastępczy AZURE_SUBSCRIPTION_ID> identyfikatorem subskrypcji platformy Azure. (Możesz uruchomić polecenie az account show i pobrać identyfikator subskrypcji z id właściwości 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, zobacz ten problem.

  8. Zaczekaj minutę lub dwie na propagację uprawnień, a następnie ponownie uruchom kod, aby sprawdzić, czy teraz 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 na temat przypisań ról, zobacz Jak przypisać uprawnienia roli przy użyciu interfejsu wiersza polecenia platformy Azure.

4b: Używanie magazynu obiektów blob z parametry połączenia

  1. Utwórz plik w języku Python o nazwie use_blob_conn_string.py przy użyciu następującego kodu. Komentarze wyjaśniają kroki.

    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. Utwórz zmienną środowiskową o nazwie AZURE_STORAGE_CONNECTION_STRING, której wartość jest pełną parametry połączenia dla konta magazynu. (Ta zmienna środowiskowa jest również używana przez różne komentarze interfejsu wiersza polecenia platformy Azure). Aby uzyskać parametry połączenia dla konta magazynu, uruchom polecenie az storage account show-connection-string.

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

    Zastąp PythonAzureExample-Storage-rg wartości i pythonazurestorage12345 grupą zasobów zawierającą konto magazynu oraz dokładną nazwę konta magazynu.

    Po ustawieniu zmiennej środowiskowej użyj całej wartości connectionString właściwości w danych wyjściowych, w tym cudzysłowów.

  3. Uruchom kod:

    python use_blob_conn_string.py
    

Mimo że ta metoda jest prosta, parametry połączenia autoryzuje wszystkie operacje na koncie magazynu. W przypadku kodu produkcyjnego lepiej używać określonych uprawnień zgodnie z opisem w poprzedniej sekcji.

5. Weryfikowanie tworzenia obiektów blob

Po uruchomieniu kodu każdej metody przejdź do witryny Azure Portal, przejdź do kontenera obiektów blob, aby sprawdzić, czy nowy obiekt blob istnieje o nazwie sample-blob-{random}.txt o tej samej zawartości co plik sample-source.txt:

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

Jeśli utworzono zmienną środowiskową o nazwie AZURE_STORAGE_CONNECTION_STRING, możesz również użyć interfejsu wiersza polecenia platformy Azure, aby sprawdzić, czy obiekt blob istnieje przy użyciu polecenia az storage blob list :

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

Jeśli wykonano instrukcje dotyczące używania magazynu obiektów blob z uwierzytelnianiem, możesz dodać --connection-string parametr do poprzedniego polecenia przy użyciu parametry połączenia dla konta magazynu. Aby dowiedzieć się, jak uzyskać parametry połączenia, zobacz instrukcje w 4b: Używanie magazynu obiektów blob z parametry połączenia. Użyj całej parametry połączenia, w tym cudzysłowów.

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 magazynu, w grupie zasobów mogą powodować naliczanie opłat. Dobrym rozwiązaniem jest wyczyszczenie każdej grupy, której nie używasz aktywnie. Argument --no-wait umożliwia polecenie natychmiastowego zwrócenia zamiast oczekiwania na zakończenie operacji.

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

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

Jeśli wykonano instrukcje dotyczące używania magazynu obiektów blob z uwierzytelnianiem, dobrym pomysłem jest usunięcie utworzonej 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ż