Skip to main content

OSS 触发器(对象存储)

OSS 用于存储一些资源文件,是阿里云的资源存储产品。 当 OSS 中有文件创建,更新,对应的函数就会被触发而执行。

使用方式#

import { Provide, Inject, ServerlessTrigger, ServerlessTriggerType } from '@midwayjs/decorator';import { Context, FC } from '@midwayjs/faas';
@Provide()export class HelloAliyunService {  @Inject()  ctx: Context;
  @ServerlessTrigger(ServerlessTriggerType.OS, {    bucket: 'ossBucketName',    events: ['oss:ObjectCreated:*', 'oss:ObjectRemoved:DeleteObject'],    filter: {      prefix: 'filterdir/',      suffix: '.jpg',    },  })  async handleOSSEvent(event: FC.OSSEvent) {    // xxx  }}

在 npm run deploy 后,即可。

OSS 触发器配置#

属性名类型描述
bucketstring对象存储的 bucket 名
eventsstring[]触发函数执行的事件名
filter{

prefix: string;    suffix: string;  } | 对象过滤参数,满足过滤条件的 对象才可以触发函数,包含一个配置属性 key,表示过滤器支持过滤的对象键 (key)。 | | | | |

示例:

监听对象创建和对象删除时的事件

@ServerlessTrigger(ServerlessTriggerType.OS, {  bucket: 'ossBucketName',  events: ['oss:ObjectCreated:*', 'oss:ObjectRemoved:DeleteObject'],  filter: {    prefix: 'filterdir/',    suffix: '.jpg',  },})

事件结构#

OSS 消息返回的结构如下,在 FC.OSSEvent 类型中有描述。

{  "events": [    {      "eventName": "ObjectCreated:PutObject",      "eventSource": "acs:oss",      "eventTime": "2017-04-21T12:46:37.000Z",      "eventVersion": "1.0",      "oss": {        "bucket": {          "arn": "acs:oss:cn-shanghai:123456789:bucketname",          "name": "testbucket",          "ownerIdentity": "123456789",          "virtualBucket": ""        },        "object": {          "deltaSize": 122539,          "eTag": "688A7BF4F233DC9C88A80BF985AB7329",          "key": "image/a.jpg",          "size": 122539        },        "ossSchemaVersion": "1.0",        "ruleId": "9adac8e253828f4f7c0466d941fa3db81161e853"      },      "region": "cn-shanghai",      "requestParameters": {        "sourceIPAddress": "140.205.128.221"      },      "responseElements": {        "requestId": "58F9FF2D3DF792092E12044C"      },      "userIdentity": {        "principalId": "123456789"      }    }  ]}

本地开发#

事件类型的函数本地无法使用 dev 开发,只能通过运行 npm run test 进行测试执行。

本地测试#

和 HTTP 测试不同,通过 createFunctionApp 创建函数 app,通过 getServerlessInstance 获取整个类的实例,从而调用到特定方法来测试。

可以通过 createOSSEvent 方法快速创建平台传入的结构。

import { createFunctionApp, close } from '@midwayjs/mock';import { Framework, Application } from '@midwayjs/serverless-app';import { HelloAliyunService } from '../src/function/hello_aliyun';import { createOSSEvent, createInitializeContext } from '@midwayjs/serverless-fc-trigger';import { join } from 'path';
describe('test/hello_aliyun.test.ts', () => {  let app: Application;  let instance: HelloAliyunService;
  beforeAll(async () => {    // create app    app = await createFunctionApp<Framework>(join(__dirname, '../'), {      initContext: createInitializeContext(),    });    instance = await app.getServerlessInstance<HelloAliyunService>(HelloAliyunService);  });
  afterAll(async () => {    await close(app);  });
  it('should get result from oss trigger', async () => {    expect(await instance.handleOSSEvent(createOSSEvent())).toEqual('hello world');  });});

注意#

  • 1、一个 bucket 的一个前缀下只能支持配置一个触发器,如果配置多个会出现 message: event source 'oss' returned error: Cannot specify overlapping prefix and suffix with same event type.  的报错