基于Serverless搭建批量打马赛克服务

简介: 本方案实现在阿里云Serverless函数计算服务中搭建图片批量打马赛克服务,具备自动将用户上传到OSS桶内的图片批量打上马赛克功能,实现用户敏感信息自动化处理。


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链接

作者介绍
目录