Virtual harddrives kan je vrij eenvoudig in een rotatie van snaphots steken. Maar een backup van een blob container (of objecten) is dit niet.
In deze post wordt stap per stap uitgelegd hoe je bij het uploaden van een bestand in een blob container automatisch een backup kan maken in een andere blob container (best in een andere resource group).
Opstelling:
resource group RGA met een Storage Account SAA, waarin we een blobcontainer hebben BCA. Hierin gaan we bestanden uploaden die we automatisch willen kopieren in Resource group RGB onder een Storage Account SAB. Om het eenduidig te maken gaan we die zetten in een blobcontainer BCB.
Een Azure Function App
Begin met het maken van een Function App. Dit is een verzameling waar je meerdere functie kan in opbergen.
Alles wat we nodig hebben kan vanuit de portal van Azure. Start je browser en log in op https://portal.azure.com
Maak een resource + > Compute > Function App
resource: SGABackup
-> resource group: backup
-> nieuwe resource
-> Hosting plan: Consumption Plan
-> Location: West Europe
-> Runtime Stack: .Net
-> Storage Account: SAA
De resource die we hebben aangemaakt moet je een naam geven. Op zich speelt dit niet veel geen rol. Belangrijk is in welke resource group je dit bewaard. Maar het allerbelangrijkste is de laatste parameter Storage Account. Deze definieert voor welke Storage Account er functies zullen gemaakt worden.
Maak de Blob storage triggered function
Ga naar de Function resource die je net hebt aangemaakt. Dit kan wel een eindje duren voordat je die ziet. Misschien best naar ‘All Resources’ gaan
All resources > SGABackup (deze met icoontje van een functie = bliksemschicht. Insights werd ook aangemaakt maar die hebben we voorlopg niet nodig)
Klik vervolgens op het + icoon (om een nieuwe functie te maken)
Kies ‘In-portal’ -> More templates -> Finish and view templates (wanneer je reeds functies heb gemaakt zal deze stap overgeslagen worden)
Selecteer Azure Blob Storage Trigger
De eerste keer krijg je de melding dat de Extentie niet is geinstalleerd: Microsoft.Azure.WebJobs.Extensions.Storage
Installeer dit; dit zal een twee-tal minuten duren.
Vervolgens krijg je een voorstel die we wat gaan aanpassen
Naam: BlobTrigger1 –> BackupA
Path: samples-workitems/{name} –> BCA/{name}
Storage Account connection: AzureWebJobsStorage
Submit dit. Je hebt nu zojuist je trigger gemaakt. Hierachter zit reeds een functie, die op dit moment slechts een log (Information) zet.
Voorlopige test
Ja kan nu testen door een bestand te uploaden in die container onder BCA
In de azure portal bij de functie staat een link naar ‘Monitor’; daar zal de log bij komen.
Script voor het kopiëren
Pas run.csx aan.
Want we willen een copy maken van BCA/name naar een andere container/BCB
public static void Run(Stream myBlob, string name, ILogger log)
{
log.LogInformation($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Length} Bytes");
}
r "Microsoft.WindowsAzure.Storage"
using System;
using System.IO;
using Microsoft.Azure;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Blob;
public async static void Run(Stream myBlob, string name, ILogger log)
{
await CopyBlob(myBlob, name, log);
}
private async static Task CopyBlob(Stream myBlob, string name, ILogger log)
{
// We gaan copieren naar SAB in dir BSB
var key = "de key van je SAB";
var connectionString = $"De connectiestring van SAB";
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);
// Maak de blob client naar waar we gaan kopieren
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference("BCB");
try {
await container.CreateIfNotExistsAsync();
} catch(Exception e) {
log.LogError(e, "Container could not be made");
}
CloudBlockBlob blockBlob = container.GetBlockBlobReference(name);
try{
await blockBlob.UploadFromStreamAsync(myBlob);
} catch(Exception ex){
log.LogError(ex, "Backup of file {name} failed");
}
}
Er zijn libraries nodig die moeten geladen worden.
Naast de editor is er (initieel) verticaal een balk met oa ‘View Files’
Voeg langs die weg een nieuw bestand toe ‘project.json’
{
"frameworks": {
"net46":{
"dependencies": {
"WindowsAzure.Storage": "7.0.0"
}
}
}
}
Finale test
Ga met de Azure Storage Exlporer naar SAA>BSA en copieer daar een bestandsnaam
Ga terug naar de run.csx editor. Rechts hiervan zie je (nu) view files, alwaar je het project.json bestand had aangemaakt, maar daar staat ook ‘Test’
Voer hier in: BSA/naamvaneenbestand
Klik nu op ‘run’ en kijk in de console wat je hebt van resultaat