1. 目标读者
对阿里云Serverless、OSS、FC、SLS等服务有一定使用经验,想基于函数计算服务搭建一些简单应用的个人开发者或企业用户,熟悉图片处理的常用Python库。
2. 相关概念
FC函数计算:Function Compute函数计算是一种事件驱动的全托管计算服务,用户无需管理服务器、存储、网络等IaaS基础设施,只需编写代码并上传,FC会自动计算资源,以弹性、可靠的方式运行代码,同时提供丰富的运维观测能力,支持与阿里云SLS、ARMS等运维BaaS服务联合使用。
3. 前提条件
1.已开通阿里云FC、OSS、SLS等服务
2.配置好对应服务的角色授权
3.提前准备打马赛克Python代码及测试图片
4. 操作步骤
4.1 步骤一:创建存放图片的OSS桶
1.进入OSS服务控制台页面:
2.选择Bucket列表,创建存储原图片桶:fc-test-image
3.创建存储打马赛克处理后的图片桶:fc-test-mosaic-image
4.2 步骤二:创建函数计算服务
1. 选择服务及函数,创建服务,输入服务名称和描述,勾选上日志、链路追踪功能,提升函数运维效率:
2. 进入函数管理,创建函数:
3.选择使用Runtime从零创建,填写函数名称,运行环境选默认Python 3.6:
4.代码选择通过文件夹上传,将本地预先准备好的代码上传(代码内容见附录,文件名需修改为index.py):
5.选择处理事件请求,弹性实例,内存规格512M,实例并发度1,请求处理程序默认:
6.触发器选择对象存储OSS,填写名称,选择fc-test-image bucket,配置文件后缀.jpg,触发事件选PutObject、PostObject,角色名称默认:
7.函数创建成功:
4.3 步骤三:部署并调试函数代码功能
1. 部署代码:
2.测试函数,使用OSS事件模板:
函数已经可以进入,由于测试场景,没有实际的图片导致报错:
3.观察调用日志服务,确认函数已经被正确调用:
5. 方案验证
5.1 步骤一:单张图片上传打马赛克验证
1.上传本地测试图片到OSS fc-test-image桶:
测试图片(网图,侵删):
2.查看OSS fc-test-mosaic-image桶内打好马赛克的图片:
3.查看函数调用日志信息,包含详细的请求信息及日志详情,足够支撑问题快速定位:
4.查看函数监控指标,调用次数,错误次数,执行时间等均正确:
5.查看链路追踪服务,函数链路情况正常:
5.2 步骤二:批量图片上传打马赛克验证
1.批量上传本地测试图片到OSS fc-test-image桶:
2.查看函数日志情况,所有请求都成功:
3.查看OSS fc-test-mosaic-image桶内输出,图片已打马赛克
常见问题
1.上传的代码,必须有index.py文件,修改文件名后重试成功:
2.每次进入函数代码页面,都要重新加载一次,用户体验不是很好,希望在一段时间内可以保持页面:
3.函数计算的监控服务,时效性比较差,日志已经有请求信息,但监控一直没有,需要改进优化:
6. 附录
1、图片打马赛克参考Python代码:
# -*- coding: utf-8 -*-
import cv2
import json
import logging
import oss2
def handler(event, context):
logger = logging.getLogger()
evt = json.loads(event)
creds = context.credentials
auth=oss2.StsAuth(
creds.access_key_id,
creds.access_key_secret,
creds.security_token)
evt = evt['events'][0]
bucket_name = evt['oss']['bucket']['name']
endpoint = 'oss-' + evt['region'] + '.aliyuncs.com'
fc_test_image_bucket = oss2.Bucket(auth, endpoint, bucket_name)
fc_test_mosaic_image_bucket = oss2.Bucket(auth, endpoint, 'fc-test-mosaic-image')
object_name = evt['oss']['object']['key']
new_object_name = 'mosaic_%s' % object_name
source_image_path = '/tmp/%s' % object_name
fc_test_image_bucket.get_object_to_file(object_name, source_image_path)
logger.info('download source image %s success.' % source_image_path)
mosaic_img = cv2.imread(source_image_path, 1)
img_info = mosaic_img.shape
height = img_info[0]-1
width = img_info[1]-1
for m in range(0,height):
for n in range(0,width):
# pixel ->10*10
if m%10 == 0 and n%10==0:
for i in range(0,10):
for j in range(0,10):
(b,g,r) = mosaic_img[m,n]
mosaic_img[i+m,j+n] = (b,g,r)
target_image_path = '/tmp/%s' % new_object_name
cv2.imwrite(target_image_path, mosaic_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
with open(target_image_path, 'rb') as file_object:
fc_test_mosaic_image_bucket.put_object(new_object_name, file_object)
logger.info('upload image %s success.' % target_image_path)
2、本案例使用到的阿里云SDK:
FC OSS触发器SDK链接
OSS SDK链接