事件通知

介绍

NOS 对象存储推出重磅功能,支持特定事件的通知(回调)。用户可以通过在 NOS 上创建事件通知的规则,来关注对象存储资源上产生的事件,并且以消息的方式主动推送到指定的接收端。

注意事项

  • 事件通知规则创建完,约 2 分钟后生效
  • 配置重叠的事件规则时,会匹配所有规则,匹配到一条规则产生一条消息
  • 事件通知规则只能创建和删除,目前不支持更新

作用

  • 如果您对您的资源进行某些操作,而您又希望在其它模块关注这些操作的话,您就可以创建对应的规则,使得这些操作发生时,能够主动通知到其它模块。
  • 如果您需要对操作进行统计的话,也可以通过事件通知的方式进行数据分析,查看一段时间内某个操作发生的次数,据此来分析您的业务最近有什么样的发展趋势。
  • 您也可以通过事件通知监控您的资源上发生的某些操作的 QPS 等等指标。

NOS 事件通知

NOS 支持将相关操作产生的事件通知到指定的接收端。其中:

  • 失败的操作目前不会触发事件通知
  • NOS 不对事件进行保存,重试发送不成功的会丢弃
  • 产生事件后,如果接收端没启动,事件也会丢弃

NOS 事件类型

NOS 支持的事件类型包括:

事件类型说明
Put Object上传数据到 NOS
Put Object CopyNOS 资源拷贝
Put Object MoveNOS 桶内资源重命名
Complete MultiPart完成分块上传
Delete Object删除对象
Delete Multiple Objects批量删除对象

Attention

请求失败时,目前不会触发事件通知

举例说明如何使用 NOS 事件通知

某个用户开通了 NOS 服务,从桶概览页面可以进入事件通知管理,于是他就可以创建下面这样的事件通知规则:

  • 规则名称:event-test-rule
  • 资源描述:event-test/
  • 事件类型:PutObject
  • 回调认证:关闭
  • 单条消息最大数量:30
  • 接收终端:event-endpoint

在控制台可以很容易的管理事件通知,具体操作有:

1、在桶概览页

如上图所示,点击事件通知管理,进入下图所示页面:

2、创建规则

点击上述「创建时间通知规则」按钮,进入下图所示页面:

此处要填写具体信息有:

  • 规则名称:1-63 个小写字母、数字、中划线组成,字母或数字结尾
  • 资源描述:如果选择了一个桶,则匹配该桶中前后缀能够匹配的资源
  • 事件类型:可以多选
  • 回调认证:默认关闭,开启后,每次发往接收终端的 POST 请求会带认证头部信息
  • 消息格式:推送的消息格式,支持 xml 和 json
  • 单条消息最大事件数量:只是用来限制每次发往接收终端的最大消息数目,当消息没达到最大消息数量时,不会阻塞
  • 接收终端:支持 HTTP 请求的服务器,目前只支持配置一个终端

点击「立即创建」就会创建好规则,并返回事件通知管理界面。

3、删除规则

点击上面的删除按钮,该规则删除。

NOS 事件通知发送接口

在用户配置规则中会携带接收终端,NOS 事件通知会将对应事件发往接收终端。如果用户配置的终端为:http://nos.eastchina1.126.net

语法

POST http://nos.eastchinal.126.net HTTP/1.1
Date: ${date}
Content-Md5:${md5}
Content-Type: ${type}
Authorization: ${signature}
参数说明是否必须
Date发送时间
Content-Md5Body 对应的 MD5
Content-Type请求的数据类型,目前只支持 application/xml
Authorization签名信息,用来表明该请求来自 NOS否,如果用户开启认证,则会携带

NOS 事件通知认证方法

事件最终会发给用户配置的接收终端的,如果用户接收终端的安全性要求比较高,建议开启回调认证功能,每次 NOS 发送消息的时候就会构造一个 Authorization 头用来表明该请求来自 NOS,用户通过对构造 Authorization 头进行验证,可以提高接收终端的安全性,从而防止别人冒充 NOS 的请求进行攻击。但由于解析 Authorization 头相对复杂,对安全性要求不高的可以关闭该功能。

构造 Authorization 头的具体方法为:

encodeStringToSign = Base64(HTTP-Verb + "\n"
+ Content-MD5 + "\n"
+ Content-Type + "\n"
+ Date + "\n"
+ Url)

Authorization = AccessKey + ":"
+ Base64(HMAC-SHA256(SecretKey, encodeStringToSign)) + ":"
+ encodeStringToSign
  • HTTP-Verb 表示 HTTP 请求类型,事件通知为 POST
  • Content-MD5 表示内容数据的 MD5 值
  • Content-Type表示内容的类型,为 application/xml 或者 application/json
  • Date 表示此次操作的时间,示例:Mon, 02 Jan 2006 15:04:05 Asia/Shanghai
  • Url 表示发送的 URL 路径,用户填写的 CallbackUrl

Note

AccessKey 和 SecretKey 是注册时网易云颁发给用户的,你可以在网易云「用户中心」的「Access Key」查看并管理你的 Key

NOS 事件通知消息格式

NOS 的事件通知消息内容具体含义如下:

参数说明
ReceiptHandle本次获取的消息对应的标记
MessageBodyMD5消息对应的MD5,base64前的MD5
MessageBody消息的具体内容base64后的结果

xml 格式例子:

<Message>
<ReceiptHandle>123455</ReceiptHandle>
<MessageBodyMD5>C5DD56A39F5F7BB8B3337C6D11B6D8C7</MessageBodyMD5>
<MessageBody>This is a test message</MessageBody>
</Message>
<Message>
<ReceiptHandle>123456</ReceiptHandle>
<MessageBodyMD5>C5DD56A39F5F7BB8B3337C6D11B6D8C7</MessageBodyMD5>
<MessageBody>This is a test message</MessageBody>
</Message>

json 格式例子:

[
{
"ReceiptHandle":"0",
"MessageBodyMD5":"827ccb0eea8a706c4c34a16891f84e7b",
"MessageBody":"MTIzNDU="
},
{
"ReceiptHandle":"1",
"MessageBodyMD5":"9b2e9d2b80e556dc50d8d0e017d5bc2d",
"MessageBody":"SSBhbSBtZXNzYWdlMQ=="
},
{
"ReceiptHandle":"2",
"MessageBodyMD5":"8e9415c13debac0448738fd7445cf675",
"MessageBody":"SSBhbSBtZXNzYWdlMg=="
}
]

其中MessageBody是消息的base64(MIME编码)加密后的结果,解码后对应的格式如下:

xml 格式例子:

<Record>
<eventVersion>1.0</eventVersion>
<eventSource>nos:proxy</eventSource>
<nosRegion>hz</nosRegion>
<eventTime>The time, in ISO-8601 format, for example, 1970-01-01T00:00:00.000Z, when nos finished processing the request</eventTime>
<eventName>event-type</eventName>
<userIdentity>
<principalId>nos-customer-ID-of-the-user-who-caused-the-event</principalId>
</userIdentity>
<requestParameters>
<sourceIPAddress>ip-address-where-request-came-from</sourceIPAddress>
</requestParameters>
<responseElements>
<x-nos-request-id>ip-address-where-request-came-from</x-nos-request-id>
</responseElements>
<nos>
<bucket>
<name>bucket-name</name>
<ownerIdentity>nos-customer-ID-of-the-bucket-owner</ownerIdentity>
</bucket>
<objectList>
<object>
<key>object-key</key>
<size>object-size</size>
<eTag>object-eTag</eTag>
</object>
<object>
<key>object-key1</key>
<size>object-size1</size>
<eTag>object-eTag1</eTag>
</object>
</objectList>
</nos>
</Record>

json 格式例子:

{
"Record": {
"eventVersion": "1.0",
"eventSource": "nos:proxy",
"nosRegion": "HZ",
"eventTime": "2017-01-09T13:04:25 +0800",
"eventName": "PutObject",
"userIdentity": {
"principalId": "61c5a0fbb4164aea82d58b2e3ed1cca2"
},
"requestParameters": {
"sourceIPAddress": "10.165.120.13"
},
"responseElements": {
"x-nos-request-id": "d97170620aa500000159819cf6678b72"
},
"nos": {
"bucket": {
"name": "sdktest-public",
"ownerIdentity": "61c5a0fbb4164aea82d58b2e3ed1cca2"
},
"objectList": [
{
"key": "test1",
"size": 9,
"eTag": "552e6a97297c53e592208cf97fbb3b60"
}
]
}
}
}