扩展函数的磁盘存储空间
概述
FuncitonGraph提供了文件系统挂载功能,多个函数可以通过共用一个文件系统,实现文件共享。相比于对单个函数实例分配的临时磁盘空间限制,可以极大扩展函数的执行和存储空间。
场景介绍
使用磁盘挂载功能需要开放如下端口:
- 111、445、2049、2051、2052、20048。
- 对于Ubuntu系统还需再开放3个端口,获取方式请在任意目录下执行如下命令。
rpcinfo -p|grep mountd|grep tcp
具体请参见弹性文件服务会占用用户的哪些资源。
目前FunctionGraph函数支持以下文件系统配置。
- SFS文件系统
弹性文件服务(Scalable File Service,SFS)提供按需扩展的高性能文件存储(NAS),可为云上多个弹性云服务器(Elastic Cloud Server,ECS),容器(CCE&CCI),裸金属服务器(BMS)提供共享访问。SFS为用户提供一个完全托管的共享文件存储,能够弹性伸缩至PB规模,具备高可用性和持久性,为海量数据、高带宽型应用提供有力支持。适用于多种应用场景,包括HPC、媒体处理、文件共享、内容管理和Web服务等。
- SFS Turbo文件系统
SFS Turbo分为SFS Turbo标准型(500GB~32TB)、SFS Turbo标准型-增强版(10TB~320TB)、SFS Turbo性能型(500GB~32TB)和SFS Turbo性能型-增强版(10TB~320TB)。SFS Turbo为用户提供一个完全托管的共享文件存储,能够弹性伸缩至320TB规模,具备高可用性和持久性,为海量的小文件、低延迟高IOPS型应用提供有力支持。适用于多种应用场景,包括高性能网站、日志存储、压缩解压、DevOps、企业办公、容器应用等。详情请参见SFS产品介绍。
- ECS共享目录
ECS共享目录是通过nfs服务,把ECS上的指定目录设置为共享文件系统(详情请参见添加ECS共享目录),函数(和ECS相同的VPC配置)可以挂载对应目录进行读写等操作,实现计算资源的动态扩展。此类型适合业务不太频繁的场景。
使用文件系统挂载功能具有以下优势:
- 函数执行空间相比于/tmp,可以极大扩展存储空间。
- 多个函数之间可以共享访问已经配置好的文件系统。
- ECS计算资源动态扩展,利用ECS已有的存储能力实现更大的计算能力。
您可以在/tmp路径下写临时文件,最大不能超过10,240MB。
创建委托
为函数添加文件系统配置需要先给函数设置相关服务的委托。
创建委托时,委托类型选择云服务,云服务选择FunctionGraph,因为委托数目有限,而且目前界面上不支持修改,建议可以创建一个权限较大的委托(Tenant Administrator),可以支持在函数中操作当前区域内的所有资源,请参见配置函数的委托权限。
创建文件系统
进入弹性文件服务,创建SFS容量型或者SFS Turbo文件系统,,请参见创建文件系统。
添加SFS容量型文件系统
设置委托
进入需要进行挂载配置的函数详情页,在配置页选择已有的委托(委托需要拥有当前Region的sfs administrator权限)。
如果没有委托,需要创建新委托,创建完后回到此界面选择。
添加挂载配置
在函数详情页单击“设置 > 磁盘挂载”,单击“添加挂载”,如果当前没有添加过文件系统配置,那么需要设置一下用户ID和组ID。
用户ID:支持输入-1或1~65534的整数且不包含1000和1002,默认值-1,表示FunctionGraph后台自动分配身份标识。
用户组ID:支持输入-1或1~65534的整数且不包含1000和1002,默认值-1,表示FunctionGraph后台自动分配身份标识。
如果已经在云上的服务器挂载过sfs,有一个目录的属主是test-user,那么就可以用id test-user命令查询对应的uid和gid。
接下来要选择需要挂载的sfs文件系统,然后设置在函数中访问的目录。
其中函数访问路径最多设置为两级,/mnt和/home都是已存在的路径,FunctionGraph V1版本推荐挂载在以/mnt或/home开头的路径下。FunctionGraph V2版本增加了校验,建议您挂载在/mnt或/home开头的路径下,如果直接挂载/mnt或/home一级目录,会报“failed to mount exist system path”。
添加sfs turbo文件系统
设置委托
挂载sfs turbo文件系统需要给函数设置委托(至少拥有sfs administrator以及VPC administrator权限)。如果没有对应权限的委托,需要新创建。
设置VPC
sfs turbo涉及VPC内部网络访问,添加sfs turbo文件系统前需要给函数配置sfs turbo对应的VPC。
添加挂载-SFS Turbo
添加sfs turbo和添加sfs过程相似,只要选好需要挂载的文件系统,设置好函数访问路径即可。
添加ECS共享目录
添加委托
挂载ECS共享目录需要给函数设置委托(至少拥有tenant guest以及VPC administrator权限),如果没有对应权限的委托,需要新创建,详情请参见创建委托。
配置VPC
添加ECS共享目录前,也需要给函数配置ECS对应的VPC,可以到ECS详情页的“基本信息”页签中查看“虚拟私有云”。单击虚拟私有云名称,进入虚拟私有云的详情页,查看子网。
获取到这两个信息后,可以在函数配置中配置对应的VPC。
添加挂载-ECS
需要在界面上输入ECS上的共享目录路径信息和函数访问路径。
后续操作
当函数挂载了文件系统配置后,对函数访问路径的读写就相当于对相关文件系统的读写。
如果把日志路径配置为函数访问路径的子目录,就可以轻松实现函数日志的持久化。
如下以函数挂载SFS Turbo为例,同时使用“统计web服务器访问情况”的函数模板,对运行在云上的服务器进行日志分析。
- 登录函数工作流控制台,在左侧导航栏选择“函数模板”。
- 在“函数模板”界面右上角搜索框中,输入“统计web服务器访问情况”进行搜索。
- 在搜索结果中,单击“使用模板”进入配置界面,如图2所示,参数配置如下:
- 区域:选择与创建的VPC、文件系统一致的区域,创建VPC和文件系统的详情请参见配置函数访问公网或VPC网络、创建文件系统。
- 项目:默认。
- 函数名称:自定义。
- 委托名称:选择拥有文件系统、VPC和APIG权限的委托,创建委托详情请参见配置函数的委托权限。
- 企业项目:根据实际业务选择。
- 环境变量:参数“access_log_path”是日志文件的地址,此处配置为“/home/test/access_log.log”。
文件系统是绝对路径,使用文件系统时需在前面添加“/”;如不挂载文件系统,则无需添加“/”,则参数配置为“code/access_log.log”。
- 触发器类型:默认为“API 网关服务(APIG)”,APIG配置详情请参见使用APIG共享版触发器。
- API名称:自定义。
- 分组:根据实际业务选择。
- 发布环境:选择“RELEASE”。
- 安全认证:选择“None”。
- 请求协议、后端超时(毫秒):默认。
- 参数配置完成后,单击“创建函数”,完成“统计web服务器访问情况”的函数创建。
- 进入创建好的函数详情页中,选择“代码”页签,在“index.py”文件中添加如下代码,然后单击“部署”。
import shutil
shutil.copyfile('/opt/function/code/access_log.log', '/home/test/access_log.log')
图3 添加代码
同时,添加公共依赖包“Jinja2-2.10”,添加依赖包详情请参见如何为函数添加依赖包。
如果不挂载文件系统,则无需增加以上代码。
- 在函数详情页中,选择“设置 > 网络配置”,开启“函数访问VPC内资源”。“VPC”和“子网”选择已创建好的VPC和子网,单击“保存”。
图4 配置函数访问VPC内资源
- 选择“磁盘挂载”,单击“添加挂载”,然后选择“SFS Turbo”。
- 文件系统名称:选择已经创建好的SFS Turbo文件系统。
- 函数访问路径:配置为“/home/test”。
- 共享目录路径:文件系统共享的路径,默认不填写表示函数能访问到文件系统所有目录路径。如果配置具体目录路径,则表示函数只能访问该目录路径。
- 选择“代码”,选择“配置测试事件”,然后创建空白模板,最后单击“创建”。
图5 配置测试事件
- 选择刚才创建好的测试事件,单击“测试”。
图6 测试结果
- 选择“设置 > 触发器”,复制APIG的URL,然后用浏览器打开该URL。
图7 复制URL
图8 打开URL结果
ECS创建nfs共享目录
- Linux系统
- CentOS、SUSE、Euler OS、Fedora或OpenSUSE等系统
- 配置yum源
①在/etc/yum.repos.d目录下创建文件euleros.repo(文件名可随意取,但是必须以“.repo”结尾)。
②使用如下命令进入euleros.repo编辑配置信息。
vi /etc/yum.repos.d/euleros.repo
Euler 2.0SP3 yum配置信息如下:
[base] name=EulerOS-2.0SP3 base baseurl=http://repo.huaweicloud.com/euler/2.3/os/x86_64/ enabled=1 gpgcheck=1 gpgkey=http://repo.huaweicloud.com/euler/2.3/os/RPM-GPG-KEY-EulerOS
Euler 2.0SP5 yum配置信息如下:
[base] name=EulerOS-2.0SP5 base baseurl=http://repo.huaweicloud.com/euler/2.5/os/x86_64/ enabled=1 gpgcheck=1 gpgkey=http://repo.huaweicloud.com/euler/2.5/os/RPM-GPG-KEY-EulerOS
参数说明
name:仓库的名称。
baseurl:仓库的地址。- 使用http协议的网络地址:http://path/to/repo
- 使用本地仓库地址:file:///path/to/local/repo
gpgcheck:表示是否进行gpg(GNU Private Guard)校验,以确定RPM包来源的有效性和安全性。gpgcheck设置为1表示进行gpg校验,0表示不进行gpg校验。如果没有这一项,默认是检查的。
③保存配置的repo文件。
④执行如下命令清理缓存。
yum clean all
- 使用如下命令安装nfs-utils
yum install nfs-utils
- 设置共享文件夹
打开/etc/exports,比如要把/sharedata目录设置为共享目录,可以填入如下内容:
/sharedata 192.168.0.0/24(rw,sync,no_root_squash)
上述内容的含义是:把/sharedata这个目录共享给192.168.0.0/24这个子网段的其他服务器。
命令输入完成后,可以执行命令exportfs -v 显示共享的目录,从而判断是否设置成功。
- 使用如下命令启动nfs服务
systemctl start rpcbind service nfs start
- 修改共享目录
比如需要新增/home/myself/download到共享目录,可以在/etc/exports中新增如下内容。
/home/myself/download 192.168.0.0/24(rw,sync,no_root_squash)
然后重启nfs服务。
service nfs restart
或者用如下命令,无需重启nfs服务。
exportfs -rv
- 设置rpcbind开机启动(可选)
systemctl enable rpcbind
- 配置yum源
- Ubuntu系统
- 使用如下命令安装nfs-kernel-server
sudo apt-get update sudo apt install nfs-kernel-server
- 设置共享文件夹
vim /etc/exports
打开/etc/exports,比如要把/sharedata目录设置为共享目录,可以填入如下内容。
/sharedata 192.168.0.0/24(rw,sync,no_root_squash)
上述内容的含义是:把/sharedata这个目录共享给192.168.0.0/24这个子网段的其他服务器。
- 启动nfs服务
service nfs-kernel-server restart
命令输入完成后,可以执行命令exportfs -v 显示共享的目录,从而判断是否设置成功。
- 修改共享目录
比如需要新增/home/myself/download到共享目录,可以在/etc/exports中新增如下内容:
/home/myself/download 192.168.0.0/24(rw,sync,no_root_squash)
然后重启nfs服务
service nfs restart
或者用如下命令,无需重启nfs服务:
exportfs -rv
- 使用如下命令安装nfs-kernel-server
- CentOS、SUSE、Euler OS、Fedora或OpenSUSE等系统
- Windows系统
- 安装nfs server软件
目前可用的收费软件有:hanewin nfs server,可到对应官网下载。
免费的有:FreeNFS、winnfsd等,可到sourceforge上下载。
- 打开nfs功能
- 如果是winnfsd,可参见:https://github.com/winnfsd/winnfsd。
- 下载winnfsd并解压,同时在解压后目录中创建一个文件夹“nfs”。
- 设置“nfs”文件的共享和读写权限。
- 在“nfs”文件单击右键,然后选择“属性”。
- 选择“共享”页签,然后单击“共享(S)...”。
- 添加“Everyone”用户,然后单击“共享(H)”。
图9 添加Everyone用户
- 选择“安全”页签,在“组或用户名(G)”列表中选择“Everyone”,然后单击“编辑(E)...”。
- 在弹出的“安全”设置窗口中,在“组或用户名(G)”列表中选择“Everyone”,在“Everyone的权限(P)”列表中的“允许”勾选框下勾选“读取”和“写入”,最后单击“确定”。
- 关闭所有的防火墙,包括“域网络”、“专用网络”和“公用网络”,等使用完后,再打开防火墙。
- 进入路由器的虚拟服务器进行端口映射,打开外部网络的端口111、2049及1058。(注意:需要有个外网IP)
- 最后执行如下命令即可,更多的命令解释请参考https://github.com/winnfsd/winnfsd。
WinNFSd.exe -addr {你自己的本机IP地址192.168.xxx.xxx} F:\nfs /nfs
- 如果是hanewin nfs server,可以参见如下步骤。
- 以Windows系统管理员身份运行下载好的hanewin nfs server的“.exe”文件。
- 安装完成后,打开“NFS Server”文件,选择“Edit > Preferences”。
- “NFS”、“Server”和“PortMapper”三个页签下配置保持默认,选择“Exports”页签,单击“Edit exports file”,配置共享目录,配置完成后单击“Save”。
配置共享目录格式可参考“D:\share -public -name:nfs”:将“share”文件夹权限设置为“public”,同时定义了一个别名“nfs”。
- 最后单击“确定”。
- 关闭所有的防火墙,包括“域网络”、“专用网络”和“公用网络”,等使用完后,再打开防火墙。
在Linux系统中执行如下命令挂载目录,验证文件共享是否成功。
mount -t nfs -o nolock 192.168.xxx.xxx:/nfs /mnt
- “192.168.xxx.xxx”是windows系统的IP地址。
- “nfs”是配置共享目录时创建的别名。
- “/mnt”是指定将远程目录挂载到本地的“/mnt”目录下。
- 如果是winnfsd,可参见:https://github.com/winnfsd/winnfsd。