全部产品

应用示例2 - 图像处理

更新时间:2017-09-08 09:59:29   分享:   

接下来,让我们再实践一个更复杂的函数:利用nodejs jimp图像处理库完成图像缩放功能。通过示例,您将了解:

  • 如何打包第三方依赖库
  • 如何开启和查看函数运行日志

本示例假定函数代码存放于“code”目录,源图片和结果图片存放于“data”目录,函数计算上已经存在名为“demo”的服务。如果您不了解创建服务等相关背景,请参阅hello world 应用示例

首先请执行 fcli shell 进入交互模式。

安装第三方依赖库

由于我们的函数依赖第三方图像处理库jimp,我们需要将他安装到code目录,和函数源代码一起打包上传。fcli为您提供了一个本地的沙盒环境,和函数计算服务中的函数运行环境保持一致。在沙盒环境中,您可以方便的安装第三方库,进行本地调试等操作。

  1. 执行sbox -d code -t nodejs6,其中 -d参数指定代码所在目录,它将被挂载到沙盒环境的”/code”位置;-t参数指定语言类型。
  2. 进入沙盒环境后,运行npm install jimp安装依赖库
  3. 完成后执行exit退出沙盒环境。此时jimp库已经安装到了code目录下

注意:

  1. sbox命令要求您的机器上已安装docker。docker的具体安装步骤,请参阅相关文档
  2. sbox用到的镜像存储在docker官方镜像库上,国内用户访问速度较慢。建议您使用阿里云镜像加速服务,具体设置请参阅相关文档
  3. 在 linux 下使用docker,要求有 root 权限。所以您需要使用 sudo fcli shell 的方式启动命令行工具;或者您可以参照相关文档设置,以非 root 用户管理 docker。
  4. 我们推荐您总是在沙盒环境中打包第三方库,测试函数和调查问题,这样能避免由于开发环境和运行环境不一致所引起的一些问题。特别是当您的函数依赖二进制文件时,请在沙盒环境中编译相关依赖。

install_3rd_libs

编写代码

在code目录下,创建“image_process.js”文件,实现名为”resize”的函数,其中源图片作为event参数传入。

  1. 'use strict';
  2. var jimp = require("jimp");
  3. var fs = require("fs")
  4. module.exports.resize = function(event, context, callback) {
  5. // 传入的event是png格式的图片,将其写入到tmp目录下。
  6. fs.writeFileSync("/tmp/serverless.png", event)
  7. // 读取/tmp目录下的png图片,调用jimp库完成resize,将结果图片写入到/tmp目录。
  8. jimp.read("/tmp/serverless.png", function(err, image) {
  9. if (err) {
  10. console.error("failed to read image");
  11. callback(err)
  12. return
  13. }
  14. image.resize(128, 128)
  15. .write("/tmp/serverless_128.png", function(err) {
  16. if (err) {
  17. console.error("failed to write image");
  18. callback(err)
  19. return
  20. }
  21. // 从/tmp目录读取结果图片,并作为response返回。
  22. callback(null, fs.readFileSync("/tmp/serverless_128.png"))
  23. })
  24. });
  25. };

创建SLS日志库

函数计算会将函数运行日志存储到您指定的日志库中。执行mkl -p fc -s demo在日志服务中创建名为“fc”的log project,和名为“demo”的log store。

注意:

  1. 如果您已经有log store,这一步可跳过。
  2. 如果您复制上述命令执行,您可能会收到下述错误。这是由于日志服务的 project 名称要求全局唯一,您需要将 fc 改名。详见日志服务文档
    1. Error: {
    2. "errorCode": "ProjectAlreadyExist",
    3. "errorMessage": "Project fc already exist",
    4. ...
    5. }
  3. 您需要为使用的日志资源单独付费。特别注意,日志服务会对资源收取一定的预留费用,这意味着即使您不写任何日志,也会付费,最低¥0.04/每天。计费细节请参阅相关文档
  4. 由于日志是调试和问题诊断的重要信息,强烈建议您开通日志服务来保存函数运行日志。

create_logstore

授权函数计算日志库写权限

由于日志是用户的资源,函数计算需要获得用户的显式授权才能写入日志。执行grant demo命令,根据提示信息,授予函数计算将“demo”下的函数运行日志写到指定的日志库中。函数计算的权限管理基于阿里云资源访问控制服务(RAM),细节请参阅相关文档

注意:如果您当前使用的账户是 RAM 子用户,则执行 grant 命令时可能会收到如下错误。这是由于您的账户没有 create policy 等权限。您需要主账户为您授予相关权限。

  1. Error: failed to create policy write-fc-logs due to {
  2. "HttpStatus": 404,
  3. "HostId": "ram.aliyuncs.com",
  4. "Code": "Inactive",
  5. "Message": "Account is inactive to this service"
  6. }

grant_logs

创建并调用函数

执行mkf demo/resize -t nodejs6 -h image_process.resize -d code,在函数计算上创建名为“resize”的函数,属于“demo”服务。

image_resize

调用函数并查看日志

假定源图片在“data”目录下,名为“serverless.png”,执行invk demo/resize -f data/serverless.png -o data/serverless_128.png,完成图片的缩放。

执行logs hello查看整个“demo”服务的日志,执行logs demo/resize查看指定函数的日志。

invk_image_resize

本文导读目录
本文导读目录
以上内容是否对您有帮助?