Añadir tracking de consumo en despliegues ARM
Tags: azure, devops, arm, partner
Published: 2019-12-31 23:12:35

Título Alterno:

## Atribución del consumo de Azure de nuestros clientes

---

He invitado a co-escribir este artículo a mi buen amigo y colega Juan Carlos Sosa, quien trabaja como Ingeniero en Habilitas.

[![Empresa Habilitas](https://thepracticaldev.s3.amazonaws.com/i/f8qgnn0zzrze04zd9t22.png)
](http://habilitas.com/)

Habilitas es una empresa Costarricense que genera productos para el sector financiero, más abajo en el capítulo [Caso Real de implementación Habilitas](#caso-real-de-implementación-habilitas) nos describe el caso particular de su compañia y como el tracking de consumo los beneficia en el proceso de implementación de su solución.

Pueden seguir a Juan Carlos Sosa en Dev.to

{% user jcgerarsr%}

--- 

Cuando trabajamos **[como partners](https://partner.microsoft.com/)** de Microsoft (por ejemplo ISVs) tenemos control de cuanto es el consumo de Azure de nuestras soluciones, esto es relativamente fácil cuando nuestro software es un SaaS (Software As A Service). Sin embargo en ocasiones los requerimientos de nuestros clientes implican que algo, o toda, nuestra aplicación se despligue en la infraestructura de ellos.

Algunos casos comunes en los que se requiere el despliegue de infraestructura en suscripciones de Azure de los clientes son:

* Bases de datos: por regulación o políticas internas los datos deben quedarse bajo el completo control del cliente
* Web App / Virtual Machine: El cliente requiere una 'máquina dedicada' donde se reduzca en su totalidad el riesgo de compartir datos en memoria, archivos y otros recursos con otras organizaciones y requiere ser el administrador de esa infraestructura.

Estos y otros escenarios comunes son perfectamente realizables gracias a la flexibilidad que nos brinda la nube, sin embargo hay otros desafíos que no siempre son detectables a simple vista.

## Entre más exitosa es tu solución más Azure consumes

Conforme tu solución SaaS es adoptada por tus clientes, tu consumo de servicios en la nube tiende a subir, por ello en la medida en que seas exitoso Microsoft es exitoso también. Desde luego entre más consumo de Azure se genere por el éxito de tu negocio más visibilidad tienes con el equipo comercial de Microsoft y eso abre las puertas a otras oportunidades de ofertas, ventas conjuntas, entrenamientos y otros beneficios más para los partners.

Justo allí es donde surgen algunas preguntas importantes.

### ¿Qué pasa cuando debo hacer despliegue de infraestructura en las suscripciones de mis clientes?

Cuando despliegas la infraestructura de tu aplicación en las suscripciones de tus clientes los consumos de Azure generados _son sus consumos_ y ellos cubren esos gastos. Ese consumo es derivado de la aplicación que les vendiste, pero normalmente no tienes forma de saber de saber cual es el consumo de esos servicios ni forma de incluirlos en tus reportes y por ende no puedes recibir crédito por el consumo que has influenciado.

### ¿Cómo puedo medir ese consumo de servicios de Azure que mi empresa (el partner) ha generado de manera indirecta?

Hay que __*marcar*__ la infraestructura desplegada en tus clientes, para hacerlo **debes desplegar esa infraestructura por medio de un _template ARM_** y en dicho template agregar algunos atributos que te permitan a ti y a Microsoft tener un adecuado seguimiento de los consumos de Azure derivados de esos servicios.

---

A continuación revisaremos cómo inyectar los atributos de seguimiento en un template ARM y dónde podemos seguimiento a dichos consumos.

* [Alerta de Privacidad](#alerta-de-privacidad)
* [Perfil de partner en el "Microsoft Partner Center"](#perfil-de-partner-en-el-quotmicrosoft-partner-centerquot)
* [Registrar el Guid en el Partner Center](#registrar-el-guid-en-el-partner-center)
* [Adicionar el Tracking Guid a los ARM](#adicionar-el-tracking-guid-a-los-arm)
* [Verificar el Tracking de Consumo en Reportes](#verificar-el-tracking-de-consumo-en-reportes)
* [Caso Real de implementación Habilitas](#caso-real-de-implementación-habilitas)
* [Notas importantes](#notas-importantes)


## Alerta de Privacidad

Los datos recolectados por Azure y la plataforma de Partners de esta manera son cobijados por las [políticas de privacidad de Microsoft](https://www.microsoft.com/trustcenter).

De igual manera, como partner, es tu responsabilidad notificar a tus clientes al respecto de que haces seguimiento de los consumos derivados de los consumos de servicios de tu aplicación.

## Perfil de partner en el "Microsoft Partner Center"

Lo se, parece un poco obvio pero es mejor aclararlo, este mecanismo esta diseñado para partners de Microsoft y para ser partner debes tener tu empresa registrada en el [Partner Center](https://partner.microsoft.com/), si aún no lo has hecho puedes iniciar [aquí tu registro como partner/ ISV](https://partner.microsoft.com/en-us/dashboard/account/v3/enrollment/introduction/azureisv).

## Generar un Guid para el seguimiento

Para realizar el tracking debes tener un Guid (Globally Unique Identifier) el cual debes asocial al template ARM y también en tu cuenta del Partner Center.

Hay 3 formas principales de crear este Guid

* Utilizando el [Formulario de generación de GUID](https://forms.office.com/Pages/ResponsePage.aspx?id=v4j5cvGGr0GRqy180BHbR3i8TQB_XnRAsV3-7XmQFpFUMVRVVFFLTDFLS0E2QzNYSkFZR1U3WVJCTSQlQCN0PWcu) : **Esta opción es la recomenda** aunque no es requerida.
* Usando PowerShell: Basta con ejecutar `New-Guid` y la consola nos devuelve un Guid con el formato requerido.

```posh
PS C:\> New-Guid
Guid
----
0352cf0f-2e7a-4aee-801d-7f27f8344c77
```

* Cualquier otro mecanismo con el que estés familiarizado siempre y cuando retorne un Guid con el formato requerido

## Registrar el Guid en el Partner Center

1. Una vez generado el Guid es necesario registrarlo en el Partner Center, para ello vamos a [Account Settings](https://partner.microsoft.com/en-us/dashboard/account/management) o siguiendo los pasos de la imagen (si, Developer Settings)

    ![Acceder a Account Settings](https://thepracticaldev.s3.amazonaws.com/i/fcjp6tyxrga6h4yihsxd.png)

1. Una vez allí hacemos scroll down hasta encontrar **Tracking GUIDs**

    ![Tracking GUIDs](https://thepracticaldev.s3.amazonaws.com/i/7y8c6nifr7w95a8mo3zn.png)

1. Damos click en "Add Tracking GUID" y diligenciamos el formulario con el Id generado en la sección anterior y una descripción. Puedes generar IDs por cliente, por ambiente, por aplicación, en escencia por cada cosa que desees, por eso es conveniente usar una descripción que se adapte a tus necesidades.

    ![Add Tracking GUID](https://thepracticaldev.s3.amazonaws.com/i/w2ezdgjm20xgp459v4uq.png)

1. Una vez hecho esto el Guid aparece en la lista, podemos agregar todos lo que se consideren necesarios.

## Adicionar el Tracking Guid a los ARM

Teniendo registrado el Guid en el Partner Center es hora de incluirlos en el/los template ARM que usaremos para desplegar la infraestructura.

Para ello lo que se hace es agregar un nuevo recursos a la lista y este recurso tiene nuestro Guid con el prefijo `pid-`.

1. Dentro del ARM ubicamos la sección de recursos que viene con esta estructura, usualmente entre el 1ro y el 3er miembro de la lista.

    ```json
    "resources": [
        {recurso 1...},
        {recurso 2...},
        {recurso N...}
    ]
    ```

1. Justo arriba del primer recurso adicionamos el siguiente recurso, fíjate en el atributo `"name"` allí encuentras el prefijo `pid-` seguido del Guid registrado en el Partner Center, en este caso `0352cf0f-2e7a-4aee-801d-7f27f8344c77`. Atentos con la `,` al final, es una lista de objetos JSON por lo que sino pones la `,` arruinarás la estructura.

    ```json
    {
        "apiVersion": "2018-02-01",
        "name": "pid-0352cf0f-2e7a-4aee-801d-7f27f8344c77",
        "type": "Microsoft.Resources/deployments",
        "properties": {
            "mode": "Incremental",
            "template": {
                "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
                "contentVersion": "1.0.0.0",
                "resources": [
                ]
            }
        }
    }
    ```

1. El archivo JSON queda más o menos así

    ```json
    ...
    "resources": [
        {
            "apiVersion": "2018-02-01",
            "name": "pid-0352cf0f-2e7a-4aee-801d-7f27f8344c77",
            "type": "Microsoft.Resources/deployments",
            "properties": {
                "mode": "Incremental",
                "template": {
                    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
                    "contentVersion": "1.0.0.0",
                    "resources": [
                    ]
            }
        }
    },
        {recurso 1...},
        {recurso 2...},
        {recurso N...}
    ],
    ...
    ```

---
Ahora es tiempo de hacer el despliegue ARM template y una vez hecho procedemos a verificar que los recursos hayan quedado marcados de correctamente.

## Verificar el Guid

1. Primero asegúrate de tener instalado el módulo de Azure para PowerShell, puedes instalarlo de cualquiera de estas formas según lo que requieras.

```posh
PS C:\> Install-Module -Name Az -AllowClobber -Scope CurrentUser
```

```posh
PS C:\> Install-Module -Name Az -AllowClobber -Scope AllUsers
```

1. Ahora asegúrate de tener en PowerShell iniciada la sesión en tu suscripción de Azure. Si manejas más de una suscripción debes hacer comandos adicionales que encuentras en la [documentación de Azure Power Shell](https://docs.microsoft.com/en-us/powershell/azure/?view=azps-2.8.0&viewFallbackFrom=azps-1.2.0).

```posh
PS C:\> ConnectAzAccount
```

1. Una vez instalado ya puedes verificar que los ítems hayan quedado marcados para tracking. Es sencillo ejecutando este script de PowerShell, mi recomendación es que lo guardes en un archivo `armtagverifier.ps1` y lo ejecutes por consola.

    ```posh
    Param(
        [GUID][Parameter(Mandatory=$true)]$guid,
        [string][Parameter(Mandatory=$true)]$resourceGroupName
    )

    # Get the correlationId of the pid deployment

    $correlationId = (Get-AzResourceGroupDeployment -ResourceGroupName $resourceGroupName `
                        -Name "pid-$guid").correlationId

    # Find all deployments with that correlationId

    $deployments = Get-AzResourceGroupDeployment -ResourceGroupName $resourceGroupName |
                    Where-Object{$_.correlationId -eq $correlationId}

    # Find all deploymentOperations in a deployment by name
    # PowerShell doesn't surface outputResources on the deployment
    # or correlationId on the deploymentOperation

    foreach ($deployment in $deployments){

    # Get deploymentOperations by deploymentName
    # then the resourceId for any create operation

        ($deployment |
            Get-AzResourceGroupDeploymentOperation |
            Where-Object { 
                $_.properties.provisioningOperation -eq "Create" `
                -and $_.properties.targetResource.resourceType -ne "Microsoft.Resources/deployments"
            }
        ).properties.targetResource.id

    }
    ```

1. Al ejecurtarlo te pedirá el Guid y el nombre del grupo de recursos en el que se realizó el despliegue.

    ```posh
    Supply values for the following parameters:
    guid: 0352cf0f-2e7a-4aee-801d-7f27f8344c77
    resourceGroupName: nombreResourceGroup
    ```

1. Y el resultado es una lista de los recursos que han quedado marcados con el despliegue

    ```posh
    /subscriptions/adcbda71-......uank/config/web
    /subscriptions/adcbda71-......uank/hostNameBindings/testjuank.azurewebsites.net
    /subscriptions/adcbda71-......uank
    ...
    ```

## Verificar el Tracking de Consumo en Reportes

Habiendo configurado el traking de consumo en el despliegue de infraestructura utilizando el Guid, la plataforma de Azure comienza a buscar correlación entre los datos de consumo de las suscripciones y los Guid registrados en la plataforma de partners.

1. Para visualizar dicha información hay que dirigirse al **Partner Center**, módulo de **MPN** y la opción de **Analize**. Es importante notar esto, ya que dependiendo el tipo de partner y los servicios que ofrezca tu empresa puedes tener otros módulos cada uno con su propia opción de **Analize**.

    ![Módulos de Analize en Partner Center](https://thepracticaldev.s3.amazonaws.com/i/7laak559gyq63y1oc9xy.png)

1. En el módulo de **Analize** vamos a **Cloud product Performance**

    ![Cloud product Performance](https://thepracticaldev.s3.amazonaws.com/i/3fqaaaig7l6hvicre0ah.png)

1. Allí vamos a la pestaña "Microsoft Azure" y en el combo "Partner Association Type" seleccionamos "Customer Usage Attribution". Allí ya podemos ver el resultado del consumo de Azure que hemos generado por cada tracking (Guid) que hemos registrado en el portal. El reporte se despliega en el dashboard.

    ![Dashboard de Reporte](https://thepracticaldev.s3.amazonaws.com/i/klfp8brakkxyek8pg8b2.png)

## Caso Real de implementación [Habilitas](http://habilitas.com/)

by [Juan Carlos Sosa](https://dev.to/jcgerarsr)


Como empresa nos enfocamos totalmente hacia el desarrollo orientado a la nube (Específicamente Microsoft Azure) mediante tecnologías Microsoft, nuestro ámbito principal es la generación de soluciones que se integran con las aplicaciones de línea de negocio de las compañías. Trabajamos bajo la modalidad software como servicio (SaaS), infraestructura como servicio (IaaS) y plataforma como servicio (PaaS), todo esto dependiendo de cada caso cubierto y de las especificaciones y restricciones que cada cliente pueda tener.

Con el tiempo hemos ido creciendo en cuanto a tecnologías y servicios que prestamos a los clientes, así como también en modalidades y niveles de servicio disponibles, todo esto ha implicado ir adaptándonos a requerimientos y políticas internas de cada organización, las cuales son cada vez más estrictas. Muchos de nuestros clientes hacen parte del sector financiero. 

Actualmente la evolución de la empresa nos ha impulsados a dos nuevos escenarios de cambio y adaptación:

### Escenario 1: Restricciones de negocio

En nuestros recientes proyectos hemos trabajado con entidades que requieren que sus servicios corran total o parcialmente en sus propias suscripciones de Azure, esto debido a que deben seguir algunas restricciones legales o de operación, relacionadas con la custodia de la infraestructura o los datos que recolectan.

Esto nos genera dificultades para rastrear el consumo que generan nuestras aplicaciones dado que todo el consumo que estamos influenciando se ha quedado sin tracking alguno, ni de nuestro lado ni del lado de Microsoft.

### Escenario 2: Delegación de control

En ocasiones los clientes quieren delegar el control de su infraestructura en el proveedor de la solución(nosotros) y en ocasiones requerimos delegar el control de dicha infraestructura en el cliente, por diversos motivos.

Actualmente contamos con infraestructura en la nube que está cubriendo las necesidades de nuestros clientes, aunque estos recursos actualmente se encuentran bajo nuestra cuenta de azure principal queremos reorganizarlos para permitirle al cliente tener el control de las mismas en sus propias suscripciones.
Aunque este escenario nos resulta conveniente - en la medida que delegamos el control de esa infraestructura - , no nos resulta tan favorable de cara a medir nuestro impacto como partner en el ecosistema.

### Remediación

En primer lugar: la implementación del tracking de consumo en las plantillas ARM nos proporcionará dos oportunidades de mejora: 

1. La posibilidad de organizar, automatizar y poder replicar a futuro nuestros despliegues mediante plantillas. Esta posibilidad de replicación nos permitirá tener despliegues más confiables y propiciará la exactitud de la replicación entre los diferentes ambientes a utilizar (en nuestro caso por lo general Desarrollo, QA y Producción).

1. Mediante la utilización de la plantilla ARM podremos adicionar el GUID para hacer tracking de nuestra solución. De esta forma tenemos visibilidad del acumulado de consumo de Azure de nuestra solución en Azure en nuestros clientes, lo cual a su vez nos permite tener mayor relevancia y oportunidades de beneficios dentro del programa de Partners de Microsoft.

---


## Notas importantes

Aunque esta funcionalidad es muy buena, no es perfecta y hay algunas restricciones que debes tener en cuenta

* Si haces un nuevo despliegue por ARM Template en el mismo grupo de recursos bien sea utilizando el mismo Guid o uno nuevo, el tracking anterior desaparece. Es decir siempre se tiene en cuenta solo el último despliegue.
* Si adicionas nuevos servicios al grupo de recursos estos servicios no se encontrarán marcados con el Guid, por lo que no puedes trackear el consumo de los nuevos servicios aunque estén en el mismo grupo de recursos.
* Debes tratar la infraestructura de tu aplicación como un todo, cada adición o eliminación de un servicio supone que hagas un nuevo despliegue. Esto podría ser engorroso por lo que te sugiero implementar "**Infraestructura como Código**" en tus pipeline de DevOps. Los templates ARM son una muy buena forma de hacerlo, pero cuentas con otras opciones como las API de ARM o Terraform.
* ⚠ Este blog post esta basado, en buena parte, en la documentación oficial de Microsoft: ["Azure partner customer usage attribution"](https://docs.microsoft.com/en-us/azure/marketplace/azure-partner-customer-usage-attribution)