Пример. Доступ к служба хранилища Azure с помощью библиотек Azure для Python
В этой статье вы узнаете, как использовать клиентские библиотеки Azure в коде приложения Python для отправки файла в контейнер хранилища BLOB-объектов Azure. В статье предполагается, что вы создали ресурсы, показанные в примере: создание служба хранилища Azure.
Все описанные в этой статье команды работают одинаково как в Bash для Linux или macOS, так и в командных оболочках для Windows, если не указано иное.
1. Настройка локальной среды разработки
Если вы еще не сделали этого, настройте среду, в которой можно запустить этот код. Ниже приведено несколько вариантов:
Настройте виртуальную среду Python с помощью
venv
или выбранного средства. Вы можете создать виртуальную среду локально или в Azure Cloud Shell и запустить код там. Обязательно активируйте виртуальную среду, чтобы начать использовать ее.Используйте среду conda.
Используйте контейнер разработки в Visual Studio Code или GitHub Codespaces.
2. Установка пакетов библиотек
В файле requirements.txt добавьте строки для необходимого пакета клиентской библиотеки и сохраните файл.
azure-storage-blob
azure-identity
Затем в терминале или командной строке установите требования.
pip install -r requirements.txt
3. Создание файла для отправки
Создайте исходный файл с именем sample-source.txt. Это имя файла, который ожидает код.
Hello there, Azure Storage. I'm a friendly file ready to be stored in a blob.
4. Использование хранилища BLOB-объектов из кода приложения
В этом разделе показано два способа доступа к данным в контейнере BLOB-объектов, созданном в примере: создание служба хранилища Azure. Чтобы получить доступ к данным в контейнере BLOB-объектов, приложение должно иметь возможность проходить проверку подлинности с помощью Azure и иметь право на доступ к данным в контейнере. В этом разделе представлено два способа выполнения следующих действий.
Метод без пароля (рекомендуется) проверяет подлинность приложения с помощью
DefaultAzureCredential
.DefaultAzureCredential
— это цепочки учетных данных, которые могут пройти проверку подлинности приложения (или пользователя) с помощью последовательности различных учетных данных, включая учетные данные средства разработчика, субъекты-службы приложений и управляемые удостоверения.Метод строки подключения использует строка подключения для прямого доступа к учетной записи хранения.
По следующим причинам и многое другое рекомендуется использовать метод без пароля по возможности:
Строка подключения проверяет подлинность агента подключения с учетной записью хранения, а не отдельными ресурсами в этой учетной записи. В результате строка подключения предоставляет более широкую авторизацию, чем может потребоваться. С
DefaultAzureCredential
помощью более детализированных разрешений с наименьшими привилегиями для ресурсов хранилища приложение выполняется с помощью Azure RBAC.Строка подключения содержит сведения о доступе в виде обычного текста и поэтому представляет потенциальные уязвимости, если они не созданы должным образом или защищены. Если такая строка подключения предоставляется, ее можно использовать для доступа к широкому спектру ресурсов в учетной записи хранения.
Строка подключения обычно хранятся в переменной среды, что делает ее уязвимой для компрометации, если злоумышленник получает доступ к вашей среде. Многие типы учетных данных, поддерживаемые
DefaultAzureCredential
не требуют хранения секретов в вашей среде.
DefaultAzureCredential
представляет собой предварительно настроенную цепочку учетных данных. Она предназначена для поддержки многих сред, а также наиболее распространенных потоков проверки подлинности и средств разработчика. Экземпляр DefaultAzureCredential
определяет, какие типы учетных данных пытаются получить маркер на основе сочетания среды выполнения, значения определенных известных переменных среды и, при необходимости, параметров, передаваемых в конструктор.
В следующих шагах вы настроите субъект-службу приложения в качестве удостоверения приложения. Субъекты-службы приложений подходят для использования как во время локальной разработки, так и для приложений, размещенных в локальной среде. Чтобы настроить DefaultAzureCredential
использование субъекта-службы приложений, задайте следующие переменные среды: AZURE_CLIENT_ID
и AZURE_TENANT_ID
AZURE_CLIENT_SECRET
.
Обратите внимание, что секрет клиента настроен. Это необходимо для субъекта-службы приложений, но в зависимости от сценария можно также настроить DefaultAzureCredential
использование учетных данных, которые не требуют установки секрета или пароля в переменной среды.
Например, в локальной разработке, если DefaultAzureCredential
не удается получить маркер с помощью настроенных переменных среды, он пытается получить его с помощью пользователя (уже вошедшего в систему) средств разработки, таких как Azure CLI; для приложения, размещенного в Azure, DefaultAzureCredential
можно настроить для использования управляемого удостоверения. Во всех случаях код в приложении остается неизменным, изменяется только конфигурация и (или) среда выполнения.
Создайте файл с именем use_blob_auth.py с указанным ниже кодом. Подробные объяснения даны в комментариях.
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}")
Ссылки для справки:
Создайте переменную среды с именем
AZURE_STORAGE_BLOB_URL
.Замените pythonazurestorage12345 именем учетной записи хранения.
Переменная
AZURE_STORAGE_BLOB_URL
среды используется только в этом примере. Он не используется библиотеками Azure.Используйте команду az ad sp create-for-rbac, чтобы создать новый субъект-службу для приложения. Команда создает регистрацию приложения для приложения одновременно. Присвойте субъекту-службе имя выбранного объекта.
az ad sp create-for-rbac --name <service-principal-name>
Выходные данные этой команды будут выглядеть следующим образом. Запишите эти значения или оставьте это окно открытым, так как вам потребуется эти значения на следующем шаге и не сможет снова просмотреть значение пароля (секрет клиента). Однако при необходимости можно добавить новый пароль без недопустимого субъекта-службы или существующих паролей.
{ "appId": "00001111-aaaa-2222-bbbb-3333cccc4444", "displayName": "<service-principal-name>", "password": "Aa1Bb~2Cc3.-Dd4Ee5Ff6Gg7Hh8Ii9_Jj0Kk1Ll2", "tenant": "aaaabbbb-0000-cccc-1111-dddd2222eeee" }
Команды Azure CLI могут выполняться в Azure Cloud Shell или на рабочей станции с установленным интерфейсом Azure CLI.
Создайте переменные среды для субъекта-службы приложения:
Создайте следующие переменные среды со значениями из выходных данных предыдущей команды. Эти переменные сообщают
DefaultAzureCredential
об использовании субъекта-службы приложения.AZURE_CLIENT_ID
→ значение идентификатора приложения.AZURE_TENANT_ID
→ Значение идентификатора клиента.AZURE_CLIENT_SECRET
→ пароль или учетные данные, созданные для приложения.
Попытайтесь выполнить код (что должно завершиться сбоем):
python use_blob_auth.py
Обратите внимание на ошибку "Этот запрос не авторизован для выполнения этой операции с помощью этого разрешения". Ожидается ошибка, так как локальный субъект-служба, который вы используете, еще не имеет разрешения на доступ к контейнеру BLOB-объектов.
Предоставьте участникам больших двоичных объектов хранилища разрешения для контейнера BLOB-объектов субъекту-службе с помощью команды az role assignment create Azure CLI:
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
определяет субъект-службу. Замените <заполнитель AZURE_CLIENT_ID> идентификатором приложения субъекта-службы.Аргумент
--scope
определяет, к чему применяется это назначение ролей. В этом примере вы предоставляете роль "Участник данных BLOB-объектов хранилища" субъекту-службе для контейнера с именем BLOB-container-01.Замените
PythonAzureExample-Storage-rg
иpythonazurestorage12345
на группу ресурсов, содержащую учетную запись хранения и точное имя учетной записи хранения. При необходимости настройте имя контейнера BLOB-объектов. Если вы используете неправильное имя, появится сообщение об ошибке "Не удается выполнить запрошенную операцию в вложенном ресурсе. Parent resource 'pythonazurestorage12345' not found" (Не удается выполнить запрошенную операцию с вложенным ресурсом. Родительский ресурс pythonazurestorage12345 не найден).Замените <держатель AZURE_SUBSCRIPTION_ID> место идентификатором подписки Azure. (Вы можете запустить команду az account show и получить идентификатор подписки из
id
свойства в выходных данных.)
Совет
Если команда назначения ролей возвращает ошибку "Адаптеры подключения не найдены" при использовании оболочки Bash, попробуйте
export MSYS_NO_PATHCONV=1
избежать перевода путей. Дополнительные сведения см. в этой проблеме.Подождите 1–2 минуты, пока разрешения не будут назначены, и снова запустите код, чтобы убедиться, что он работает. Если ошибка прав доступа происходит снова, подождите еще и повторите попытку.
Дополнительные сведения о назначении ролей см. в статье о назначении разрешений ролей с помощью Azure CLI.
Внимание
На предыдущих шагах приложение выполнялось под субъектом-службой приложений. Субъект-служба приложений требует секрет клиента в конфигурации. Однако вы можете использовать тот же код для запуска приложения в различных типах учетных данных, которые не требуют явной настройки пароля или секрета в среде. Например, во время разработки можно использовать учетные данные средства разработчика, DefaultAzureCredential
такие как учетные данные, используемые для входа с помощью Azure CLI, или для приложений, размещенных в Azure, он может использовать управляемое удостоверение. Дополнительные сведения см. в статье "Проверка подлинности приложений Python в службах Azure" с помощью пакета SDK Azure для Python.
5. Проверка создания большого двоичного объекта
После выполнения кода любого метода перейдите к портал Azure, перейдите в контейнер BLOB-объектов, чтобы убедиться, что новый большой двоичный объект существует с именем sample-blob-{random}.txt с таким же содержимым, что и файл sample-source.txt:
Если вы создали переменную среды с именем AZURE_STORAGE_CONNECTION_STRING
, вы также можете использовать Azure CLI, чтобы убедиться, что большой двоичный объект существует с помощью команды az storage blob list :
az storage blob list --container-name blob-container-01
Если вы выполнили инструкции по использованию проверки подлинности без пароля, можно добавить --connection-string
параметр в предыдущую команду с помощью строка подключения для учетной записи хранения. Чтобы получить строка подключения, используйте команду az storage account show-connection-string.
az storage account show-connection-string --resource-group PythonAzureExample-Storage-rg --name pythonazurestorage12345 --output tsv
Используйте весь строка подключения в качестве значения параметра--connection-string
.
Примечание.
Если у учетной записи пользователя Azure есть роль "Участник данных BLOB-объектов хранилища" в контейнере, можно использовать следующую команду, чтобы перечислить большие двоичные объекты в контейнере:
az storage blob list --container-name blob-container-01 --account-name pythonazurestorage12345 --auth-mode login
6. Очистка ресурсов
Выполните команду az group delete, если вам не нужно сохранить группу ресурсов и ресурсы хранилища, используемые в этом примере. Группы ресурсов не несут никаких текущих расходов в подписке, но ресурсы, такие как учетные записи хранения, в группе ресурсов могут продолжать взиматься плата. Рекомендуется очистить любую группу, которую вы не используете. Аргумент --no-wait
позволяет команде выполнять возврат без задержки, не ожидая завершения операции.
az group delete -n PythonAzureExample-Storage-rg --no-wait
Для удаления группы ресурсов с помощью кода также можно использовать метод ResourceManagementClient.resource_groups.begin_delete
. Код в примере: создание группы ресурсов демонстрирует использование.
Если вы выполнили инструкции по использованию проверки подлинности без пароля, рекомендуется удалить созданный субъект-службу приложения. Команду az ad app delete можно использовать. Замените <заполнитель AZURE_CLIENT_ID> идентификатором приложения субъекта-службы.
az ad app delete --id <AZURE_CLIENT_ID>
См. также
- Краткое руководство. Хранилище BLOB-объектов Azure клиентская библиотека для Python
- Пример. Создание группы ресурсов
- Пример. Перечисление групп ресурсов в подписке
- Пример. Создание веб-приложения и развертывание кода
- Пример. Создание служба хранилища Azure
- Пример. Создание и запрос базы данных
- Пример. Создание виртуальной машины
- Использование Управляемых дисков Azure с виртуальными машинами
- Пройдите короткий опрос об Azure SDK для Python