使用 Terraform 快速搭建图像处理应用
概述
本文介绍了使用百度云函数计算,结合 BOS 和百度云图像效果增强能力,实现图像文件的自动处理,并通过 Terraform 实现应用的快速部署。
前提概念
首先介绍在本文出现的几个比较重要的概念:
Terraform:是一种安全有效地构建、更改和版本控制基础设施的工具。它以配置文件为驱动,您在文件中定义各种组件,Terraform 会基于该文件完成所有组件的创建、变更和管理。目前百度云已与 Terraform 集成,您可通过 Terraform 来创建、管理 CFC、BOS、VPC、BCC 等多种百度云资源,具体请参考 Terraform BaiduCloud Provider。
百度云图像效果增强:基于领先的深度学习技术,提供对图片进行去雾、对比度增强、无损放大、拉伸恢复等多种优化处理,具体请参考图像效果增强。
BOS:百度云提供的对象存储服务,支持任何类型的数据存储。Bucket 是存放数据的容器,可看做是存储桶。
BOS 触发器:BOS 和 CFC 的无缝集成。您可以为各种类型的事件设置处理函数,当 BOS 监控到指定类型的文件、事件后,会自动调用 CFC 函数。
工作原理
整体方案如图所示:
用户上传一个图像文件到 BOS 后,BOS 触发器自动触发函数执行,函数调用 AIP 的图像效果增强服务处理图像,并且将处理后的视频保存回 BOS 的另一个 Bucket。本示例中,函数使用了图像效果增强服务的给黑白图像上色功能。
操作部署
创建图像效果增强应用
登录百度云控制台,选择“产品服务”->“人工智能”->“图像效果增强”,点击“创建应用”,输入“应用名称”和“应用描述”后点击“立即创建”,您的第一个应用就创建完成了。返回“应用列表”页,就能看到您创建的应用。如图所示,每个应用都有自己的 AppID、API Key 和 Secret Key,在函数中访问该服务会用到这些信息。
部署函数和 BOS Bucket
函数和 Bucket 资源的部署有两种方式,下面分别介绍一下。
通过 Terraform 一键部署
使用 Terraform 可以统一管理各个资源,使用 Terraform 可帮助您更快的部署、变更应用,无需在各个产品的控制台上分别操作,降低操作成本。
- 在本地编写函数代码,实现从 BOS 读取图片、调用图像增强服务的逻辑。本例中,您可直接使用此示例代码包 aip-image-process.zip。
- 登录 Terraform 官网 下载适用于您的操作系统的程序包。
- 编辑 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}"
}
- 执行命令
terraform init
,Terraform 会根据当前配置文件初始化工作空间。然后执行terraform apply
,根据提示输入"yes",即自动执行资源创建。执行结束后,您可到百度云控制台查看新创建的函数、触发器和 Bucket。
手动部署
您也可以手动分别创建函数、触发器和 Bucket,具体操作如下:
- CFC 有一个名为 aip-image-process 的函数模板,您可使用该模板生成您自己的函数,具体操作请参考 使用模板创建函数。
- 创建 2 个 Bucket,source-bucket 用于接收上传的图像源文件,destination-bucket 用于存储 CFC 函数处理后的图像文件,具体操作请参考 创建 Bucket。
- 为函数创建 BOS 触发器,选择刚刚创建的 source-bucket 作为触发源 Bucket,并设置触发器的前缀为
images/
,事件类型选择“文件上传”和“表单上传”两项。设置完成后,当图像文件上传到该 Bucket 的images/
路径下后,BOS 就会自动调用函数。具体操作方法请参考 创建 BOS 触发器。
功能验证
- 在 BOS 的控制台,上传黑白图片到 source-bucket 的
images/
目录下,本例使用下图:
- 随后进入 destination-bucket,在
images/
目录下即可看到同名的、已处理好的图像文件。查看该文件,显示如下:
3. 在 CFC 控制台查看函数的日志、监控,可看到函数被调用了一次。
总结
基于函数计算 CFC 搭建图像处理应用,您无需管理服务器等基础设施,只需关注图像处理等业务逻辑代码。借助 Terraform,您可以一键搭建函数运行环境,快速配置各种触发器、对象存储 BOS、虚机 BCC 等多种资源,实现应用的快速上线。