El esfuerzo que Microsoft está invirtiendo en sus Sdks de conexión a Azure es notable. La API Rest de Azure permite gestionar ya casi cada componente y servicio en tu suscripción. Utilizar una API Rest no es cosa sencilla, por esta razón Microsoft nos da varias herramientas para agilizar este proceso: Azure VS Tools, Azure PowerShell, Azure CLI.
Estas herramientas no se pueden utilizar desde una aplicación. Hoy veremos cómo será posible crear una aplicación para gestionar una suscripción mediante las Azure Management Libraries (MAML).
Qué son las MAML
Las librerías de gestión son un wrapper sobre la API REST de gestión de Azure y existen para diferentes lenguajes. Encapsulan las llamadas a los endpoints de la API REST de gestión de Azure, utilizando clases de utilidad y estructuras de datos tipificadas, simplificando el proceso de gestión de esta a través de código, en este caso C#.
Ejemplo
Para empezar tenemos que crear un nuevo proyecto tipo Consola, ya que es sencillo y nos permite centrarnos en el ejemplo. El target framework puede ser 0 ó superior, en mi caso 4.6.2
Una vez creado el proyecto tenemos que añadir con Nuget las librerías necesarias: Microsoft Azure Management Libraries (MALM) y Active Directory Authentication Library (ADAL).
Una vez instaladas estas librerías hay que actualizar las dependencias: cada libraría de gestión se libera por sí misma, así que hará varias actualizaciones. Ahora estamos listos para preparar nuestro entorno.
Autorizar la app
Lo primero que tenemos hacer es autorizar esta misma aplicación a acceder a nuestra suscripción, por esto necesitamos añadirla en Azure AD.
En el Portal de gestión de Azure, en el blade de Azure AD añadimos nuestra app.
Con esta operación estamos autentificando nuestra app para poder acceder a nuestra suscripción, ahora tenemos que autorizarla a acceder a los servicios que nos interesan. El primer ‘rol’ ya está configurado, es el acceso a Azure Ad para poder acreditar la app. Para añadir el acceso a las API de gestión es necesario activar estos permisos:

Una vez se abre el blade de permisos seleccionar:

Acceso a Azure
Ahora que tenemos la aplicación que puede delegar el permiso de gestionar la suscripción lo que queremos es identificar el usuario, que el mismo tenga acceso a esta suscripción.
Por esto utilizaremos ADAL, desde una aplicación nativa la forma de pedir la autorización es utilizando este parámetro, notar el uso de null y no de un boolean como esperado: new PlatformParameters(PromptBehavior.Auto, null):
AuthenticationResult result = null;
var context = new AuthenticationContext(string.Format(
ConfigurationManager.AppSettings[«login»],
ConfigurationManager.AppSettings[«tenantId»]));
result = context.AcquireTokenAsync(
ConfigurationManager.AppSettings[«apiEndpoint»],
ConfigurationManager.AppSettings[«appId»],
new Uri(ConfigurationManager.AppSettings[«redirectUri»]),
new PlatformParameters(PromptBehavior.Auto, null)).Result;
return result.AccessToken;
Con esta autorización es posible obtener el token a enviar en las llamadas: var creadentials= new TokenCloudCredentials(subscripcionId, token);
Creando recursos
El primer paso es crear el grupo de recursos a que todo estará asociado:
var resourceGroup = new ResourceGroup { Location = LocationNames.WestEurope };
var result = this.resourceManager.ResourceGroups.CreateOrUpdateAsync(resourceName,
resourceGroup).Result;
Ahora es posible crear un AVset:
using (var computeClient = new ComputeManagementClient(credentials) { SubscriptionId = subscriptionId })
{
var res = await computeClient.AvailabilitySets.CreateOrUpdateAsync(
resourcegroupName,
availabilitysetName,
new AvailabilitySet()
{
Location = LocationNames.WestEurope
}
).ConfigureAwait(false);
}
O crear una storage account:
using (var storageClient = new StorageManagementClient(credentials) { SubscriptionId =
this.subscriptionId })
{
await storageClient.StorageAccounts.CreateAsync(
resourceName,
storageName,
new StorageAccountCreateParameters
{
Sku = new Sku() { Name = SkuName.StandardLRS },
Kind = Kind.Storage,
Location = LocationNames.WestEurope
}).ConfigureAwait(false);
}
También es posible configurar networks:
using (var networkManagementClient = new NetworkManagementClient(this.credentials) {
SubscriptionId = this.subscriptionId })
{
var publicIP = await networkManagementClient.PublicIPAddresses.CreateOrUpdateAsync(
groupName,
ipName,
new PublicIPAddress
{
Location = LocationNames.WestEurope,
PublicIPAllocationMethod = «Dynamic»
}
).ConfigureAwait(false);
var subnet = new Subnet
{
Name = subnetName,
AddressPrefix = «192.168.0.0/24»
};
var address = new AddressSpace
{
AddressPrefixes = new List<string> { «192.168.0.0/16» }
};
var vnet = await networkManagementClient.VirtualNetworks.CreateOrUpdateAsync(
groupName,
vnetName,
new VirtualNetwork
{
Location = LocationNames.WestEurope,
AddressSpace = address,
Subnets = new List<Subnet> { subnet }
}
).ConfigureAwait(false);
}
Consideraciones
Las librerías pueden gestionar todo tipo de servicio en Azure: creación, eliminación provisión de servicios, configuración de ellos. Todo lo que es posible hacer por portal o plantillas es posible también con las librerías.
Se pueden utilizar como visto desde una aplicación, por ejemplo un portal de auto-aprovisionamiento para tus empleados o clientes.
Otro uso posible, sobre todo para desarrolladores, es construir un entorno desde un simple exe, de esta forma poder crear a petición un entorno según proyecto. Más aún, es posible utilizarlo desde una tarea de MsBuild y así crear en fase de build el entorno si no existe.
El ejemplo completo de este código se encuentra en: https://github.com/robertoenbarcelona/AzureManagmentLibrariesExamples
Si quieres saber todo lo que puede hacer SOGETI bajo tecnología Microsoft, visita nuestra web.
Roberto Grassi
. NET Senior Architect and Mobile Lead | Soluciones Microsoft | SOGETI ESPAÑA
Pingback: API Management para todos – itblogsogeti