Replicación de blobs entre dos cuentas de Azure Storage en dos tenants diferentes

En muchas ocasiones es necesario generar réplicas de manera selectiva de lo que ocurre en una cuenta de almacenamiento. Los motivos pueden ser muchos, pero el más simple suele ser por tener un respaldo en otra cuenta totalmente aislada de la original, incluso en un tenant diferente, por motivos de seguridad. Hoy quiero contarte cómo usar la característica object replication de las cuentas de almacenamiento de Microsoft Azure entre diferentes tenants.

Configuración de las cuentas

Antes de habilitar la replicación entre cuentas es importante que sepas que debes tener tanto en origen como en destino habilitada la opción Enable versioning for blobs y solo en origen la opción Enable blob change feed. Todo esto se hace desde el apartado Data protection de la cuenta de Azure Storage:

Configuración de Data protection en la cuenta de origen

Configuración de la cuenta de destino

En el caso de la replicación entre cuentas de almacenamiento en distintos tenants es necesario empezar por el destino. En este caso debemos crear un archivo en formato JSON parecido al siguiente:

{
    "properties": {
        "policyId": "default",
        "sourceAccount": "gotham",
        "destinationAccount": "arkham",
        "rules": [
            {
                "ruleId": "",
                "sourceContainer": "bruce",
                "destinationContainer": "batman",
                "filters": {
                    "minCreationTime": "1601-01-01T00:00:00Z"
                }
            }
        ]
    }
}

En este escenario es importante mantener el valor de policyId a default, para que genere de manera automática el Id correspondiente. El resto, como ves, indica que la cuenta de origen se llama gotham y la de destino arkham (😝). Por otro lado, el contenedor que esperamos en el origen es bruce y en destino batman. Es muy importante que ambos contenedores existan antes de la creación de la regla, ya que en caso contrario dará un error, a día de hoy muy poco descriptivo, que podría tenerte [email protected] durante un buen rato (no me preguntes cómo lo sé 🙃). Por último he añadido en el apartado filters el valor minCreationTime a 1601-01-01T00:00:00Z. Esto significa que quiero que se copie todo el contenido del contenedor en destino, tanto el que ya existiera como el que venga nuevo.

Ahora, con este archivo, en la cuenta de destino, en el apartado Object replication súbelo a través del botón Upload replication rules.

Subir reglas para la replicación de objetos

Antes de confirmar los cambios verás que toda la información del JSON quedará representada en la página de confirmación:

Detalle de la regla que vas a subir

Una vez que aceptes los cambios verás que aparece dicha regla en el apartado Other accounts. Sin embargo, con esto solo no es suficiente para que la replicación sea efectiva. Todavía nos queda configurar la cuenta de origen.

Configuración de la cuenta de origen

Si bien es cierto que esta configuración no es nada obvia, está pensada para que el usuario que configura la cuenta de destino no tenga nada que ver con el que potencialmente configure la de origen. Esto mejora la seguridad ya que en el caso contrario si uno de los tenants se ve comprometido el usuario que tiene que hacer estas configuraciones no tiene por qué tener permisos en ambos sitios. Ahora, para configurar la cuenta de origen debemos subir nuevamente otro archivo en formato JSON. Sin embargo, en esta ocasión, en vez de generarlo nosotros de forma manual lo que tenemos que hacer es descargarnos el generado en la cuenta de destino, a través de los tres puntos que aparecen al lado de la regla que acabas de crear:

Descarga de la regla generada en el destino

Si abres este archivo verás que ahora es mucho más elaborado que el que subiste inicialmente.

{
  "id": "/subscriptions/DESTINATION_SUBSCRIPTION_ID/resourceGroups/Object-Replication-Demo/providers/Microsoft.Storage/storageAccounts/arkham/objectReplicationPolicies/POLICY_ID",
  "name": "GUID",
  "type": "Microsoft.Storage/storageAccounts/objectReplicationPolicies",
  "properties": {
    "policyId": "POLICY_ID",
    "sourceAccount": "gotham",
    "destinationAccount": "arkham",
    "rules": [
      {
        "ruleId": "RULE_ID",
        "sourceContainer": "bruce",
        "destinationContainer": "batman",
        "filters": {
          "minCreationTime": "1601-01-01T00:00:00Z"
        }
      }
    ]
  }
}

El último paso sería subir este en la cuenta de origen, de la misma forma que subiste el primer archivo, a través del botón Upload replication rules. Si todo ha ido bien, deberías de ver en el apartado Other accounts del origen, la regla que generamos en destino:

Regla aplicada en la cuenta de origen

A partir de este momento todo el contenido que ya hubiera en el contenedor bruce de gotham será replicado de manera automática al contenedor batman de arkham. Ten en cuenta que esta replicación no es inmediata, por lo que puede llevar un tiempo ver la replica en su sitio. No obstante, puedes ver por cada blob en origen el estado de la copia, seleccionando el archivo a través del apartado Data Storage > Containers, en el apartado Overview.

Estado de la copia de un archivo a través de Object Replication

¡Saludos!