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:
Skonfiguruj środowisko wirtualne języka Python przy użyciu
venv
lub wybranego narzędzia. Środowisko wirtualne można utworzyć lokalnie lub w usłudze Azure Cloud Shell i uruchomić tam kod. Pamiętaj, aby aktywować środowisko wirtualne, aby rozpocząć korzystanie z niego.Użyj środowiska conda.
Użyj kontenera deweloperskiego w programie Visual Studio Code lub GitHub Codespaces.
2. Instalowanie pakietów bibliotek
W pliku requirements.txt dodaj wiersze dla potrzebnego pakietu biblioteki klienta i zapisz 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 tej sekcji przedstawiono dwa sposoby uzyskiwania dostępu do danych w kontenerze obiektów blob utworzonym w temacie 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 Bez hasła (zalecane) uwierzytelnia aplikację przy użyciu polecenia
DefaultAzureCredential
.DefaultAzureCredential
to poświadczenie łańcuchowe, które może uwierzytelniać aplikację (lub użytkownika) przy użyciu sekwencji różnych poświadczeń, w tym poświadczeń narzędzia dewelopera, jednostek usługi aplikacji i tożsamości zarządzanych.Metoda Parametry połączenia używa parametry 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 uwierzytelnia agenta łączącego się z kontem 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. Dzięki
DefaultAzureCredential
temu możesz przyznać bardziej szczegółowe, najmniej uprzywilejowane uprawnienia do zasobów magazynu do tożsamości, w ramach której działa aplikacja przy użyciu kontroli dostępu opartej na rolach platformy Azure.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.
Parametry połączenia jest zwykle przechowywany w zmiennej środowiskowej, co sprawia, że jest podatny na naruszenie, jeśli osoba atakująca uzyska dostęp do środowiska. Wiele typów poświadczeń obsługiwanych przez
DefaultAzureCredential
program nie wymaga przechowywania wpisów tajnych w środowisku.
DefaultAzureCredential
jest wstępnie skonfigurowanym łańcuchem poświadczeń. Jest ona przeznaczona do obsługi wielu środowisk wraz z najczęściej używanymi przepływami uwierzytelniania i narzędziami deweloperskich. Wystąpienie DefaultAzureCredential
klasy określa typy poświadczeń, które mają próbować uzyskać token na podstawie kombinacji środowiska uruchomieniowego, wartości niektórych dobrze znanych zmiennych środowiskowych i, opcjonalnie, parametrów przekazanych do konstruktora.
W poniższych krokach skonfigurujesz jednostkę usługi aplikacji 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ć używanie jednostki usługi aplikacji, należy ustawić DefaultAzureCredential
następujące zmienne środowiskowe: AZURE_CLIENT_ID
, AZURE_TENANT_ID
i AZURE_CLIENT_SECRET
.
Zwróć uwagę, że skonfigurowano wpis tajny klienta. Jest to konieczne w przypadku jednostki usługi aplikacji, ale w zależności od scenariusza można również skonfigurować DefaultAzureCredential
używanie poświadczeń, które nie wymagają ustawienia wpisu tajnego ani hasła w zmiennej środowiskowej.
Na przykład w przypadku programowania lokalnego, jeśli DefaultAzureCredential
nie można uzyskać tokenu przy użyciu skonfigurowanych zmiennych środowiskowych, próbuje pobrać go przy użyciu użytkownika (już) zalogowanego do narzędzi programistycznych, takich jak interfejs wiersza polecenia platformy Azure; dla aplikacji hostowanej na platformie Azure można skonfigurować tak, DefaultAzureCredential
aby korzystała z tożsamości zarządzanej. We wszystkich przypadkach kod w aplikacji pozostaje taki sam, tylko konfiguracja i/lub zmiany środowiska uruchomieniowego.
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:
Utwórz zmienną środowiskową o nazwie
AZURE_STORAGE_BLOB_URL
: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.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": "00001111-aaaa-2222-bbbb-3333cccc4444", "displayName": "<service-principal-name>", "password": "Aa1Bb~2Cc3.-Dd4Ee5Ff6Gg7Hh8Ii9_Jj0Kk1Ll2", "tenant": "aaaabbbb-0000-cccc-1111-dddd2222eeee" }
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.
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.
Spróbuj uruchomić kod (który celowo kończy się niepowodzeniem):
python use_blob_auth.py
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.
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 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 ipythonazurestorage12345
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.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.
Ważne
W poprzednich krokach aplikacja była uruchamiana w ramach jednostki usługi aplikacji. Jednostka usługi aplikacji wymaga wpisu tajnego klienta w konfiguracji. Można jednak użyć tego samego kodu, aby uruchomić aplikację w różnych typach poświadczeń, które nie wymagają jawnego skonfigurowania hasła lub wpisu tajnego w środowisku. Na przykład podczas programowania można użyć poświadczeń narzędzi deweloperskich, DefaultAzureCredential
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 używać tożsamości zarządzanej. 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 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:
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 korzystania z uwierzytelniania bez hasła, możesz dodać --connection-string
parametr do poprzedniego polecenia przy użyciu parametry połączenia dla konta magazynu. Aby uzyskać parametry 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łej parametry połączenia jako wartości 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 magazynu, w grupie zasobów mogą nadal ponosić opłaty. 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 korzystania z uwierzytelniania bez hasła, 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ż
- Szybki start: biblioteka klienta usługi Azure Blob Storage dla języka Python
- Przykład: tworzenie grupy zasobów
- Przykład: Wyświetlanie listy grup zasobów w subskrypcji
- Przykład: tworzenie aplikacji internetowej i wdrażanie kodu
- Przykład: tworzenie usługi Azure Storage
- Przykład: tworzenie bazy danych i wykonywanie względem jej zapytań
- Przykład: tworzenie maszyny wirtualnej
- Korzystanie z usługi Azure Dyski zarządzane z maszynami wirtualnymi
- Wykonaj krótką ankietę dotyczącą zestawu Azure SDK dla języka Python