韩源,资深工程师,存储和灾备专家。

最近遇到几个客户都有在 Azure 上存取文件的需求。当然,可以通过在 Azure 里建立虚机并配置虚机相关的文件访问服务如 ftp、nfs、http 等来解决,但是配置复杂,还需要考虑网络、HA 等因素。而 Azure 本身提供了较为丰富的存储服务,可以满足大部分用户一般的文件存储访问需求。

通常,Azure 提供了两种文件存储服务:File 和 Blob。File 提供 smb2.1 和 smb3 访问,对于基于 internet 的文件访问,我们就要使用 Blob 了。

下边,简单探讨一下 Blob 的文件访问操作。

准备工作

对 Azure 的存储进行操作常用两个工具:Azure Storage Explorer(Windows & Mac & Linux)及 Azcopy(Windows & Linux)。今天的介绍主要针对 Windows 平台。

所有相关工具均可从如下网页下载:

工具下载

Azure Storage Explorer 的安装配置

Azure Storage Explorer 下载地址如下:

Azure Storage Explorer

Azure Storage Explorer 的安装比较简单,下载下来的安装程序一路 Next 即可。

安装完成后,进入如下界面:

 

可以看到,登录 Azure Storage Explorer 有三种方式:

  • Azure Accout
  • SAS URI
  • storage account name and key

先用 Azure Account 的方式登录,下拉 Azure environment,选择合适登录环境,使用 21v 运营的 Azure 当然是 Azure China, 然后点击 Sign in:

 

 

输入 Azure 的账号密码登录,即可看到当前账户下的 Storage 情况:

 

如果想管理多个账号的存储,可以点击左边栏上部的人像,然后添加更多 Azure Account 或者删除账号:

 

Azcopy 的安装配置

Azcopy 下载地址如下:

Azcopy

同样傻瓜式的安装方式,一路 Next 即可。

安装完成后,菜单里多出一项 Microsoft Azure Storage command line:

 

 

 

 

 

 

 

运行后出来 cmd 窗口,可运行 azcopy 命令:

 

其实直接在 windows 下的 cmd 窗口也可执行 azcopy,但是由于环境变量没有配置对应路径,所以找不到 azcopy 命令,可进入对应目录执行,或将路径添加到环境变量里:

 

Azure Blob Storage 配置

Blob 存储的具体介绍可以参见 azure.cn 的相关文档,简单描述如下:

 

  • accountname 表示 Azure 存储账号下的资源即 Storage Account ,全局唯一。
  • core.chinacloudapi.cn 表示 azure china blob 存储资源,是固定的。
  • containername 表示容器的名字,可以认为是访问某一文件夹下的资源。
  • blobname 表示要访问的资源名称,可以认为是一个 mp3 文件,或者是一个 jpg 文件。

可以看到,配置的基本过程就是创建 Storage Account —添加 Container。下边以 ARM 方式演示:

通过 web 浏览器打开 portal.azure.cn 登录 Azure,通过左侧菜单栏选择存储账户 (Storage Accout):

 

点击添加创建一个新的 Storage Account:

 

红色部分为必填项,其中:

  • 名称: 在 cn 需要全局唯一,所以不能重复(全部小写字母和数字)
  • 部署模型:保持默认的 Resource Manager
  • 账户类型:保持默认的常规用途
  • 性能:保持默认的标准
  • 复制:这是对数据安全的选项,测试时选择 LRS 即可
  • 订阅:保持默认即可
  • 资源组:根据实际情况可新建也可使用现有项
  • 位置:随便选择东部和北部都可

点击每项右上角的!可以看到该项的介绍。

实际配置如下:

 

点击创建,创建新的 Storage Account,创建完成后在 Storage Account 刷新,可以看到新的 Storage Account,点击进入:

 

可以看到,在一个 Storage Account 下,可以有4种类型的存储。点击 Blob,进入 Blob 存储可以添加容器:

进入添加容器的界面,比较简单,只需要给容器一个名字,并选择访问类型即可:

访问类型有三种:

  • 专用:只有 Storage Account 的所有者有权限访问容器及其 Blob
  • Blob:匿名用户可以读取 Blob,但无法枚举容器里的 Blob(可以访问指定的 Blob,但无法列出所有的 Blob)
  • 容器:匿名用户可以读取 Blob,并枚举容器里的 Blob

依次创建容器 condemo01,并设置访问类型为专用;condemo02,访问类型 Blob;condemo03,访问类型容器:

进入 condmo01,看到此界面里可以上传文件、删除该容器、查看属性,修改访问属性(专用、Blob、容器间相互转换)。点击上传,出现文件上传界面:

在此可以选择一个文件上传,上传类型保持块 blob,块大小保持默认即可:

 

此处上传几个图片文件做测试:

 

点击一个文件,可以看到相关属性,其中有该文件的 URL:

 

但是在浏览器输入该 URL 却无法打开,原因就是 condmo01 的访问策略是专用,里边的 Blob 无法被匿名访问。

而放入 condmo02 和 condmo03 的文件,其 URL 可以通过浏览器打开,因为 Blob 和容器的访问策略都允许用户打开 Blob。

在属性界面里还可以下下载该文件。

所以如果只是简单的文件上传下载操作,通过 web 在 ARM 里即可完成了。

Azure Storage Explorer

Azure Storage Explorer 是 MS 提供的一个很好的图形化客户界面,通过树状结构可以很好的对 Azure Storage 进行管理,包括创建目录,基本文件操作(上传下载删除)、重命名、快照、获取文件 URL 等:

 

前边介绍了通过 Azure Account 登录 Azure Storage Explorer,但有时候并不希望 Azure Storage 用户知道账号,这时候就需要 Storage Account Name & Key 和 SAS 的登录方式了。

Storage Account Name & Key

在 ARM -存储账号里选择需要操作的存储账号,选择访问密码就可以看到该 Storage Account 的名称和密钥(key 有两个,随便复制一个):

 

打开 Storage Account Explorer,点击左边栏上部的插头图标(Add Account),选择最后一项:

 

将 Storage Account 的 name 和 key 填入并选择合适的 EndPoint:

 

连接后即可看到在 Storage Account 里多出了需要访问的 Storage Account,可实现无需 Azure Account 的访问:

 

SAS(Shared Access Signature)

Srorage Account Name&Key 的方式客户会获得该 Storage Account 的所有权限,存在一定的管理风险,如果想做比较细化的管理,例如可访问什么样的资源、读写等权限分配、允许哪些 IP 访问、访问的时效性等,就需要使用 SAS 的方式了。

还是进入需要访问的 Storage Account,点击访问共享签名,这里就可以根据需求详细定制各种权限,然后生成 SAS,可根据需要复制整个 Storage Account 的 SAS 标记或某种服务的 URL(起始时间的需要要注意时区):

 

还是在 Azure Storage Explorer 的 Add Account 界面,选择第二项:

 

将 URL 填入:

 

连接后即可看到添加的资源(注意:和 Storage Account Name & Key 的方式相比,Storage Account 后边多出了一个 SAS,表示是通过 SAS 方式添加的账号):

 

再进一步细化,如果客户不希望把整个 Storage 服务暴露给使用者,而是制定某一个容器,例如 User01 只能看到 condemo01,而不知道还有其他容器,怎么办?这时候就要用到基于容器的 SAS 了。

以 Azure Acount 的方式登录到 Azure Storage Explorer,进入相应的 Storage Account-Blob,右键点击需要管理的容器,选择 Get Shared Access Signature:

 

在弹出窗口中可以为该容器配置访问权限并生成 SAS:

 

 

同样方式将 SAS 添加到 Azure Storage Explorer,即可看到该资源,而其他容器无法看到也无法访问:

 

Azcopy

Web ARM 和 Azure Storage Explorer 提供了直观的图形化方式进行文件管理,但很多场景客户需要自动化操作,例如定期将数据库或文件的备份到 Azure,收集的文档资料自动上传等。这时候,Azcopy 为我们提供了一个很好的方案。

是一个 Windows 命令行实用程序,专用于使用具有优化性能的简单命令将数据复制到 Azure Blob、文件和表存储以及从这些位置复制数据。可在存储帐户中将数据从一个对象复制到另一个对象,或者在存储帐户之间复制。

Azcopy 的语法很简单:

AzCopy /Source: /Dest: [Options]

例如需要把之前所建容器 condemo03 的文件 1.jpg 下载到本地 C:\Temp 下,如下执行即可:

 

注意:文件名不是跟在 source 的路径里,而是要用参数 Pattern 列出。

如果要下载 condemo03 的所有文件,如下:

 

其中 /S 参数表示递归方式遍历所有文件(包含目录),/Y 表示取消确认提示(否则此处会提示是否覆盖文件)

同样的操作在 condemo02 上执行:

 

可以看到对指定文件执行成功,但是对整个容器却失败了。原因很简单,condemo 的访问策略是 Blob,匿名访问可以访问容器内单个 Blob,而不能遍历容器,所以无法查找该容器下所有文件导致下载失败;而 condemo 的访问策略是容器,匿名访问不仅可访问单个 Blob,而且可以遍历容器。

再对 condemo01 同样操作:

 

即使单个文件也不成功,因为其访问策略是专用,无法匿名访问。

对于有访问策略的容器如何处理?同样可以使用 key 或 SAS 的方式:

使用 condemo01 测试:

 

可以看到无论用 key 还是 sas 均可正常下载。

如果是上传,只需将 source 和 dest 交换,不过要注意 sourcekey 和 destkey 需要换成 destkey 和 destsas:

 

可以看到 condemo01 多出了一个文件 2.jpg:

Azcopy 功能非常强大,详细介绍可以参见:

 

Azcopy 介绍

合理的配置 Azcopy,结合 windows 下的计划任务或者 Linux 下的 Crontab,可实现工作的自动化,大大减轻运维工作

总结

Azure 的文件操作有很多方式,例如 AzureCli、PowerShell、RestAPI 等,也有很多三方工具:

本文简单介绍了一些基本操作,希望对各位有帮助。