Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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
venvlub 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.DefaultAzureCredentialto 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
DefaultAzureCredentialmoż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
DefaultAzureCredentialnie 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.
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:
Utwórz zmienną środowiskową o nazwie
AZURE_STORAGE_BLOB_URL:Zastąp ciąg "pythonazurestorage12345" nazwą konta magazynu.
Zmienna środowiskowa
AZURE_STORAGE_BLOB_URLjest używana tylko w tym przykładzie. Nie jest ona używana przez biblioteki platformy Azure.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.
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ą
DefaultAzureCredentialo użyciu jednostki usługi aplikacji.-
AZURE_CLIENT_ID→ wartość identyfikatora aplikacji. AZURE_TENANT_ID→ wartośćAZURE_TENANT_IDidentyfikatora dzierżawy.AZURE_CLIENT_SECRET→ hasło/poświadczenia wygenerowane dla aplikacji.
-
Spróbuj uruchomić kod (który celowo kończy się niepowodzeniem):
python use_blob_auth.pyZwróć 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.
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"--assigneeargument identyfikuje tożsamość usługi. Zastąp symbol zastępczy <AZURE_CLIENT_ID> identyfikatorem aplikacji głównego elementu usługi.Argument
--scopeokreś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-rggrupą zasobów, która zawiera Twoje konto magazynu, orazpythonazurestorage12345dokł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
idw 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.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 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ż
- Szybki start: biblioteka klienta usługi Azure Blob Storage dla języka Python
- Przykład: Tworzenie grupy zasobów
- Przykład: Lista grup zasobów w subskrypcji
- Przykład: Utwórz aplikację internetową i wdrażaj kod
- Przykład: Utwórz Azure Storage
- Przykład: tworzenie bazy danych i wykonywanie względem jej zapytań
- Przykład: Utwórz maszynę wirtualną
- Użyj usługi Azure Dyski Zarządzane z maszynami wirtualnymi
- Wypełnij krótką ankietę dotyczącą Azure SDK dla języka Python