全部产品
阿里云办公

触发器简介

更新时间:2018-08-22 18:03:32

触发器是触发函数执行的方式。在事件驱动的计算模型中,事件源是事件的生产者,函数是事件的处理者,而触发器提供了一种集中的和统一的方式来管理不同的事件源。在事件源中,当事件发生时,如果满足触发器定义的规则,事件源则调用触发器所对应的函数。

触发器背景

有些时候,您可能不想通过直接调用的方式来执行函数,例如一个应用可能已经使用对象存储(Object Storage Service,简称OSS)来存放用户上传的图片,可以实现一个函数去下载图片进行处理,并将结果存入 OSS 或者其他服务。如果 OSS 能够帮助我们关注新上传的图片,并且自动的去调用执行相应函数,您就不需要再去自己调用函数了,从而简化了开发和使用流程。OSS 是如何知道关注这些事件并且调用函数计算的函数呢?这就是本文要介绍的触发器(Trigger)的作用。

函数计算提供了一种事件驱动的计算模型。函数的执行是由事件驱动的,函数的执行可以由控制台或 fcli 或 SDK 触发,也可以由其它一些事件源来触发。函数计算触发器描述了一组规则,当某个事件满足这些规则,事件源就会触发相应的函数。目前函数计算支持的事件源可参考 事件源列表,以后也会陆续集成其它事件源。

触发器的基本信息

  • triggerName:触发器名称。
  • triggerType:触发器类型,例如(oss、timer、http)。
  • sourceArn:触发函数执行的资源描述符,有些触发器需要设置(涉及到阿里云其他服务触发函数计算执行的,例如 OSS 触发器,SLS 触发器),有些触发器不需要设置(不涉及到阿里云其他服务触发函数计算执行的,例如定时触发器,HTTP 触发器)。例如 OSS 触发器的 sourceArn 格式为 acs:oss:region:accountId:bucketName
  • invocationRole:触发角色,事件源需要扮演一个角色来触发函数的执行,要求这个角色有触发函数执行的权限
    • 关于事件源角色的详细信息请参考文章 权限简介
  • triggerConfig:触发器的配置信息,各触发器的配置信息请参考该触发器对应的文档。

使用触发器的步骤

  • 创建触发器首先根据需求,创建相应触发器。创建触发器请参考文章 触发器的增删改查

  • 调试触发器创建触发器后,可以在控制台调试触发器,将事件源信息作为 event 传给函数。

下面介绍一个示例,在这个示例中,通过创建 OSS 触发器,实现当对应的 bucket 中有新照片上传时,如果它是以 source/ 为前缀,会自动的触发函数执行 resize 操作,并将生成的图片结果放到 processed/ 目录下。

使用示例

  • 使用前提在 OSS 有一个存储图片的 bucket,该 bucket 下有 source/ 目录,source/ 目录下有 1.jpg 的图片( 用于调试 )。

创建函数并编写代码

想了解更多创建函数介绍可以参考文章 函数的增删改查

代码如下:由于函数计算提供的 Python runtime 中提供了图片处理的库 wand,所以不需要上传第三方依赖。

  1. # -*- coding: utf-8 -*-
  2. import oss2, json
  3. from wand.image import Image
  4. def resize(event, context):
  5. evt = json.loads(event)
  6. creds = context.credentials
  7. # Required by OSS sdk
  8. auth=oss2.StsAuth(
  9. creds.access_key_id,
  10. creds.access_key_secret,
  11. creds.security_token)
  12. evt = evt['events'][0]
  13. bucket_name = evt['oss']['bucket']['name']
  14. endpoint = 'oss-' + evt['region'] + '.aliyuncs.com'
  15. bucket = oss2.Bucket(auth, endpoint, bucket_name)
  16. objectName = evt['oss']['object']['key']
  17. # Processed images will be saved to processed/
  18. newKey = objectName.replace("source/", "processed/")
  19. remote_stream = bucket.get_object(objectName)
  20. if not remote_stream:
  21. return
  22. remote_stream = remote_stream.read()
  23. with Image(blob=remote_stream) as img:
  24. with img.clone() as i:
  25. i.resize(128, 128)
  26. new_blob = i.make_blob()
  27. bucket.put_object(newKey, new_blob)

创建触发器

首先在函数页面点击触发器。

创建触发器然后如图所示,设置触发器。

设置触发器

调试触发器

在测试触发器之前我们可以先通过触发事件调试一下触发器。首先,我们在一个 OSS bucket 中新建一个目录source,在该目录下上传一张照片 1.jpg。然后,设置触发事件。触发事件的 event 设置为 OSS 触发事件。

event

设置好以后点击执行,发现在 bucket 下有了一个新的目录 processed,该目录下有一张处理后的图片 1.jpg。这个过程是模拟 oss bucket 中 source 目录下有 object 被创建时,函数计算的执行过程。

测试触发器

在 OSS 控制台上向触发器中设置的的 bucket 的 source 目录下新上传一个图片,发现会在 processed 目录下新生成一个 resize 过的同名图片。

相关文档