文档首页 > > 用户指南> 事件通知

事件通知

分享
更新时间:2021/01/06 GMT+08:00

SMN通知

消息通知服务(SMN)是可靠,可扩展,海量的消息通知服务。它大大简化系统的耦合,能够根据用户的需求,向订阅终端主动推送消息,订阅终端可以是电子邮件、短信等。

OBS依赖SMN提供消息通知功能。您可以将OBS桶中对象的上传、删除等操作事件通过SMN发送给指定的订阅终端,以实时掌握OBS桶中发生的关键事件。例如,配置SMN通知,规定当用户往桶中上传对象时,SMN发送消息通知到指定的邮箱。

您可以将通知配置为按对象名称的前缀和后缀进行筛选。例如,您可以添加一个事件,以便仅在将带有“.jpg”后缀的图像文件添加到存储桶时收到通知。或者,您也可以添加一个事件,该配置仅在将带有前缀为“images/”的对象添加到存储桶时收到通知。

图1 SMN通知示意图

OBS支持的事件类型

OBS可以发布以下类型的事件,您需要在通知配置中指定这些事件类型。

表1 受支持的事件类型

事件类型

描述

ObjectCreated:*(所有上传操作)

ObjectCreated:Put(上传对象)

ObjectCreated:Post(使用浏览器上传对象)

ObjectCreated:Copy(拷贝对象)

ObjectCreated:CompleteMultipartUpload(合并段)

OBS可以通过PUT、POST和COPY之类的API创建对象,配置与之对应的事件类型,您会在使用特定API创建对象时收到通知。您也可以使用ObjectCreated:*事件类型请求所有的创建对象通知。

说明:

您不会从失败的操作收到事件通知。

ObjectRemoved:*(所有删除操作)

ObjectRemoved:Delete(删除对象)

ObjectRemoved:DeleteMarkerCreated(产生了deletemarker对象)

通过使用ObjectRemoved事件类型,您可以在从存储中删除一个对象或一批对象时启用通知。

您可以使用ObjectRemoved:Delete事件类型请求在删除对象或永久删除受版本控制对象时收到通知。或者,也可以使用ObjectRemoved:DeleteMarkerCreated请求在为受版本控制对象创建删除标记时收到通知。您还可以使用ObjectRemoved:*请求在每次删除对象时收到通知。

说明:

您不会从生命周期策略中的自动删除或失败的操作收到事件通知。

OBS支持的发布事件的目标

OBS可以将事件通知消息发布至SMN主题,您需要授予OBS将消息发布到目标的权限,并在通知配置中指定这些目标的URN值。

如何启用事件通知

启用通知是桶级别的操作,OBS会将您设置的事件通知配置以XML形式存储在桶子资源中。默认情况下,不为任何类型的事件启用通知,即每个桶最初的事件通知配置信息为空。

要为特定类型的事件启用通知,则需要添加相应的XML配置,该配置可标识您希望OBS发布通知的事件类型和您希望将通知发布到的目标,例如:

  • 将事件消息发布到SMN主题-要将SMN主题设置为特定事件类型的通知目标,请添加TopicConfiguration。
<NotificationConfiguration>
  <TopicConfiguration>
    <Id>optional-id-string</Id>
    <Topic>topic-urn</Topic>
    <Event>event-type</Event>
    <Event>event-type</Event>
     ...
  </TopicConfiguration>
   ...
</NotificationConfiguration>

要移除桶上所有的通知配置,请将<NotificationConfiguration>元素设置为空。

使用对象键名称筛选事件通知

您可以将通知配置为按对象键名称的前缀和后缀进行筛选。例如,您可以设置一项配置,仅在将带有".jpg"扩展名的对象添加到桶时发布通知。

OBS以XML形式存储通知配置,您可以在XML结构中使用Filter元素,定义按对象键名称前缀和后缀对事件进行筛选的通知规则。使用Filter的通知配置无法定义采用重叠前缀、重叠后缀或前缀和后缀重叠的筛选规则,以下是采用对象键名称筛选事件通知的示例:

  • 采用对象键名称筛选的有效通知配置示例

    以下信息包含用于标识OBS发布ObjectCreated:Put事件类型的通知至SMN主题的配置。每当出现以前缀image和后缀jpg命名的对象被上传(PUT)至桶时,就会发布该事件通知。

    <NotificationConfiguration>
      <TopicConfiguration>
        <Id>01</Id>
        <Filter>
          <Object>
            <FilterRule>
              <Name>prefix</Name>
              <Value>image</Value>
            </FilterRule>
            <FilterRule>
              <Name>suffix</Name>
              <Value>jpg</Value>
            </FilterRule>
          </Object>
        </Filter>
        <Topic>urn:smn:southchina:11aa22bb:notification</Topic>
        <Event>ObjectCreated:Put</Event>
      </TopicConfiguration>
    </NotificationConfiguration>

    以下通知配置有多个非重叠前缀。该配置做出以下定义:以images为前缀的对象上传到桶时的事件通知将发布到topic-A,以videos为前缀的对象上传到桶时的事件通知将发布到topic-B。

    <NotificationConfiguration>
      <TopicConfiguration>
        <Id>01</Id>
        <Filter>
          <Object>
            <FilterRule>
              <Name>prefix</Name>
              <Value>images</Value>
            </FilterRule>
          </Object>
        </Filter>
        <Topic>urn:smn:southchina:11aa22bb:topic-A</Topic>
        <Event>ObjectCreated:Put</Event>
      </TopicConfiguration>
      <TopicConfiguration>
        <Id>02</Id>
        <Filter>
          <Object>
            <FilterRule>
              <Name>prefix</Name>
              <Value>videos</Value>
            </FilterRule>
          </Object>
        </Filter>
        <Topic>urn:smn:southchina:11aa22bb:topic-B</Topic>
        <Event>ObjectCreated:Put</Event>
      </TopicConfiguration>
    </NotificationConfiguration>

    以下通知配置有多个非重叠后缀。该配置做出以下定义:对所有上传(PUT)至桶的.jpg对象都发布通知到topic-A,而所有的.png对象都发布通知到topic-B。后缀.jpg和.png是不重叠的后缀,即使它们的最后一个字母是相同的。

    <NotificationConfiguration>
      <TopicConfiguration>
        <Id>01</Id>
        <Filter>
          <Object>
            <FilterRule>
              <Name>suffix</Name>
              <Value>.jpg</Value>
            </FilterRule>
          </Object>
        </Filter>
        <Topic>urn:smn:southchina:11aa22bb:topic-A</Topic>
        <Event>ObjectCreated:Put</Event>
      </TopicConfiguration>
      <TopicConfiguration>
        <Id>02</Id>
        <Filter>
          <Object>
            <FilterRule>
              <Name>suffix</Name>
              <Value>.png</Value>
            </FilterRule>
          </Object>
        </Filter>
        <Topic>urn:smn:southchina:11aa22bb:topic-B</Topic>
        <Event>ObjectCreated:Put</Event>
      </TopicConfiguration>
    </NotificationConfiguration>
  • 采用无效前缀/后缀重叠的通知配置示例

    大多数情况下,使用Filter的通知配置无法使用重叠配置前缀、重叠后缀或前缀和后缀的重叠组合为相同事件定义筛选规则(如果后缀不重叠,您可以使用重叠前缀)。您可以将重叠对象键名称筛选规则用于不同的事件类型,例如:您可以创建一个通知配置,该配置将前缀image用于ObjectCreated:Put事件类型,并将前缀image用于ObjectDeleted:*事件类型。

    没有Filter属性的配置信息默认与任何前缀和后缀都匹配。以下通知配置因具有重叠前缀而失效(如果在此示例中使用后缀而不是前缀,配置则会因具有重叠后缀无效)。

    <NotificationConfiguration>
      <TopicConfiguration>
        <Topic>urn:smn:southchina:11aa22bb:topic-A</Topic>
        <Event>ObjectCreated:*</Event>
      </TopicConfiguration>
      <TopicConfiguration>
        <Filter>
          <Object>
            <FilterRule>
              <Name>prefix</Name>
              <Value>abc</Value>
            </FilterRule>
          </Object>
        </Filter>
        <Topic>urn:smn:southchina:11aa22bb:topic-B</Topic>
        <Event>ObjectCreated:*</Event>
      </TopicConfiguration>
    </NotificationConfiguration>

    以下配置由于具有重叠后缀无效。如果某个给定的字符串能够同时以这两个后缀结尾,则认为后缀重叠,一个字符串能够以jpg和pg结尾,因此后缀重叠(对于前缀,此结论同样成立)。

    <NotificationConfiguration>
      <TopicConfiguration>
        <Filter>
          <Object>
            <FilterRule>
              <Name>suffix</Name>
              <Value>jpg</Value>
            </FilterRule>
          </Object>
        </Filter>
        <Topic>urn:smn:southchina:11aa22bb:topic-A</Topic>
        <Event>ObjectCreated:*</Event>
      </TopicConfiguration>
      <TopicConfiguration>
        <Filter>
          <Object>
            <FilterRule>
              <Name>suffix</Name>
              <Value>pg</Value>
            </FilterRule>
          </Object>
        </Filter>
        <Topic>urn:smn:southchina:11aa22bb:topic-B</Topic>
        <Event>ObjectCreated:Put</Event>
      </TopicConfiguration>
    </NotificationConfiguration>

事件通知消息结构

OBS发布的事件通知消息是具有以下结构的JSON消息。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
{  
    "Records":[
        {
            "eventVersion":"", //版本号,目前为"3.0"
            "eventSource":"", //消息源,固定为"OBS"
            "eventRegion":"", //事件所在的region
            "eventTime":"", //事件时间,格式为ISO-8601,示例:2020-07-10T09:24:11.418Z
            "eventName":"", //触发事件通知的事件名
            "userIdentity":{
                "ID":"" //触发事件的用户对应的计费ID
            },
            "requestParameters":{
                "sourceIPAddress":"" //请求的源IP
            },
            "responseElements":{
                "x-obs-request-id":"", //请求对应的requestid
                "x-obs-id-2":"" //帮助定位问题的特殊符号
            },
            "obs":{
                "Version":"1.0",
                "configurationId":"", //此事件匹配的OBS中事件通知规则的名称
                "bucket":{
                    "name":"examplebucket",
                    "ownerIdentity":{
                        "ID":"" //桶拥有者的账号ID
                    },
                    "bucket":"" //桶名
                },
               "object":{
                    "key":"", //对象名
                    "eTag":"", //对象的etag
                    "size": , //对象的大小
                    "versionId":"null", //对象的版本ID
                    "sequencer":""  //确定某个特定对象事件顺序的标识
                }
            }
        }
    ]
}

请注意以下几点:

  • 如果您希望通过练习OBS支持跟踪请求,则responseElements键值很有用,x-obs-request-id和x-obs-id-2都可帮助OBS跟踪单个请求。这些值与OBS为响应您原始请求而返回的值相同。
  • 提供事件中涉及的桶和对象的相关信息。请注意,对象键名称值进行了URL编码,例如:“TEST/中 文.jpg”将变为“TEST%2F%E4%B8%AD+%E6%96%87%2F.jpg”。

    二次开发时,如果使用OBS SDK下载此对象 ,则需要先对对象名进行URL解码,再调用下载接口。而如果直接使用浏览器访问此对象,则不需要解码。

  • sequencer键提供了确定事件顺序的方法。无法保证事件通知按事件发生的顺序到达,但是,来自创建对象(PUT)和删除对象的事件通知包含sequencer,可用于确定给定对象键的事件顺序。如果将来自同一对象键上的两个事件通知的十六进制sequencer字符串进行比较,您会发现sequencer值较大的事件通知是后发生的。
    1. sequencer不能用于确定不同对象键上的事件顺序。
    2. sequencer表示的事件顺序仅供参考,不能用于高可靠性系统。

消息示例:

  • 测试消息-当您在桶上配置事件通知时,OBS会发送以下测试消息
    {  
       "Service":"OBS",
       "Event":"TestEvent",
       "Time":"1970-01-01T00:00:00.000Z",
       "Bucket":"examplebucketname",
       "RequestId":"0002F4BCF6000001563B064B17B2094D",
       "HostId":"2Zf+b9AmbaBgNQ+YE8XU2j87DZaBNxu4TaMiOCTqpmkC2SA9ouf8TpB2SY5j3i4"
    }
  • 使用PUT请求创建对象时的示例消息-以下消息是OBS发布的ObjectCreated:Put事件的消息示例
    {  
        "Records":[
            {
                "eventVersion":"3.0",
                "eventSource":"OBS",
                "eventRegion":"cn-east-3",
                "eventTime":"2018-06-26T14:37:05.468Z",
                "eventName":"ObjectCreated:Put",
                "userIdentity":{
                    "ID":"71f3901173514e6988115ea2c26d1999"
                },
                "requestParameters":{
                    "sourceIPAddress":"104.55.173.69"
                },
                "responseElements":{
                    "x-obs-request-id":"9006000001643C86D03C300BE8860FA7",
                    "x-obs-id-2":"2+/Ucr6uinCJAbUejWyQ+rhxkuf/K/9uoaXuewIi/SE9j4tU5LwaXTTlD1gvMv2o"
                },
                "obs":{
                    "Version":"1.0",
                    "configurationId":"ConfigurationId",
                    "bucket":{
                        "name":"examplebucket",
                        "ownerIdentity":{
                            "ID":"b4bf1b36d9ca43d984fbcb9491b6fce9"
                        },
                        "bucket":"examplebucket"
                    },
                    "object":{
                        "key":"object0001.txt",
                        "eTag":"3b9680702b9a12733c5490d1b15c7607",
                        "size":538,
                        "versionId":"null",
                        "sequencer":"000000001643C86D06576F5320000000"
                    }
                }
            }
        ]
    }

    由于潜在的Internet问题或电子邮件传送限制,有时通知可能无法成功送达HTTP或电子邮件终端节点。

使用方式

OBS支持通过控制台、API、SDK方式配置SMN通知。

支持的使用方式

参考文档

控制台

配置SMN通知

SDK

OBS支持多种语言SDK,请从SDK概述页面选择进入对应的开发指南查阅。

API

设置桶的消息通知配置

分享:

    相关文档

    相关产品

文档是否有解决您的问题?

提交成功!非常感谢您的反馈,我们会继续努力做到更好!
反馈提交失败,请稍后再试!

*必选

请至少选择或填写一项反馈信息

字符长度不能超过200

提交反馈 取消

如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨

智能客服提问云社区提问