你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

更改默认的 blob 路径

当 StorSimple 数据管理器服务转换数据时,默认情况下,它会将转换后的 blob 放置在创建目标存储库期间指定的存储容器中。 blob 到达此位置时,可能需要将这些 blob 移动到备用位置。 本文介绍如何设置 Azure 函数以重命名默认 blob 文件路径,从而将 blob 移动到不同的位置。

先决条件

确保 StorSimple 数据管理器服务中具有正确配置的作业定义。

创建 Azure 函数

要创建 Azure 函数,请执行下列步骤:

  1. 转到 Azure 门户

  2. 单击“+ 创建资源”。 在“搜索”框中,输入“Function App”,并按 Enter。 在显示的应用列表中,选中并单击“Function App”

    Type

  3. 单击“创建”。

    The Function App window

  4. 在“Function App”配置边栏选项卡中,执行以下步骤:

    1. 提供一个唯一的应用名称

    2. 从下拉列表中,选择“订阅”。 此订阅应与和 StorSimple 数据管理器服务关联的订阅相同。

    3. 选择“新建”资源组。

    4. 在“托管计划”下拉列表中,选择“使用计划”

    5. 指定函数运行的位置。 需要选择 StorSimple 数据管理器服务以及与作业定义相关联的存储帐户所在区域。

    6. 选择一个现有存储帐户,或创建一个新的存储帐户。 函数在内部使用一个存储帐户。

      Enter new Function App configuration data

    7. 单击“创建”。 随即创建函数应用。

      Function App created

  5. 选择函数,然后单击+ 新建函数

    Click + New function

  6. 对于语言,选择“C#”。 在模板磁贴数组的“QueueTrigger-CSharp”磁贴中,选择“C#”

  7. 在“队列触发器”中:

    1. 输入函数的名称

    2. 在“队列名称”框中,输入数据转换作业定义名称。

    3. 在“存储帐户连接”下,单击“新建”。 从存储帐户列表中,选择与你的作业定义关联的帐户。 记下连接名称(已突出显示)。 稍后在 Azure 函数中需要该名称。

      Create a new C# function

    4. 单击“创建”。 随即创建函数

  8. 在“函数”窗口中,运行 .csx 文件。

    Create a new C# function 2

    执行以下步骤。

    1. 粘贴以下代码:

      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. 将第 11 行中的 STORAGE_CONNECTIONNAME 替换为存储帐户连接(参考步骤 7c)。

      Copy storage connection name

    3. “保存”函数。

      Save function

  9. 若要完成函数,请通过执行以下步骤来添加一个或多个文件:

    1. 单击“查看文件”

      The

    2. 单击“+ 添加”。

      Add new function add file

    3. 输入“project.json”,并按 Enter。 在 project.json 文件中,粘贴以下代码:

      {
      "frameworks": {
          "net46":{
          "dependencies": {
              "windowsazure.storage": "8.1.1"
          }
          }
      }
      }
      
      
    4. 单击“保存”。

      New function project json

已创建 Azure 函数。 数据转换作业每次生成新 blob 时,都会触发此函数。

后续步骤

使用 StorSimple Data Manager UI 转换数据