阿里云函数计算对象存储触发器创建使用

对象存储触发器概述
对象存储是面向企业和开发者的具有高安全、高可靠、大容量、低成本等特点的对象存储产品,用于存储图片、音视频、文档等非结构化数据,并实现在线管理数据。存储空间可以根据业务系统承载情况按需使用、灵活伸缩。支持高并发访问,具有完备的API及SDK接口,帮助用户数据快速上云。对象存储与函数计算集成后,对象存储事件能触发相关函数执行,实现对对象存储中数据进行自定义处理。
 
对象存储触发器背景信息
对象存储和函数计算通过对象存储事件触发器实现无缝集成,您可以编写函数对对象存储事件进行自定义处理,当对象存储系统捕获到指定类型的事件后,对象存储事件触发相应的函数执行。例如,您可以设置函数来处理PutObject事件,当您调用对象存储的PutObject API接口上传图片到对象存储后,相关联的函数会自动被触发来处理该图片。
 
对象存储和函数计算集成后,您可以自由的调用各种函数处理图像或文件等数据,再把结果写回到存储服务中。
 
对象存储触发器事件定义

事件触发类型为创建和删除对象成功后,可触发对象存储发送对象创建成功的事件通知。事件通知配置触发事件类型提供以下配置项:

说明
s3:ObjectCreated:* 对象创建
s3:ObjectCreated:Put 上传对象
s3:ObjectCreated:Post 表单上传对象
s3:ObjectCreated:Copy 拷贝对象
s3:ObjectCreated:CompleteMultipartUpload 在将所有数据分片都上传完成后,调用CompleteMultipartUpload接口来完成整个文件的多块上传
s3:ObjectRemoved:* 使用ObjectRemoved事件类型,在从存储桶中删除一个对象或一批对象时启用通知
s3:ObjectRemoved:Delete 删除对象
s3:ObjectRemoved:DeleteMarkerCreated 标记删除对象

1.   s3:ObjectCreated:*与包含s3:ObjectCreated开头的四种方式,同时配置s3:ObjectCreated:*或s3:ObjectCreated:xxx发生冲突;
 
2.   s3:ObjectRemoved:*与包含s3:ObjectRemoved开头的两种方式,同时配置s3:ObjectRemoved:*或s3:ObjectRemoved:xxx发生冲突;

对象存储触发器触发规则
使用对象存储触发器一定要避免循环触发。一个典型的循环触发场景是对象存储的某个Bucket上传文件触发函数执行,这个函数又生成了一个或多个文件,写回到对象存储的Bucket里,这个写入动作又触发了函数执行,形成了链状循环。
 
上述过程类似于一个无限递归,为了避免这种循环触发函数产生不必要的费用,强烈建议您配置前缀或后缀,例如将触发函数的Bucket目录前缀设置成src/,生成的文件写入的目录前缀设置为dst/,这样生成的文件就不会再次触发函数。
 
一个Bucket的不同触发器如果指定了相同的事件类型,则前缀和后缀不能重复。假如一个触发器配置了对象存储:ObjectCreated:Put事件, source前缀和zip后缀。下表列出了是否可以给该Bucket配置其它触发器。

事件 前缀 后缀 是否合法 说明
ObjectCreated:Put source zip 前后缀一样。
ObjectCreated:Put source 前缀重合,后缀不设置包含了后缀为zip的对象。
ObjectCreated:Put zip 后缀重合,前缀不设置包含了前缀为source的对象
ObjectCreated:Put source1 1zip 不重合。
ObjectCreated:Put source zip1 后缀不重合。
ObjectCreated:Put 1source zip 前缀不重合。
ObjectCreated:Put source zip 事件不同。

对象存储触发器实例
示例简介
 
对象存储触发器可以在对象存储事件发生时自动触发函数执行,然后根据函数的逻辑实现在函数中对对象存储中的数据进行自定义处理。本小节以新对象存入对象存储 Bucket触发函数执行为例,介绍如何配置对象存储触发器。
 
示例场景
 
配置一个对象存储触发器,在触发规则中设置前缀为 tmp/。当有图片存入指定的对象存储 Bucket中的 tmp/目录下,会自动触发函数执行,函数将图片缩放并存放到另外一个Bucket的/目录下。即tmp/trigger.jpg会被处理成/xxxx-trigger.jpg。
 
编写函数
 
如何使用函数计算控制台编写函数,实现对象存储事件触发函数计算自定义处理对象存储 Bucket中的数据。
 
1.   登陆到函数计算控制台
 
2.   在左侧导航栏,单击【应用-函数管理】
 
3.   右侧点击创建函数
 
image.png
 
      【说明】函数可以通过函数模板进行创建
 
1)打开函数计算控制台-点击【函数模板管理】-云服务选择【对象存储服务】
 
2)选择【使用模板】

4、在代码编辑器中编写代码
 
代码示例如下:
 
# -*- coding:utf-8 -*-
import json
import uuid
import os
from PIL import Image
from boto3.session import Session
 
access_key = os.getenv('ACCESS_KEY')
secret_key = os.getenv('SECRET_KEY')
onest_endpoint = os.getenv('ONEST_ENDPOINT')
dest_bucket_name = os.getenv('BUCKET_NAME')
session = Session(access_key, secret_key)
s3_client = session.client('s3', endpoint_url=onest_endpoint)
   
def handler(event, context):
    bucketname = json.dumps(event['bucket_name'])
    objectkey = json.dumps(event['objectKey'])
    uid = str(uuid.uuid4())
    resp = s3_client.get_object(Bucket=str(eval(bucketname)),Key=str(eval(objectkey)))
    with open('/tmp/'+ uid + '-' + str(eval(objectkey)),'wb+') as f:
       f.write(resp['Body'].read())
    im = Image.open('/tmp/'+ uid + '-'+ str(eval(objectkey)))
    (x,y) = im.size
    x_s = 250
    y_s = y * x_s / x
    out = im.resize((x_s,y_s), Image.ANTIALIAS)
    out.save('/tmp/outfile.jpg')
    print 'original size:', x, y, eval(objectkey)
    print 'adjust size:', x_s, y_s, '/tmp/'+ uid +'-'+ str(eval(objectkey))
    resp = s3_client.put_object(Bucket=dest_bucket_name, Key=uid + str(eval(objectkey)), Body=open('/tmp/'+ uid + '-'+ str(eval(objectkey)), 'rb').read())
    return resp
 

【说明】
 
① 需要先开通对象存储服务
 
② 获取对象存储服务的endpoint,access_key,secret_key信息(在对象存储页面获取)
 
③ 需在"配置"页签配置环境变量ONEST_ENDPOINT值、ACCESS_KEY值、SECRET_KEY相关值。如下图所示:
 
④ 用户可以修改x_s,y_s变量自定义图片大小
 
5.event格式说明
 
event是函数计算的入口参数,在指定的对象存储Bucket发生对象创建或对象删除事件时,会将事件数据以JSON格式发送给绑定的函数。具体格式如下所示。
 
{
   "objectKey": "test.txt",
   "bucket_name": "test1",
   "onestConfigType": "cmcc.onest.ObjectCreated:Put"
}
 
 
测试函数
 
完成函数编写后,您需要调试函数以验证代码的正确性。在实际操作过程中当发生对象存储事件时会自动触发函数执行。本节介绍如何通过函数计算控制台模拟对象存储事件调试函数。
 
对象存储事件源会以event的形式作为输入参数传递给函数,您可以将event传给函数模拟触发事件,测试函数代码是否正确。
 
操作步骤
 
a.   登录函数计算控制台。
 
b.   在左侧导航栏,单击应用-函数管理。
 
c.   找到目标服务下的目标函数,单击函数名称。
 
d.   在代码执行页签,单击执行事件下拉框。
 
e.   按照event事件格式在代码编辑器中编写event,详情请参见event格式说明。然后单击确定。如下图:
 
f.   在代码执行页签下,单击执行。
 
执行结果
 
在代码执行页签可以看到执行成功的提示。
 
 

参数

操作

服务类型

选择对象存储触发器

触发器名称

填写自定义的触发器名称。

Bucket列表

选择已创建的对象存储Bucket。

触发事件

选择触发事件定义,详情请参见对象存储触发器事件定义

本示例选择s3:ObjectCreated:Put

触发规则

填写触发规则的前缀和后缀,注意事项请参见对象存储触发器触发规则

 
创建触发器
 
1.   在应用函数管理页面,点击创建的应用,展示函数列表如图:
 
 
 
2.         点击函数名称,进入函数详情页面
 
 
 
3.         点击触发器-创建触发器-选择【对象存储触发器】
 
 
 
4.   在创建触发器区域填写相关信息。然后,单击确定。