Compartir a través de


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:

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

  1. 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:

  2. Cree una variable de entorno llamada AZURE_STORAGE_BLOB_URL:

    set AZURE_STORAGE_BLOB_URL=https://pythonazurestorage12345.blob.core.windows.net
    

    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.

  3. 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.

  4. 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.
    set AZURE_CLIENT_ID=00000000-0000-0000-0000-000000000000
    set AZURE_TENANT_ID=11111111-1111-1111-1111-111111111111
    set AZURE_CLIENT_SECRET=abcdefghijklmnopqrstuvwxyz
    
  5. Intente ejecutar el código (que produce un error de forma intencionada):

    python use_blob_auth.py
    
  6. 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.

  7. 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 y pythonazurestorage12345 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.

  8. 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

  1. 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}")
    
  2. 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 y pythonazurestorage12345 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.

  3. 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:

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

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