Blob简单文件操作

这几天遇到几个客户都有在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即可。

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

mark

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

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

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

mark

mark

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

mark

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

mark

Azcopy的安装配置

Azcopy下载地址如下:

Azcopy

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

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

mark

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

mark

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

mark

Azure Blob Storage配置

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

mark

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

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

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

mark

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

mark

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

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

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

实际配置如下:

mark

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

mark

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

mark

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

mark

访问类型有三种:

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

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

mark

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

mark

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

mark

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

mark

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

mark

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

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

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

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

Azure Storage Explorer

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

mark

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

Storage Account Name & Key

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

mark

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

mark

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

mark

mark

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

mark

SAS(Shared Access Signature)

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

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

mark

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

mark

将URL填入:

mark

mark

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

mark

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

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

mark

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

mark

mark

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

mark

Azcopy

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

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

Azcopy的语法很简单:

1
AzCopy /Source:<source> /Dest:<destination> [Options]

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

mark

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

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

mark

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

同样的操作在condemo02上执行:

mark

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

再对condemo01同样操作:

mark

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

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

mark

使用condemo01测试:

mark

mark

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

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

mark

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

mark

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

Azcopy介绍

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

总结

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

mark

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