前言
首先介绍下在本文出现的几个比较重要的概念:
函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。函数计算更多信息 参考。
Fun: Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算、API 网关、日志服务等资源。它通过一个资源配置文件(template.yml),协助您进行开发、构建、部署操作。Fun 的更多文档 参考。
Fun Local: Fun Local 作为 Fun 的一个子命令存在,可以直接通过 fun local
命令使用。Fun Local 工具可以将函数计算中的函数在本地完全模拟运行,并提供单步调试的功能,旨在弥补函数计算相对于传统应用开发体验上的短板,并为用户提供一种解决函数计算问题排查的新途径。
阿里云文件存储(NAS): NAS 是一种分布式的网络文件存储,为 ECS、HPC、Docker、BatchCompute 等提供安全、无限容量、高性能、高可靠、简单易用的文件存储服务。
备注: 本文介绍的技巧需要 Fun 版本大于等于 2.8.0。
NAS 文件管理解决方案
函数计算在很多场景下依赖一些静态资源,比如机器学习、php web 应用等。通过 NAS 存储这些静态资源无疑是一个很好的解决方案。但是问题在于,如何把我们的静态资源方便的“迁移”到 NAS 存储呢?
NAS 服务本身提供了一些方法,比如将 NAS 挂载到 ECS 上进行操作,或者先上传到 OSS 再利用 OSS 迁移到 NAS。更多信息参考。
但是这些方法,要么是要求有一台 ECS 配合,要么是利用比较“重”的迁移工具,使用体验比较复杂,也不够灵活。
今天我们介绍一种通过函数计算解决该问题的思路。通过该方案,可以做到:
- 不需要 ECS 配合
- 小文件直接本地上传到 NAS
- 大文件支持从 OSS 迁移到 NAS
- 提供 NAS 文件管理常用的功能支持,比如 ls、cat、cp、unzip 等
- 支持直接执行 bash 命令,操作 NAS 文件,比如 mv、rm 等任何 linux 命令
- 如果不满足需求,通过简单的代码修改即可实现相关功能
配置方法
代码托管在 Github。首先将代码下载下来,可以看到,目录中的 template.yml 文件中包含了 VpcConfig、NasConfig,
VpcConfig:
VpcId: 'vpc-bp12hm92gdpcjtai7ua82'
VSwitchIds: [ 'vsw-bp1gitru7oicyyb4uiylj' ]
SecurityGroupId: 'sg-bp1243pi65bw4cjj4bks'
NasConfig:
UserId: 10003
GroupId: 10003
MountPoints:
- ServerAddr: '012194b28f-ujc20.cn-hangzhou.nas.aliyuncs.com:/'
MountDir: '/mnt/nas'
VpcConfig、NasConfig 分别配置了 VPC 以及 NAS。对于使用而言,将其更换为用户自己的配置即可。
在 NasConfig 中,可以看到我们将 NAS 盘挂载到了函数计算的 /mnt/nas
目录。
在代码目录下执行以下命令,用于下载 python flask 依赖:
docker run --rm -v $(pwd)/src:/code aliyunfc/runtime-python2.7:build pip install --install-option="--install-lib=/code" flask
代码准备完成,执行 fun deploy 可以看到效果:

复制日志被黄色高亮的 url,然后在当前目录创建 .env 文件,并按照一下形式写进去:
FC_URL=https://1911504709953557.cn-hangzhou.fc.aliyuncs.com/2016-08-15/proxy/nasDemo/browser/
使用方法
至此,我们就可以使用了。在项目我们提供了一个 nas.sh 脚本,它支持以下几个功能。
ls
功能:列出函数计算运行时的指定目录。
参数:路径。表示要列出的目录或文件路径。该路径必须以 fc: 为前缀。
使用示例:
# 列出函数计算运行环境下的 / 目录的内容
$ ./nas.sh ls fc:/
dev
etc
srv
mnt
// 省略部分内容
由于我们的 template.yml 中将 nas 挂载到了 /mnt/nas 目录,所以,通过列出 /mnt 目录就可以看到我们挂载的 nas 目录了:
# 列出函数计算运行环境下的 /mnt/ 目录的内容
$ ./nas.sh ls fc:/mnt/
nas
# 列出挂载的 nas 目录的内容
$ ./nas.sh ls fc:/mnt/nas
test.txt
其中,test.txt 是 NAS 盘中的文件内容。
cp
功能:复制文件到目标位置。支持本地、oss 两种复制方式。
参数:
-
源文件。表示要复制的文件位置,有两种形式:
- 支持本地文件,比如使用相对路径 test/test.txt 也可以是绝对路径 /tmp/test.txt 或 ~/test.txt.
- oss 对象,格式为 oss://bucket/objectKey
- 目标位置。表示文件复制的目标位置。
# 复制本地磁盘 test.txt 文件到 nas 目录下
$ ./nas.sh cp test.txt fc:/mnt/nas/
# 复制本地磁盘 ~/test.txt 文件到 nas 目录下
$ ./nas.sh cp ~/test.txt fc:/mnt/nas/
cp 命令,支持直接从 oss 上复制文件到目标位置。
注意: 在复制 oss 对象前,需要先将 template.yml 中的 OSS_ENDPOINT 替换为自己的 oss endpoint。
参数格式为 oss://bucket/objectKey
# 复制 oss 上 just-fc-test bucket 下的 applib.zip 文件到 nas 目录下
$ ./nas.sh cp oss://just-fc-test/applib.zip fc:/mnt/nas/applib.zip
unzip
功能:解压指定 zip 包。
参数:路径。表示要解压的压缩包路径。该路径必须以 fc: 为前缀。
# 解压 nas 目录下的 applib.zip
$ ./nas.sh unzip fc:/mnt/nas/applib.zip
cat
功能:读取指定文件内容。
参数:文件位置。该路径必须以 fc: 为前缀。
# 读取 nas 目录下的 test.txt 文件
$ ./nas.sh cat fc:/mnt/nas/test.txt
this is a just test file!
bash
功能: 在函数计算环境执行 bash 命令。
参数: 命令。表示要执行的 bash 命令。注意,由于该命令会直接在远端执行,因此不需要添加 fc: 前缀。
# 通过 bash 命令列出 /mnt/nas 目录内容
$ ./nas.sh bash ls -al /mnt/nas
drwxr-xr-x 36 user10003 10003 1152 Jan 8 11:42 applib
-rw-r--r-- 1 user10003 10003 97434925 Jan 9 06:59 applib.zip
# 通过 bash 命令修改目录名称
$ ./nas.sh bash mv /mnt/nas/applib /mnt/nas/app
# 再次列出 nas 目录内容可以看到 applib 目录已经被重命名为 app
$ ./nas.sh bash ls -al /mnt/nas
drwxr-xr-x 36 user10003 10003 1152 Jan 8 11:42 app
-rw-r--r-- 1 user10003 10003 97434925 Jan 9 06:59 applib.zip
# 删除 nas 目录中的 app 目录
$ ./nas.sh bash rm -r /mnt/nas/app
# 查看远端 python 版本
$ ./nas.sh bash python --version
Python 2.7.15
开发更多功能
如果以上功能无法满足需求,可以自行添加一些功能,开发步骤如下。
1. 本地启动函数
在项目目录执行 fun local start 即可本地将函数运行起来:

复制其中被黄色高亮的 url,比如这里是:http://localhost:8000/2016-08-15/proxy/nasDemo/browser/ 。
将其 FC_URL=http://localhost:8000/2016-08-15/proxy/nasDemo/browser/
写入 .env 或者配置为环境变量,就可以正式开发了。
关于 nas 的相关调试技巧可以参考:《开发函数计算的正确姿势 —— 本地运行、调试、发布 NAS 函数》。
2. 修改代码,添加功能,预览效果
直接修改代码,重新访问即可。下面是一个动态的开发演示:
备注:本项目使用的是 python flask 框架。其他语言的本地运行、调试支持可以 参考。

3. 发布
本地开发完成后,可以通过 fun deploy 直接发布到远端。

4. 预览线上效果
将发布日志中黄色高亮的 url,写到 .env 文件,直接再执行,可以看到与本地一致的效果。
$ ./nas.sh ls fc:/mnt/nas
result is
applib
applib.zip
test.txt
总结
本文提供了一个通过函数计算管理 NAS 文件的方案,该方案支持绝大部分 linux 管理文件的操作,且不需要再开一台 ECS。
另外,本文提供了该方案的开发方法,通过 fun 提供的函数计算的本地调试能力、发布部署能力,可以做到在本地新加并调试好功能后,可以一键发布到远端,并获得预期的效果。