- 一、什么是 Serverless
- 二、编写你的第一个 Serverless 应用
- 三、Serverless 应用是怎么运行的
- 四、如何提高应用开发调试和部署效率
- 五、serverless 应用
- 阿里云函数计算
- 腾讯云函数
- 使用 vercel 部署你的应用-推荐
- 六、场景案例
3.4 音视频处理系统的部署
我们需要将 ffmpeg 或 ffprobe 上传。看起来比较简单,我们直接将其放在函数代码目录并上传就可以了。
不过这里需要注意的是, 由于 ffmpeg 和 ffprobe 是可执行文件,最终我们需要用到这两个命令,所以在上传到 FaaS 平台之前,需要为其赋予可执行权限。
你可以通过 ls -l 来查看文件的权限:
$ ls -l -rwxr-xr-x 1 root staff 39000328 2 9 20:59 ffmpeg -rwxr-xr-x 1 root staff 38906056 2 9 21:00 ffprobe
-rwxr-xr-x 分为四部分:
- 第 0 位-表示文件类型;
- 第 1-3 位 rwx 表示文件所有者的权限;
- 第 4-6 位 r-x 是同组用户的权限;
- 第 7-9r-x 位表示其他用户的权限。
r 表示读权限,w 表示写权限,x 表示执行权限。从文件权限可以看出,针对所有用户这两个文件都有可执行权限。
如果你的这两个文件没有执行权限,则需要通过下面的命令添加权限:
$ chmod +x ffmpeg $ chmod +x ffprobe
- 这样在 FaaS 平台上,Node.js 才可以执行这两个命令。
- 解决了可执行文件的权限问题后,还有一个问题是函数的权限。
由于函数需要读写 OSS,所以我们需要为函数设置角色,并为该角色添加管理 OSS 的权限。如果你不清楚如何授权,可以复习一下 “10|访问控制:如何授权访问其他云服务?”的内容。
在我提供的示例代码中,我在 template.yaml 的第 7 行设置了函数的角色 acs:ram::1457216987974698:role/aliyunfclogexecutionrole,文件内容如下所示:
ROSTemplateFormatVersion: '2015-09-01' Transform: 'Aliyun::Serverless-2018-04-03' Resources: serverless-video: Type: 'Aliyun::Serverless::Service' Properties: Role: acs:ram::1457216987974698:role/aliyunfclogexecutionrole Description: '基于 Serverless 开发高可用音视频处理系统' get_duration: Type: 'Aliyun::Serverless::Function' Properties: Handler: index.handler Runtime: nodejs12 Timeout: 600 MemorySize: 256 CodeUri: ./.serverless/get_duration get_meta: Type: 'Aliyun::Serverless::Function' Properties: Handler: index.handler Runtime: nodejs12 Timeout: 600 MemorySize: 256 CodeUri: ./.serverless/get_meta ......
细心的你可能发现了,在该 YAML 配置中,函数的 CodeUri 不是./functions/get_durtion,而是./.serverless/get_meta,这是为什么呢?
这主要是因为我们需要对函数代码进行构建,./.serverless/get_duration 对应的是构建后的代码。之所以需要构建,是为了解决 common/utils.js 代码共用的问题。
如果不对代码进行构建,直接部署 functions/get_duration 中的代码,函数执行时就会报错:Cannot find module ‘../common/utils,因为 common/utils.js 不在入口函数目录中,没有部署到 FaaS 上。
要解决这个问题,就需要对代码进行构建,将函数及依赖的所有代码构建为单个文件,这样部署时就只需要部署一个文件,不涉及目录和依赖的问题了。
我们可以使用 ncc 这个工具对函数进行构建,使用方法如下:
$ ncc build ./functions/get_duration/index.js -o ./.serverless/get_duration/ -e ali-oss
该命令就会将 functions/get_duration/index.js
进行构建,最终会将 index.js
以及缩依赖的 exec、getOSSClient 等方法进行编译,最终合并为一个文件并输出到 ./.serverless/get_duration/
目录中。
这里还需要注意的是-e ali-oss
这个参数,含义是构建时,排除 ali-oss 这个依赖,也就是不将其编译到最终的 index.js
文件中。这是因为函数计算的 Node.js 运行时内置了 ali-oss 模块,所以我们的构建产物就不需要包含 ali-oss 的代码了。
处理对代码进行构建,我们还需要将 ffmpeg 和 ffprobe 复制到对应的函数目录中。最终我将这些步骤编写到了 build.js
中,内容如下:
// build.js const { exec } = require("./functions/common/utils"); async function build() { // 清空编译目录 await exec("rm -rf .serverless/*"); // 编译 get_duration 函数 await exec("mkdir -p ./.serverless/get_duration"); await exec(`ncc build ./functions/get_duration/index.js -o ./.serverless/get_duration/ -e ali-oss`); await exec("cp ./ffprobe ./.serverless/get_duration/ffprobe"); // 编译 get_meta 函数 await exec("mkdir -p ./.serverless/get_meta"); await exec(`ncc build ./functions/get_meta/index.js -o ./.serverless/get_meta/ -e ali-oss`); await exec("cp ./ffprobe ./.serverless/get_meta/ffprobe"); //... } build();
然后我在 package.json 中添加了两个命令:
- build 构建函数
- deploy 构建并部署
例如你开发完成后需要部署,就可以直接运行:
$ npm run deploy > serverless-video@1.0.0 deploy > npm run build && fun deploy > serverless-video@1.0.0 build > node build.js rm -rf .serverless/* mkdir -p ./.serverless/get_duration ncc build ./functions/get_duration/index.js -o ./.serverless/get_duration/ -e ali-oss using template: template.yml Waiting for service serverless-video to be deployed... Waiting for function get_duration to be deployed... Waiting for packaging function get_duration code... The function get_duration has been packaged. A total of 2 files were compressed and the final size was 15.2 MB function get_duration deploy success ...... service serverless-video deploy success
部署成功后,我们就可以对函数进行测试了,可以直接在控制台上运行函数,也可以通过 fun invoke 执行函数:
$ fun invoke get_duration { "format": { "duration": "170.859000" } }
强调下面几点:
- Serverless 除了适合 Web 接口、服务端渲染等场景,还适合 CPU 密集型的任务;
- 基于 Serverless 开发的音视频处理系统,本身就具备弹性、可扩展、低成本、免运维、高可用的能力;
- 对于需要通过代码执行的命令行工具等依赖,部署到 FaaS 平台之前需要为其设置可执行权限;若函数依需要调用其他云产品的接口,需要为函数授予相应权限;
- 对于添加水印、视频转码等消耗资源的操作,需要为函数设置较大的内存和超时时间。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论