阿里云 Serverless Computing + 关注
手机版

开发函数计算的正确姿势 —— 开发 NAS 文件管理应用

  1. 云栖社区>
  2. 阿里云 Serverless Computing>
  3. 博客>
  4. 正文

开发函数计算的正确姿势 —— 开发 NAS 文件管理应用

tanhe123 发布时间:2019-01-09 16:49:01 浏览3905 评论1

摘要: 前言 首先介绍下在本文出现的几个比较重要的概念: __函数计算(Function Compute)__: 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。

前言

首先介绍下在本文出现的几个比较重要的概念:

函数计算(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 配合,要么是利用比较“重”的迁移工具,使用体验比较复杂,也不够灵活。

今天我们介绍一种通过函数计算解决该问题的思路。通过该方案,可以做到:

  1. 不需要 ECS 配合
  2. 小文件直接本地上传到 NAS
  3. 大文件支持从 OSS 迁移到 NAS
  4. 提供 NAS 文件管理常用的功能支持,比如 ls、cat、cp、unzip 等
  5. 支持直接执行 bash 命令,操作 NAS 文件,比如 mv、rm 等任何 linux 命令
  6. 如果不满足需求,通过简单的代码修改即可实现相关功能

配置方法

代码托管在 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 两种复制方式。
参数:

  • 源文件。表示要复制的文件位置,有两种形式:

    1. 支持本地文件,比如使用相对路径 test/test.txt 也可以是绝对路径 /tmp/test.txt 或 ~/test.txt.
    2. 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 框架。其他语言的本地运行、调试支持可以 参考

fun_local_nas_browser_service

3. 发布

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

4. 预览线上效果

将发布日志中黄色高亮的 url,写到 .env 文件,直接再执行,可以看到与本地一致的效果。

$ ./nas.sh ls fc:/mnt/nas
result is
        applib
        applib.zip
        test.txt

总结

本文提供了一个通过函数计算管理 NAS 文件的方案,该方案支持绝大部分 linux 管理文件的操作,且不需要再开一台 ECS。

另外,本文提供了该方案的开发方法,通过 fun 提供的函数计算的本地调试能力、发布部署能力,可以做到在本地新加并调试好功能后,可以一键发布到远端,并获得预期的效果。

【云栖快讯】云栖专辑 | 阿里开发者们的20个感悟,一通百通  详情请点击

网友评论

1F
rsong

赞!