¿Por qué se ha borrado el container del Storage Account, si tenía bloqueo?. Hablemos de Control Plane y Data Plane



Hace unas semanas, hablando con un amigo, este me comentaba como en el trabajo se había realizado un cambio en un script que manipulaba storage accounts. La cuestión es que (no me preguntéis como ni porque jajaja), en ese script se metió una línea que borraba un container usando el comando de Powershell Remove-AzStorageContainer.

¿Y sabéis que paso? Pues sí, que el container se borró. Gracias a que estaba habilitado el soft delete del container, pues se recupero el container y el problema se resolvió. A continuación, se cambió el script y se busco una forma mejor de revisar los scripts antes de darlos por válidos.

Pero después , alguna gente se hacía la siguiente PREGUNTA :

¿Cómo se ha borrado el container, sí el storage account tenía un bloqueo?



Antes de resolver la pregunta, es necesario revisar dos conceptos muy importantes cuando se trabaja con Azure. Esos dos conceptos son Control Plane y Data Plane.

Tal y como viene en la documentación de Azure:

“Las operaciones de Azure se pueden dividir en dos categorías: Control Plane y Data Plane.

Control Plane se utiliza para administrar los recursos de su suscripción.

Data Plane se usa para utilizar las funcionalidades expuestas por la instancia de un tipo de recurso.”

Control Plane

Ejemplos de operaciones que se hacen usando Control Plane son:

  • Crear un máquina virtual.
  • Crear un Storage Account.
  • Crear un servidor y bases de datos de Azure SQL.

Al final y al cabo, todo lo que sea crear, modificar o eliminar recursos se hace a través del Control Plane.

Estas operaciones del Control Plane, se hacen a través del Azure Resource Manager API.

Las url usadas son:

El siguiente diagrama ofrecido por Microsoft, es de mucha ayuda para entender el concepto de Control Plane:



Para ver de forma rápida, operaciones que se realizan a través del Control Plane, basta con abrir el portal de Azure en un navagedor web y abrir la pestaña de Network con la tecla F12:




**NOTA MUY IMPORTANTE: Por último un detalle muy importante, los bloqueosa los recursos solo afectan a operaciones que se hacen a través del Control Plane y no a través del Data Plane. **



Data Plane

Por otro lado, tal y como dice Microsoft, cuando hablamos de Data Plane nos referimos a operaciones que hacemos a las funcionalidades expuestas por la instancia de un tipo de recurso

Para verlo de una forma más clara, supongamos que tenemos un storage llamado strecetasdevopslocked. Pues este servicio expondrá la siguiente url https://strecetasdevopslocked.blob.core.windows.net/.

A través de esta url podremos hacer operaciones sobre los blobs de ese storage account como:

  • Crear blobs

  • Eliminar blobs

  • Modificar blobs

De la misma manera que con Control Plane. Si accedéis al portal de Azure, luego vaís a un storage account y accedéis un blob, veréis que si le dais a F12 en el navrgador web para ir a la pestaña de Network, las peticiones para ver el blob se hacen a través de Data Plane y no a través de Control Plane (https://management.azure.com ).




Al contrario que con Control Plane, las operaciones de Data Plane no están restringidas a usar los servicios REST expuestos por las instancias de los servicios. Por ejemplo logarte en bases de datos de Azure SQL, o acceder a una máquina virtual por escritorio remoto son también operaciones que entran dentro del paraguas de Data Plane.

Una vez explicado estos dos conceptos (espero haberlo explicado medianamente bien jeje), vamos al asunto de este artículo que es responder la siguiente pregunta:

¿Cómo se ha borrado el container, sí el Storage Account tenía un bloqueo?

Para resolver esta duda lo mejor es hacer un ejemplo:

Tenemos el siguiente storage account, llamado strecetasdevopslocked, el cuál tiene un bloqueo de tipo Delete. Viendo esto nuestra cabeza piensa lo siguiente:

“Si intento borrar el storage account o únicamente borro un container dentro de este storage account, como tengo un bloqueo eso no va a ocurrir”




Vamos a la primera afirmación, vamos a intentar borrar un storage account. Para ello vamos a ejecutar un script de Powershell donde vamos a querer eliminar este storage account, usando el comando Remove-AzStorageAccount:

#Login to Azure
Connect-AzAccount

#variables
$tenantId = "[put_your_tenant_id_here]"
$subscriptionId= "[put_your_subscription_id_here]"
Set-AzContext -Tenant $tenantId -Subscription $subscriptionId

Remove-AzStorageAccount `
       -ResourceGroupName "rg-resourceblocked" `
       -AccountName "strecetasdevopslocked" `
       -Force `
       -Verbose `
       -Debug

Cuando lanzamos el script, vemos como el comando Remove-AzStorageAccount llama a https://management.azure.com, es decir al Control Plane.



Como la operación que realiza es en el Control Plane y tenemos un bloqueo, al eliminar nos salta un error diciendo que no se puede borrar porque hay un bloqueo.


Ahora ya sí, vamos a intentar eliminar el container llamado container dentro del storage account, usando el comando Remove-AzStorageContainer, que fue lo que se lanzo la noche de autos (jajaja):



El script que lanzamos el siguiente:

#Login to Azure
Connect-AzAccount

#variables
$tenantId = "[put_your_tenant_id_here]"
$subscriptionId= "[put_your_subscription_id_here]"
Set-AzContext -Tenant $tenantId -Subscription $subscriptionId

$storageAccount = Get-AzStorageAccount `
    -ResourceGroupName "rg-resourceblocked" `
    -Name "strecetasdevopslocked" 
Remove-AzStorageContainer `
     -Context $storageAccount.Context `
     -Name "container" `
     -Force `
     -Verbose `
     -Debug

Y lo que ocurre cuando lo lanzamos, es que efectivamente el container se borra. Pero fijaros en la imagen, en el recuadro rojo. Podéis ver que esta llamando al Data Plane. Y como comentamos antes: En las operaciones al Data Plane los bloqueos no valen, los bloqueos solo afectan a operaciones en el Control Plane.



He aquí la respuesta a la pregunta, y es que el comando Remove-AzStorageContainer no va a través del Control Plane, sino a través del Data Plane donde los bloqueos no tienen ningún efecto.

Si usamos azcli, usando el comando az storage container delete, pues pasa lo mismo, va a través del Data Plane y el container se borra:

az login --tenant "[put_your_tenant_id_here]"

az account set --subscription "[put_your_subscription_id_here]"

az storage container delete --name container --account-name strecetasdevopslocked --debug


Lo mismo pasa con Terraform, si usas el tipo de resource azurerm_storage_container , y en algún momento se elimina, Terraform usa el Data Plane y no hay bloqueo que lo salve.

Dicho esto, no es que en realidad las operaciones sobre containers estén sólo en el Data Plane, es que TAMBIÉN EXISTEN LAS OPERACIONES DE CREAR O MODIFICAR CONTAINERS EN EL CONTROL PLANE¡¡¡, pero no se porque están menos publicitadas por así decirlo jaja.

En las siguientes urls podéis ver las operaciones tanto en Control Plane como Data Plane:

Ahora vamos a cambiar en nuestro script de Powershell el comando Remove-AzStorageContainer , por el comando Remove-AzRmStorageContainer, donde ahora si va a usar el Control Plane:

#Login to Azure
Connect-AzAccount

#variables
$tenantId = "[put_your_tenant_id_here]"
$subscriptionId= "[put_your_subscription_id_here]"
Set-AzContext -Tenant $tenantId -Subscription $subscriptionId

$storageAccount = Get-AzStorageAccount `
    -ResourceGroupName "rg-resourceblocked" `
    -Name "strecetasdevopslocked" 

Remove-AzRmStorageContainer `
    -Context $storageAccount.Context `
    -Name "container" `
    -Force `
    -Verbose `
    -Debug

Lanzamos el script y efectivamente falla porque existe un bloqueo:



Ahora si vamos a azcli, y cambiamos el comando az storage container delete por az storage container-rm, haríamos uso de Control Plane, y por tanto tendría cuenta el bloqueo:



Como conclusión, si queremos que no se borren los containers accidentalmente, protegidos en storage account por un bloqueo en nuestros scripts, debemos hacer uso de los comandos que usen las operaciones del Control Plane y no del Data Plane.

Sé que quizás el artículo ha quedado un poco denso, pero creo que es un tema muy interesante y que os puede servir de gran ayuda.

Saludos y hasta la próxima.