Ejemplo: Acceso a Azure Storage mediante las bibliotecas de Azure para Python
En este artículo, aprenderá a usar las bibliotecas cliente de Azure en el código de aplicación de Python para cargar un archivo en un contenedor de Azure Blob Storage. En el artículo se da por supuesto que ha creado los recursos que se muestran en Ejemplo: Creación de Azure Storage.
Todos los comandos de este artículo funcionan igual en el bash de Linux o macOS y en los shells de comandos de Windows, a menos que se indique lo contrario.
1: Configuración del entorno de desarrollo local
Si aún no lo ha hecho, configure un entorno en el que pueda ejecutar este código. Estas son algunas opciones:
Configure un entorno virtual de Python. Puede crear el entorno virtual localmente o en Azure Cloud Shell y ejecutar el código allí. Asegúrese de activar el entorno virtual para empezar a usarlo.
Use un entorno de Conda.
Use un contenedor de desarrollo en Visual Studio Code o GitHub Codespaces.
2: Instalar paquetes de biblioteca
En el archivo requirements.txt , agregue líneas para el paquete de biblioteca cliente que usará y guarde el archivo.
azure-storage-blob
azure-identity
A continuación, en el terminal o el símbolo del sistema, instale los requisitos.
pip install -r requirements.txt
3: Crear un archivo para cargar
Cree un archivo de origen denominado sample-source.txt. Este nombre de archivo es lo que espera el código.
Hello there, Azure Storage. I'm a friendly file ready to be stored in a blob.
4: Uso de Blob Storage desde el código de la aplicación
En las dos secciones siguientes se muestran dos maneras de acceder al contenedor de blobs creado a través de Ejemplo: Creación de Azure Storage.
El primer método (con autenticación) autentica la aplicación con DefaultAzureCredential
como se describe en Autenticación de aplicaciones de Python en servicios de Azure durante el desarrollo local mediante entidades de servicio. Con este método, primero debe asignar los permisos adecuados a la identidad de la aplicación, que es la práctica recomendada.
El segundo método (con cadena de conexión) usa un cadena de conexión para acceder directamente a la cuenta de almacenamiento. Aunque este método parece más sencillo, tiene dos desventajas importantes:
Una cadena de conexión autentica de forma inherente el agente de conexión con la cuenta de almacenamiento, en lugar de con recursos individuales de esa cuenta. Como resultado, una cadena de conexión concede una autorización más amplia de la que podría ser necesaria.
Un cadena de conexión contiene información de acceso en texto sin formato y, por tanto, presenta posibles vulnerabilidades si no se construye o protege correctamente. Si se expone este cadena de conexión, se puede usar para acceder a una amplia gama de recursos dentro de la cuenta de almacenamiento.
Por estos motivos, se recomienda usar el método de autenticación en el código de producción.
4a: Uso de Blob Storage con autenticación
Cree un archivo llamado use_blob_auth.py con el código siguiente. Los pasos se explican en los comentarios.
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}")
Vínculos de referencia:
Cree una variable de entorno llamada
AZURE_STORAGE_BLOB_URL
:Reemplace "pythonazurestorage12345" por el nombre de la cuenta de almacenamiento.
En este ejemplo solo se usa la
AZURE_STORAGE_BLOB_URL
variable de entorno. Las bibliotecas de Azure no las usan.Use el comando az ad sp create-for-rbac para crear una nueva entidad de servicio para la aplicación. El comando crea el registro de la aplicación para la aplicación al mismo tiempo. Asigne a la entidad de servicio un nombre de su elección.
az ad sp create-for-rbac --name {service-principal-name}
El resultado de este comando tendrá un aspecto similar al siguiente. Anote estos valores o mantenga abierta esta ventana, ya que necesitará estos valores en el paso siguiente y no podrá volver a ver el valor de contraseña (secreto de cliente). Sin embargo, puede agregar una nueva contraseña más adelante sin invalidar la entidad de servicio o las contraseñas existentes si es necesario.
{ "appId": "00000000-0000-0000-0000-000000000000", "displayName": "{service-principal-name}", "password": "abcdefghijklmnopqrstuvwxyz", "tenant": "11111111-1111-1111-1111-111111111111" }
Los comandos de la CLI de Azure se pueden ejecutar en Azure Cloud Shell o en una estación de trabajo que tenga la CLI de Azure instalada.
Cree variables de entorno para la entidad de servicio de la aplicación:
Cree las siguientes variables de entorno con los valores de la salida del comando anterior. Estas variables indican
DefaultAzureCredential
a usar la entidad de servicio de la aplicación.AZURE_CLIENT_ID
→ Valor del id. de la aplicación.AZURE_TENANT_ID
→ Valor del id. de inquilino.AZURE_CLIENT_SECRET
→ Contraseña o credencial generada para la aplicación.
Intente ejecutar el código (que produce un error de forma intencionada):
python use_blob_auth.py
Observe el error "Esta solicitud no está autorizada para realizar esta operación mediante este permiso". Se espera el error porque la entidad de servicio local que está usando aún no tiene permiso para acceder al contenedor de blobs.
Conceda permisos de colaborador en el contenedor de blobs a la entidad de servicio mediante el comando az role assignment create de la CLI de 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"
El
--assignee
argumento identifica la entidad de servicio. Reemplace <AZURE_CLIENT_ID marcador> de posición por el identificador de aplicación de la entidad de servicio.El argumento
--scope
identifica dónde se aplica esta asignación de roles. En este ejemplo, se concede el rol "Colaborador de datos de Storage Blob" a la entidad de servicio para el contenedor denominado "blob-container-01".Reemplace
PythonAzureExample-Storage-rg
ypythonazurestorage12345
por el grupo de recursos que contiene la cuenta de almacenamiento y el nombre exacto de la cuenta de almacenamiento. Además, ajuste el nombre del contenedor de blobs, si es necesario. Si utiliza un nombre incorrecto, se mostrará el mensaje de error "No se puede llevar a cabo la operación solicitada en el recurso anidado. No se encontró el recurso primario 'pythonazurestorage12345'".Reemplace el <AZURE_SUBSCRIPTION_ID> marcador de posición por el identificador de suscripción de Azure. (Puede ejecutar el comando az account show y obtener el identificador de suscripción de la
id
propiedad en la salida).
Sugerencia
Si el comando de asignación de roles devuelve un error "No se encontraron adaptadores de conexión" al usar el shell de Bash, intente establecer
export MSYS_NO_PATHCONV=1
para evitar la traducción de rutas de acceso. Para más información, consulta esta propuesta.Espere un minuto o dos para que los permisos se propaguen y, después, vuelva a ejecutar el código para comprobar que ahora funciona. Si vuelve a ver el error de permisos, espere un poco más y vuelva a probar el código.
Para más información sobre las asignaciones de roles, consulte Incorporación o eliminación de asignaciones de roles de Azure mediante la CLI de Azure.
4b: Uso de Blob Storage con un cadena de conexión
Cree un archivo de Python llamado use_blob_conn_string.py con el siguiente código. Los pasos se explican en los comentarios.
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}")
Cree una variable de entorno denominada
AZURE_STORAGE_CONNECTION_STRING
, cuyo valor es la cadena de conexión completa de la cuenta de almacenamiento. (Esta variable de entorno también la usan varios comentarios de la CLI de Azure). Para obtener el cadena de conexión de la cuenta de almacenamiento, ejecute el comando az storage account show-connection-string.az storage account show-connection-string --resource-group PythonAzureExample-Storage-rg --name pythonazurestorage12345
Reemplace
PythonAzureExample-Storage-rg
ypythonazurestorage12345
por el grupo de recursos que contiene la cuenta de almacenamiento y el nombre exacto de la cuenta de almacenamiento.Al establecer la variable de entorno, use el valor completo de la
connectionString
propiedad en la salida, incluidas las comillas.Ejecute el código:
python use_blob_conn_string.py
De nuevo, aunque este método es sencillo, una cadena de conexión autoriza todas las operaciones de una cuenta de almacenamiento. Con el código de producción, es mejor usar permisos específicos, como se describe en la sección anterior.
5. Comprobación de la creación de blobs
Después de ejecutar el código de cualquiera de los métodos, vaya a Azure Portal, vaya al contenedor de blobs para comprobar que existe un nuevo blob denominado sample-blob-{random}.txt con el mismo contenido que el archivo sample-source.txt:
Si creó una variable de entorno denominada AZURE_STORAGE_CONNECTION_STRING
, también puede usar la CLI de Azure para comprobar que el blob existe mediante el comando az storage blob list :
az storage blob list --container-name blob-container-01
Si ha seguido las instrucciones para usar Blob Storage con autenticación, puede agregar el --connection-string
parámetro al comando anterior con el cadena de conexión de la cuenta de almacenamiento. Para obtener información sobre cómo obtener el cadena de conexión, consulte las instrucciones de 4b: Uso de Blob Storage con una cadena de conexión. Use el cadena de conexión completo, incluidas las comillas.
6: Limpieza de recursos
Ejecute el comando az group delete si no necesita mantener el grupo de recursos y los recursos de almacenamiento usados en este ejemplo. Los grupos de recursos no incurren en cargos continuos en la suscripción, pero los recursos, como las cuentas de almacenamiento, en el grupo de recursos pueden incurrir en cargos. Es recomendable limpiar cualquier grupo que no esté usando activamente. El argumento --no-wait
permite que el comando devuelva el control inmediatamente en lugar de esperar a que finalice la operación.
az group delete -n PythonAzureExample-Storage-rg --no-wait
También puede usar el método ResourceManagementClient.resource_groups.begin_delete
para eliminar un grupo de recursos del código. El código de Ejemplo: Crear un grupo de recursos muestra el uso.
Si ha seguido las instrucciones para usar Blob Storage con autenticación, es recomendable eliminar la entidad de servicio de la aplicación que creó. Puede usar el comando az ad app delete . Reemplace el <marcador de posición AZURE_CLIENT_ID> por el identificador de aplicación de la entidad de servicio.
az ad app delete --id <AZURE_CLIENT_ID>
Consulte también
- Ejemplo: Creación de un grupo de recursos
- Ejemplo: Enumeración de grupos de recursos en una suscripción
- Ejemplo: Creación de una aplicación web e implementación de código
- Ejemplo: Creación de Azure Storage
- Ejemplo: Creación y consulta de una base de datos
- Ejemplo: Creación de una máquina virtual
- Uso de Azure Managed Disks con máquinas virtuales
- Realización de una breve encuesta sobre el SDK de Azure para Python
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de