Recentemente il team Azure SDK ha rilasciato la prima versione stabile delle librerie per la gestione delle risorse.
Raccolte sotto lo spazio dei nomi Azure.ResourceManager queste librerie andranno a sostituire tutte quelle attualmente presenti nello spazio dei nomi Microsoft.Azure.Management e a differenza delle precedenti saranno suddivide per servizio.

Differenze con Bicep e ARM templates.

Se hai avuto modo di approvvigionare risorse Azure mediante uno di questi due pseudo-linguaggi hai sfruttato gli endpoint REST della risorsa deployments per la creazione dell’infrastruttura richiesta mediante il passaggio di un template in formato JSON strutturato e validato da un JSON Schema.

Le ragioni per cui prendere in considerazione l’utilizzo dei template sono innumerevoli, oltre l’integrazione con Visual Studio Code e Visual Studio è possibile distribuire le risorse ottenendo risultati ripetibili, mantenere uno storico delle distribuzioni e valutare la conformità agli standard aziendali attraverso i criteri di Azure.

Azure.ResourceManager.Resources non implementa “nativamente” questo concetto ma comunque ne consente l’utilizzo in quanto attraverso la classe ArmDeploymentCollection abbiamo modo operare sugli stessi endpoint REST utilizzati da Bicep e ARM templates.

Creare una nuova distribuzione.

Per ottenere una nuova distribuzione dobbiamo dotarci di un ArmClient passandogli un auth token con TokenCredential.

1
2
3
using Azure.Identity; using Azure.ResourceManager;  
  
ArmClient client = new ArmClient(new DefaultAzureCredential());

Che ci consentirà di accedere alla sottoscrizione predefinita, in base alle credenziali fornite, con await client.GetDefaultSubscriptionAsync() oppure all’ambito desiderato creando un identificativo della risorsa di interesse con ResourceIdentifier e passandolo ad uno dei metodi client.GetSubscriptionResource(id) o client.GetManagementGroupResource(id) o ancora client.GetResourceGroupResource(id).

Ad esempio:

1
2
3
4
var id = ManagementGroupResource.CreateResourceIdentifier("MY_MNGM_GROUP");  
var managementGroup = client.GetManagementGroupResource(id);  
  
ArmDeploymentCollection deploymentCollection = managementGroup.GetArmDeployments();

Non ci resta che creare un’istanza di ArmDeploymentContent al quale possiamo passare il link ad un template esistente

1
2
3
4
5
6
7
var deployment = new ArmDeploymentContent(new ArmDeploymentProperties(ArmDeploymentMode.Incremental)
{
  TemplateLink = new ArmDeploymentTemplateLink  
  {  
    Uri = new Uri("https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/emptyrg.json")  
  },  
});

oppure utilizzare la proprietà Template per definire uno nostro.
In questo caso sarà necessario costruire un oggetto di tipo BinaryData che rappresenti un JSON valido, ad esempio serializzando un dizionario.

1
2
3
4
5
6
7
8
9
var emptyDeployment = new Dictionary<string, object>();  
emptyDeployment.Add("$schema", "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#");  
emptyDeployment.Add("contentVersion", "1.0.0.0");  
emptyDeployment.Add("resources", Array.Empty<object>());  
  
var deployment = new ArmDeploymentContent(new ArmDeploymentProperties(ArmDeploymentMode.Incremental)  
{  
  Template = BinaryData.FromObjectAsJson(emptyDeployment)  
});

E successivamente effettuare la chiamata al metodo CreateOrUpdate per ottenere lo scopo.

1
2
3
4
deploymentCollection.CreateOrUpdate(
  deploymentName: Guid.NewGuid().ToString(),
  content: deployment,  
  waitUntil: WaitUntil.Started);

Riferimenti utili.