全部产品
云市场

OSS事件触发器

更新时间:2019-06-20 16:11:52

对象存储服务(Object Storage Service,简称OSS)是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以使用HTTP RESTful API在互联网任何位置存储和访问数据。

阿里云对象存储和函数计算无缝集成。您可以为各种类型的事件设置处理函数,当OSS系统捕获到指定类型的事件后,会自动调用函数处理。例如,您可以设置函数来处理PutObject事件,当您调用OSS PutObject API上传图片到OSS后,相关联的函数会自动触发来处理该图片。如下图所示,您可以实现图像/语音处理函数,自由的调用各种服务处理图像/音频数据,再把结果写回到多种存储服务中。整个架构中,您只需要专注于函数逻辑的编写,系统将以实时的、可靠的、大规模并行的方式处理海量的数据。

OssTrigerCn

Attention:

使用 OSS 触发器一定要避免 循环触发。一个典型的循环触发场景是 OSS 的某个 Bucket 上传文件触发函数执行,这个函数又生成了一个或多个文件,写回到 OSS 的 Bucket 里,这个写入动作又触发了函数执行,形成了链状循环。

上述过程类似于一个无限递归,为了避免这种循环触发函数产生不必要的费用,强烈建议您配置前/后缀,例如将触发函数的 Bucket 目录前缀设置成 src/,生成的文件写入的目录前缀设置为 dst/ ,这样生成的文件就不会再次触发函数。

OSS事件定义

当OSS系统捕获到相关事件后,会将事件信息编码为JSON字符串,传递给事件处理函数OSS当前的事件触发类型如下表所示。

事件名称 说明 备注
oss:ObjectCreated:PutObject OSS PutObject API创建对象成功后触发函数 PutObject接口用于上传文件,请参考PutObject
oss:ObjectCreated:PutSymlink OSS PutSymlink API创建对象成功后触发函数 Put Symlink接口用于针对OSS上的TargetObject创建符号链接,用户可以通过该符号链接访问TargetObject,请参考PutSymlink
oss:ObjectCreated:PostObject OSS PostObject API创建对象成功后触发函数 Post Object接口用于使用HTML表单上传文件到指定Bucket,请参考PostObject
oss:ObjectCreated:CopyObject OSS CopyObject API创建对象成功后触发函数 CopyObject接口用于拷贝一个在OSS上已经存在的object成另外一个object,请参考CopyObject
oss:ObjectCreated:InitiateMultipartUpload OSS InitialMultipartUpload API执行成功后触发函数 使用Multipart Upload模式传输数据前,必须先调用该接口来通知OSS初始化一个Multipart Upload事件,请参考InitiateMultipartUpload
oss:ObjectCreated:UploadPart OSS UploadPart API执行成功后触发函数 初始化一个 Multipart Upload之后,可以根据指定的Object名和Upload ID来分块(Part)上传数据,请参考UploadPart
oss:ObjectCreated:UploadPartCopy OSS UploadPartCopy API执行成功后触发函数 Upload Part Copy 通过从一个已存在的Object中拷贝数据来上传一个Part,请参考UploadPartCopy
oss:ObjectCreated:CompleteMultipartUpload OSS CompleteMultipartUpload API执行成功后触发函数 在将所有数据Part都上传完成后,必须调用Complete Multipart Upload API来完成整个文件的Multipart Upload。请参考CompleteMultipartUpload
oss:ObjectCreated:AppendObject OSS AppendObject API执行成功后触发函数 AppendObject接口用于以追加写的方式上传文件,请参考AppendObject
oss:ObjectCreated:* 任何上述ObjectCreated类型的API执行成功后都会触发函数 任何上述ObjectCreated类型的API执行成功后都会触发函数
oss:ObjectRemoved:DeleteObject OSS DeleteObject API删除对象成功后触发函数 DeleteObject用于删除某个Object,请参考DeleteObject
oss:ObjectRemoved:DeleteObjects OSS DeleteObjects API删除一批对象成功后触发函数 DeleteObjects用于批量删除文件
oss:ObjectRemoved:AbortMultipartUpload OSS AbortMultipartUpload API中止分块上传成功后触发函数 该接口可以根据用户提供的Upload ID中止其对应的Multipart Upload事件,请参考AbortMultipartUpload

OSS 事件格式示例

OSS事件在触发函数执行时,会以此格式作为函数的输入参数event,您可以在代码中获取事件信息。有关更多event信息,请参考函数的输入参数event

在Node.js runtime中获取Bucket名称的函数代码示例如下:

  1. module.exports.handler = function(event, context, callback) {
  2. var event = JSON.parse(event);
  3. var bucketName = event.events[0].oss.bucket.name;
  4. console.log('bucketName: '+ bucketName);
  5. callback(null, bucketName);
  6. };
  1. {
  2. "events": [
  3. {
  4. "eventName": "ObjectCreated:PutObject",
  5. "eventSource": "acs:oss",
  6. "eventTime": "2017-04-21T12:46:37.000Z",
  7. "eventVersion": "1.0",
  8. "oss": {
  9. "bucket": {
  10. "arn": "acs:oss:cn-shanghai:123456789:bucketname",
  11. "name": "testbucket",
  12. "ownerIdentity": "123456789",
  13. "virtualBucket": ""
  14. },
  15. "object": {
  16. "deltaSize": 122539,
  17. "eTag": "688A7BF4F233DC9C88A80BF985AB7329",
  18. "key": "image/a.jpg",
  19. "size": 122539
  20. },
  21. "ossSchemaVersion": "1.0",
  22. "ruleId": "9adac8e253828f4f7c0466d941fa3db81161e853"
  23. },
  24. "region": "cn-shanghai",
  25. "requestParameters": {
  26. "sourceIPAddress": "140.205.128.221"
  27. },
  28. "responseElements": {
  29. "requestId": "58F9FF2D3DF792092E12044C"
  30. },
  31. "userIdentity": {
  32. "principalId": "123456789"
  33. }
  34. }
  35. ]
  36. }

配置OSS事件触发器

触发器示例

oss_events_trigger.yml

  1. triggerConfig:
  2. events:
  3. - oss:ObjectCreated:PostObject
  4. - oss:ObjectCreated:PutObject
  5. filter:
  6. key:
  7. prefix: source/

触发器参数说明

  • events:OSS事件类型
  • filter:filter为OSS对象过滤参数,满足过滤条件的OSS对象才可以触发函数,包含如下属性:
    • key:过滤器支持过滤对象键(Key),包含如下属性:
      • prefix:匹配前缀
      • suffix:匹配后缀

使用示例

可以通过函数计算控制台推荐)、Fun推荐)、命令行工具fcliSDK四种方式设置函数的OSS事件触发器,下面对这三种方式分别进行介绍:

示例 1. 控制台新建OSS事件触发器

本示例展示了使用控制台设置OSS事件触发器的方式。可以在创建函数的时候设置触发器,也可以在函数创建完成后再设置触发器。

对触发器有困惑的同学可以参考文档使用事件源服务

首先登录函数计算管理控制台,选择相应的区域和服务。如果还未新建服务,请参考创建服务

在创建函数时设置触发器

  1. 单击创建函数,进入创建函数页面,选择空白函数,单击下一步

  2. 选择OSS事件触发器,并按下图进行配置

  3. 创建函数,填写相应信息,选择在线编辑,并粘贴以下python runtime的函数示例代码,单击下一步

    1. # -*- coding: utf-8 -*-
    2. import json
    3. import logging
    4. def handler(event, context):
    5. logger = logging.getLogger()
    6. eventObj = json.loads(event)["events"]
    7. logger.info("eventName: %s" % eventObj[0]["eventName"])
    8. logger.info("bucketName: %s" % eventObj[0]["oss"]["bucket"]["name"])
    9. return "success"
  4. (可选)配置权限,单击下一步,核对信息无误后,单击创建

在函数创建完成后设置触发器

  1. 选中已有的函数,单击 触发器 > 创建触发器

  2. 在创建触发器页面,按下图配置 对象存储触发器,单击 确定

    config_oss_trigger

示例 2. Fun 新建OSS事件触发器

Fun 提供了 OSS 触发器 的支持,可以实现函数触发器的创建与更新。下面,我们介绍使用 Fun 配置 OSS 触发器的步骤。

在项目根目录创建一个 template.yml 文件,并将内容填充为:

  1. ROSTemplateFormatVersion: '2015-09-01'
  2. Transform: 'Aliyun::Serverless-2018-04-03'
  3. Resources:
  4. FunDemo:
  5. Type: 'Aliyun::Serverless::Service'
  6. ossdemo:
  7. Type: 'Aliyun::Serverless::Function'
  8. Properties:
  9. Handler: index.handler
  10. Runtime: python2.7
  11. CodeUri: './'
  12. Events:
  13. oss-trigger-name:
  14. Type: OSS # trigger type
  15. Properties:
  16. BucketName: ossdemobucket # oss bucket name
  17. Events:
  18. - oss:ObjectCreated:*
  19. - oss:ObjectRemoved:DeleteObject
  20. Filter:
  21. Key:
  22. Prefix: source/
  23. Suffix: .png

在项目根目录创建一个 index.js,然后编写相应的逻辑代码就可以了。代码编写完成,直接执行 fun deploy 即可实现部署。完整的示例请参考

如果想在本地单步调试、运行函数,可以参考 开发函数计算的正确姿势 —— 使用 Fun Local 本地运行与调试

更多的配置规则 请参考

Fun 的更多教程 请参考

示例 3. fcli 新建OSS事件触发器

首先,创建一个包含Trigger Config的yaml文件,config.yaml。例如,有对象以put或post方式上传到对应的bucket下的source/目录下,触发函数运行的yaml文件内容如下:

  1. triggerConfig:
  2. events:
  3. - oss:ObjectCreated:PostObject
  4. - oss:ObjectCreated:PutObject
  5. filter:
  6. key:
  7. prefix: source/

在对应的函数目录下创建触发器

  1. mkt test_oss_trigger -t oss -r acs:ram::account_id:role/AliyunOSSEventNotificationRole -s acs:oss:cn-region:account_id:bucketName -c config.yaml
  • -r —invocation-role string设置触发角色。
  • -s —source-arn string事件源的资源符号,例如acs:oss:cn-shanghai:12345678:myBucketName。
  • -c —trigger-config string设置trigger配置文件。
  • -t —type string 触发器类型,默认是oss。

更多fcli使用,请参考fcli开发指南

示例 4. SDK编程新建OSS事件触发器

  1. client = fc2.Client(
  2. endpoint='<Your Endpoint>',
  3. accessKeyID='<Your AccessKeyID>',
  4. accessKeySecret='<Your AccessKeySecret>')
  5. service_name = 'serviceName'
  6. function_name = 'functionName'
  7. trigger_name = 'triggerName'
  8. trigger_type = 'oss'
  9. source_arn = 'acs:oss:{0}:{1}:{2}'.format('<region>', '<account_id>', '<self.code_bucket>')
  10. invocation_role = 'acs:ram::<Your Account ID>:role/<Your Invocation Role>'
  11. trigger_config = {
  12. 'events': ['oss:ObjectCreated:*'],
  13. 'filter': {
  14. 'key': {
  15. 'prefix': 'source',
  16. }
  17. }
  18. }
  19. client.create_trigger(service_name, function_name, trigger_name, trigger_type, trigger_config, source_arn, invocation_role)