Cambiare il percorso BLOB predefinitoChange a blob path from the default path

Quando il servizio StorSimple Data Manager trasforma i dati, per impostazione predefinita posiziona i BLOB trasformati in un contenitore di archiviazione, come specificato durante la creazione del repository di destinazione.When the StorSimple Data Manager service transforms the data, by default it places the transformed blobs in a storage container as specified during the creation of the target repository. Una volta collocati in questa posizione, è possibile spostare i BLOB in un percorso alternativo.As the blobs arrive at this location, you may want to move these blobs to an alternate location. Questo articolo illustra come impostare una funzione di Azure per rinominare un percorso di file BLOB predefinito e quindi spostare i BLOB in un altro percorso.This article describes how to set up an Azure function to rename a default blob file path and hence move the blobs to a different location.

PrerequisitiPrerequisites

Assicurarsi di disporre di una definizione di processo configurata correttamente nel servizio StorSimple Data Manager.Ensure that you have a correctly configured job definition in your StorSimple Data Manager service.

Creare una funzione di AzureCreate an Azure function

Per creare una funzione di Azure, seguire questa procedura:To create an Azure function, perform the following steps:

  1. Accedere al portale di Azure.Go to the Azure portal.

  2. Selezionare + Crea una risorsa.Click + Create a resource. Digitare App per le funzioni nella casella Cerca e premere INVIO.In the Search box, type Function App and press Enter. Selezionare e fare clic su App per le funzioni nell'elenco di applicazioni visualizzato.Select and click Function app in the list of apps displayed.

    Digitare "App per le funzioni" nella casella Cerca

  3. Fare clic su Crea.Click Create.

    Pulsante "Crea" della finestra App per le funzioni

  4. Nel pannello di configurazione App per le funzioni seguire questa procedura:On the Function App configuration blade, perform the following steps:

    1. Specificare un nome univoco per l'app.Provide a unique App name.
    2. Nell'elenco a discesa selezionare Sottoscrizione.From the dropdown list, select the Subscription. La sottoscrizione deve corrispondere a quella associata al servizio StorSimple Data Manager.This subscription should be the same as the one associated with your StorSimple Data Manager service.
    3. Selezionare il gruppo di risorse Crea nuovo.Select Create new resource group.
    4. Nell'elenco a discesa Piano di hosting selezionare Piano A consumo.For the Hosting Plan dropdown list, select Consumption Plan.
    5. Specificare un percorso in cui eseguire la funzione.Specify a location where your function runs. È possibile specificare la stessa area in cui si trovano il servizio StorSimple Data Manager e l'account di archiviazione associato alla definizione del processo.You want the same region where the StorSimple Data Manager service and the storage account associated with the job definition, are located.
    6. Selezionare un account di archiviazione esistente o crearne uno nuovo.Select an existing storage account or create a new storage account. Un account di archiviazione viene usato internamente per la funzione.A storage account is used internally for the function.

      Immettere i dati per la configurazione della nuova app per le funzioni

    7. Fare clic su Crea.Click Create. Verrà creata l'app per le funzioni.The function app is created.

      App per le funzioni creata

  5. Selezionare Funzioni e fare clic su + Nuova funzione.Select Functions, and click + New function.

    Fare clic su + Nuova funzione

  6. Selezionare il linguaggio di programmazione C#.Select C# for the language. Nella matrice di riquadri di modello selezionare C# nel riquadro QueueTrigger-CSharp.In the array of template tiles, select C# in the QueueTrigger-CSharp tile.

  7. In Queue trigger (Trigger della coda):In the Queue trigger:

    1. Immettere un nome per la funzione.Enter a Name for your function.
    2. Nella casella Nome coda digitare il nome della definizione del processo di trasformazione dei dati.In the Queue name box, type your data transformation job definition name.
    3. In Connessione dell'account di archiviazione fare clic su nuova.Under Storage account connection, click new. Nell'elenco di account di archiviazione selezionare l'account associato alla definizione del processo.From the list of storage accounts, select the account associated with your job definition. Prendere nota del nome della connessione (evidenziato).Make a note of the connection name (highlighted). Questo nome è necessario in seguito nella funzione di Azure.The name is required later in the Azure function.

      Creare una nuova funzione C#

    4. Fare clic su Crea.Click Create. La funzione è stata creata.The Function is created.

  8. Nella finestra Funzione eseguire il file con estensione csx.In the Function window, run .csx file.

    Creare una nuova funzione C#

    Eseguire i passaggi seguenti.Perform the following steps.

    1. Incollare il codice seguente:Paste the following code:

      using System;
      using System.Configuration;
      using Microsoft.WindowsAzure.Storage.Blob;
      using Microsoft.WindowsAzure.Storage.Queue;
      using Microsoft.WindowsAzure.Storage;
      using System.Collections.Generic;
      using System.Linq;
      
      public static void Run(QueueItem myQueueItem, TraceWriter log)
      {
          CloudStorageAccount storageAccount = CloudStorageAccount.Parse(ConfigurationManager.AppSettings["STORAGE_CONNECTIONNAME"]);
      
          string storageAccUriEndswith = "windows.net/";
          string uri = myQueueItem.TargetLocation.Replace("%20", " ");
          log.Info($"Blob Uri: {uri}");
      
          // Remove storage account uri string
          uri = uri.Substring(uri.IndexOf(storageAccUriEndswith) + storageAccUriEndswith.Length);
      
          string containerName = uri.Substring(0, uri.IndexOf("/")); 
      
          // Remove container name string
          uri = uri.Substring(containerName.Length + 1);
      
          // Current blob path
          string blobName = uri; 
      
          string volumeName = uri.Substring(containerName.Length + 1);
          volumeName = uri.Substring(0, uri.IndexOf("/"));
      
          // Remove volume name string
          uri = uri.Substring(volumeName.Length + 1);
      
          string newContainerName = uri.Substring(0, uri.IndexOf("/")).ToLower();
          string newBlobName = uri.Substring(newContainerName.Length + 1);
      
          log.Info($"Container name: {containerName}");
          log.Info($"Volume name: {volumeName}");
          log.Info($"New container name: {newContainerName}");
      
          log.Info($"Blob name: {blobName}");
          log.Info($"New blob name: {newBlobName}");
      
          // Create the blob client.
          CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
      
          // Container reference
          CloudBlobContainer container = blobClient.GetContainerReference(containerName);
          CloudBlobContainer newContainer = blobClient.GetContainerReference(newContainerName);
          newContainer.CreateIfNotExists();
      
          if(!container.Exists())
          {
              log.Info($"Container - {containerName} not exists");
              return;
          }
      
          if(!newContainer.Exists())
          {
              log.Info($"Container - {newContainerName} not exists");
              return;
          }
      
          CloudBlockBlob blob = container.GetBlockBlobReference(blobName);
          if (!blob.Exists())
          {
              // Skip to copy the blob to new container, if source blob doesn't exist
              log.Info($"The specified blob does not exist.");
              log.Info($"Blob Uri: {blob.Uri}");
              return;
          }
      
          CloudBlockBlob blobCopy = newContainer.GetBlockBlobReference(newBlobName);
          if (!blobCopy.Exists())
          {
              blobCopy.StartCopy(blob);
              // Delete old blob, after copy to new container
              blob.DeleteIfExists();
              log.Info($"Blob file path renamed completed successfully");
          }
          else
          {
              log.Info($"Blob file path renamed already done");
              // Delete old blob, if already exists.
              blob.DeleteIfExists();
          }
      }
      
      public class QueueItem
      {
          public string SourceLocation {get;set;}
          public long SizeInBytes {get;set;}
          public string Status {get;set;}
          public string JobID {get;set;}
          public string TargetLocation {get; set;}
      }
      
    2. Sostituire STORAGE_CONNECTIONNAME nella riga 11 con il nome della connessione all'account di archiviazione (vedere il punto 7c).Replace STORAGE_CONNECTIONNAME on line 11 with your storage account connection (refer step 7c).

      Copiare il nome della connessione di archiviazione

    3. Salvare la funzione.Save the function.

      Salvare la funzione

  9. Per completare la funzione, aggiungere un altro file seguendo questa procedura:To complete the function, add one more file by doing the following steps:

    1. Fare clic su Visualizza file.Click View files.

      Collegamento "Visualizza file"

    2. Fare clic su + Aggiungi.Click + Add.

      Collegamento "Visualizza file"

    3. Digitare project.json e quindi premere INVIO.Type project.json, and then press Enter. Incollare il codice seguente nel file project.json:In the project.json file, paste the following code:

      {
      "frameworks": {
          "net46":{
          "dependencies": {
              "windowsazure.storage": "8.1.1"
          }
          }
      }
      }
      
    4. Fare clic su Save.Click Save.

      Collegamento "Visualizza file"

È stata creata una funzione di Azure.You have created an Azure function. Questa funzione viene attivata ogni volta che il processo di trasformazione dei dati genera un nuovo BLOB.This function is triggered each time a new blob is generated by the data transformation job.

Passaggi successiviNext steps

Usare l'interfaccia utente di StorSimple Data Manager per la trasformazione dei datiUse StorSimple Data Manager UI to transform your data