函数计算CFC

    使用 Terraform 快速搭建图像处理应用

    概述

    本文介绍了使用百度云函数计算,结合 BOS 和百度云图像效果增强能力,实现图像文件的自动处理,并通过 Terraform 实现应用的快速部署。

    前提概念

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

    Terraform:是一种安全有效地构建、更改和版本控制基础设施的工具。它以配置文件为驱动,您在文件中定义各种组件,Terraform 会基于该文件完成所有组件的创建、变更和管理。目前百度云已与 Terraform 集成,您可通过 Terraform 来创建、管理 CFC、BOS、VPC、BCC 等多种百度云资源,具体请参考 Terraform BaiduCloud Provider

    百度云图像效果增强:基于领先的深度学习技术,提供对图片进行去雾、对比度增强、无损放大、拉伸恢复等多种优化处理,具体请参考图像效果增强

    BOS:百度云提供的对象存储服务,支持任何类型的数据存储。Bucket 是存放数据的容器,可看做是存储桶。

    BOS 触发器:BOS 和 CFC 的无缝集成。您可以为各种类型的事件设置处理函数,当 BOS 监控到指定类型的文件、事件后,会自动调用 CFC 函数。

    工作原理

    整体方案如图所示:

    solution.png

    用户上传一个图像文件到 BOS 后,BOS 触发器自动触发函数执行,函数调用 AIP 的图像效果增强服务处理图像,并且将处理后的视频保存回 BOS 的另一个 Bucket。本示例中,函数使用了图像效果增强服务的给黑白图像上色功能。

    操作部署

    创建图像效果增强应用

    登录百度云控制台,选择“产品服务”->“人工智能”->“图像效果增强”,点击“创建应用”,输入“应用名称”和“应用描述”后点击“立即创建”,您的第一个应用就创建完成了。返回“应用列表”页,就能看到您创建的应用。如图所示,每个应用都有自己的 AppID、API Key 和 Secret Key,在函数中访问该服务会用到这些信息。

    image-app.png

    部署函数和 BOS Bucket

    函数和 Bucket 资源的部署有两种方式,下面分别介绍一下。

    通过 Terraform 一键部署

    使用 Terraform 可以统一管理各个资源,使用 Terraform 可帮助您更快的部署、变更应用,无需在各个产品的控制台上分别操作,降低操作成本。

    1. 在本地编写函数代码,实现从 BOS 读取图片、调用图像增强服务的逻辑。本例中,您可直接使用此示例代码包 aip-image-process.zip
    2. 登录 Terraform 官网 下载适用于您的操作系统的程序包。
    3. 编辑 Terraform 配置文件。新建文件 main.tf,在文件中指定函数、bucket、函数触发器的元信息。参考配置如下:
     provider "baiducloud" {
      access_key = "<YOUR_BAIDUCLOUD_ACCESS_KEY>"
      secret_key = "<YOUR_BAIDUCLOUD_SECRET_KEY>"
      region = "bj"
    }
    
    # 创建源 bucket
    resource "baiducloud_bos_bucket" "source" {
      bucket = "source-bucket"
      acl    = "public-read-write"
    }
    
    # 创建目标 bucket
    resource "baiducloud_bos_bucket" "dest" {
      bucket = "destination-bucket"
      acl    = "public-read-write"
    }
    
    data "baiducloud_zones" "default" {}
    
    # 创建函数,关于函数的更多信息可查看 https://cloud.baidu.com/doc/CFC/s/xjwvz450q
    resource "baiducloud_cfc_function" "default" {
      function_name = "image-process"
      description   = "my function to process images"
      
      # 指定函数的环境变量,示例函数执行时会读取这些变量以初始化相关 client
      # 将您创建的图像效果增强应用的参数填入
      environment = {
        "APP_ID" : "<YOUR_AIP_ID>"
        "AIP_KEY" : "<YOUR_AIP_KEY>"
        "AIP_SECRET_KEY" : "<YOUR_AIP_SECRET_KEY>"
        "DEST_BUCKET" : "destination-bucket"    
      }
      handler        = "index.handler"
      memory_size    = 128
      runtime        = "nodejs12"
      time_out       = 10
      
      # 函数 zip 包的相对或绝对路径,本示例中请填写您刚下载的 aip-image-process.zip 的路径
      code_file_name = "</PATH/OF/FUNCTION>"
      
      # 配置函数日志存储地址
      log_type    = "bos"
      log_bos_dir = baiducloud_bos_bucket.dest.bucket
    }
    
    # 创建 bos 触发器
    resource "baiducloud_cfc_trigger" "bos-trigger" {
      source_type    = "bos"
      bucket         = baiducloud_bos_bucket.source.bucket
      target         = baiducloud_cfc_function.default.function_brn
      name           = "myBosTrigger"
      status         = "enabled"
      
      # 当 /images/ 目录下有文件上传时,会触发函数执行
      bos_event_type = ["PutObject", "PostObject"]
      resource       = "/images/*"
    }

    您可再创建一个可选的文件 output.tf,Terraform 成功创建资源后会根据此文件打印资源信息,示例如下:

    output "cfc_functions" {
      value = "${baiducloud_cfc_function.default}"
    }
    
    output "bos_trigger" {
      value = "${baiducloud_cfc_trigger.bos-trigger}"
    }
    1. 执行命令 terraform init,Terraform 会根据当前配置文件初始化工作空间。然后执行 terraform apply,根据提示输入"yes",即自动执行资源创建。执行结束后,您可到百度云控制台查看新创建的函数、触发器和 Bucket。

    手动部署

    您也可以手动分别创建函数、触发器和 Bucket,具体操作如下:

    1. CFC 有一个名为 aip-image-process 的函数模板,您可使用该模板生成您自己的函数,具体操作请参考 使用模板创建函数
    2. 创建 2 个 Bucket,source-bucket 用于接收上传的图像源文件,destination-bucket 用于存储 CFC 函数处理后的图像文件,具体操作请参考 创建 Bucket
    3. 为函数创建 BOS 触发器,选择刚刚创建的 source-bucket 作为触发源 Bucket,并设置触发器的前缀为 images/,事件类型选择“文件上传”和“表单上传”两项。设置完成后,当图像文件上传到该 Bucket 的 images/ 路径下后,BOS 就会自动调用函数。具体操作方法请参考 创建 BOS 触发器

    功能验证

    1. 在 BOS 的控制台,上传黑白图片到 source-bucket 的 images/ 目录下,本例使用下图:
    photo.jpg
    1. 随后进入 destination-bucket,在 images/ 目录下即可看到同名的、已处理好的图像文件。查看该文件,显示如下:
    photo-colored.jpg
    3. 在 CFC 控制台查看函数的日志、监控,可看到函数被调用了一次。

    总结

    基于函数计算 CFC 搭建图像处理应用,您无需管理服务器等基础设施,只需关注图像处理等业务逻辑代码。借助 Terraform,您可以一键搭建函数运行环境,快速配置各种触发器、对象存储 BOS、虚机 BCC 等多种资源,实现应用的快速上线。

    上一篇
    使用定时触发器根据天气信息控制远程设备
    下一篇
    使用 CFC HTTP 触发器托管 API