这几天遇到几个客户都有在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的安装比较简单,下载下来的安装程序一路Next即可。
安装完成后,进入如下界面:
可以看到,登录Azure Storage Explorer有三种方式:
- Azure Accout
- SAS URI
- storage account name and key
下边,先用Azure Accout的方式登录,下拉Azure environment,选择合适登录环境,使用21v运营的Azure当然是Azure China,然后点击Sign in:
输入Azure的账号密码登录,即可看到当前账户下的Storage情况:
如果想管理多个账号的存储,可以点击左边栏上部的人像,然后添加更多Azure Account或者删除账号:
Azcopy的安装配置
Azcopy下载地址如下:
同样傻瓜式的安装方式,一路Next即可。
安装完成后,菜单里多出一项Microsoft Azure Storage command line:
运行后出来cmd窗口,可运行azcopy命令:
其实直接在windows下的cmd窗口也可执行azcopy,但是由于环境变量没有配置对应路径,所以找不到azcopy命令,可进入对应目录执行,或将路径添加到环境变量里:
Azure Blob Storage配置
Blob存储的具体介绍可以参见azure.cn的相关文档,简单描述如下:
- 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):
点击添加创建一个新的Storage Account:
红色部分为必填项,其中:
- 名称: 在Azure.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的语法很简单:
1 | AzCopy /Source:<source> /Dest:<destination> [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,结合windows下的计划任务或者Linux下的Crontab,可实现工作的自动化,大大减轻运维工作
总结
Azure的文件操作有很多方式,例如AzureCli、PowerShell、RestAPI等,也有很多三方工具:
本文简单介绍了一些基本操作,希望对各位工作有帮助。