============== 事件通知 ============== 介绍 ----- NOS对象存储推出重磅功能,支持特定事件的通知(回调)。用户可以通过在NOS上创建事件通知的规则,来关注对象存储资源上产生的事件,并且以消息的方式主动推送到指定的接收端。 注意事项 --------- * 事件通知规则创建完,约2分钟后生效 * 配置重叠的事件规则时,会匹配所有规则,匹配到一条规则产生一条消息 * 事件通知规则只能创建和删除,目前不支持更新 作用 ------ * 如果您对您的资源进行某些操作,而您又希望在其它模块关注这些操作的话,您就可以创建对应的规则,使得这些操作发生时,能够主动通知到其它模块。 * 如果您需要对操作进行统计的话,也可以通过事件通知的方式进行数据分析,查看一段时间内某个操作发生的次数,据此来分析您的业务最近有什么样的发展趋势。 * 您也可以通过事件通知监控您的资源上发生的某些操作的QPS等等指标。 NOS事件通知 ------------- NOS支持将相关操作产生的事件通知到指定的接收端。其中: * 失败的操作目前不会触发事件通知 * NOS不对事件进行保存,重试发送不成功的会丢弃 * 产生事件后,如果接收端没启动,事件也会丢弃 NOS事件类型 ````````````````` NOS支持的事件类型包括: 注意:请求失败时,目前不会触发事件通知 .. list-table:: :widths: 10 40 :header-rows: 1 * - 事件类型 - 说明 * - Put Object - 上传数据到NOS * - Put Object Copy - NOS资源拷贝 * - Put Object Move - NOS桶内资源重命名 * - Complete MultiPart - 完成分块上传 * - Delete Object - 删除对象 * - Delete Multiple Objects - 批量删除对象 * - Delete Bucket - 删除桶 举例说明如何使用NOS事件通知 ```````````````````````````````` 某个用户开通了NOS服务,从桶概览页面可以进入事件通知管理,于是他就可以创建下面这样的事件通知规则: * 规则名称:event-test-rule * 资源描述:event-test/ * 事件类型:PutObject * 回调认证:关闭 * 单条消息最大数量:30 * 接收终端:event-endpoint 在控制台可以很容易的管理事件通知,具体操作有: * 进入事件通知管理 .. image:: ./img/23.png 如上图所示,点击事件通知管理,进入下图所示页面。 .. image:: ./img/24.png * 创建规则 .. image:: ./img/27.png 点击上述"创建事件通知规则"按钮,进入下图所示页面。 .. image:: ./img/25.png 此处要填写具体信息有: * 规则名称:1-63个小写字母、数字、中划线组成,字母或数字结尾 * 资源描述:如果选择了一个桶,则匹配该桶中前后缀能够匹配的资源 * 事件类型:可以多选 * 回调认证:默认关闭,开启后,每次发往接收终端的POST请求会带认证头部信息 * 消息格式:推送的消息格式,支持xml和json * 单条消息最大事件数量:只是用来限制每次发往接收终端的最大消息数目,当消息没达到最大消息数量时,不会阻塞 * 接收终端:支持HTTP请求的服务器,目前只支持配置一个终端 点击"立即创建"就会创建好规则,并返回事件通知管理界面 * 删除规则 .. image:: ./img/26.png 点击上面的删除按钮,该规则删除 NOS事件通知发送接口 ````````````````````````` 在用户配置规则中会携带接收终端,NOS事件通知会将对应事件发往接收终端。如果用户配置的终端为:http://nos.eastchina1.126.net. * 语法 .. code:: POST http://nos.eastchinal.126.net/message HTTP/1.1 Date: ${date} Content-Md5:${md5} Content-Type: ${type} Authorization: ${signature} .. list-table:: :widths: 10 40 10 :header-rows: 1 * - 参数 - 说明 - 是否必须 * - Date - 发送时间 - 是 * - Content-Md5 - Body对应的MD5 - 是 * - Content-Type - 请求的数据类型,目前只支持application/xml - 是 * - Authorization - 签名信息,用来表明该请求来自NOS - 否,如果用户开启认证,则会携带 NOS事件通知认证方法 ````````````````````````` 事件最终会发给用户配置的接收终端的,如果用户接收终端的安全性要求比较高,建议开启回调认证功能,每次NOS发送消息的时候就会构造一个Authorization头用来表明该请求来自NOS,用户通过对构造Authorization头进行验证,可以提高接收终端的安全性,从而防止别人冒充NOS的请求进行攻击。但由于解析Authorization头相对复杂,对安全性要求不高的可以关闭该功能。 构造Authorization头的具体方法为: .. code:: java 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 注意:AccessKey和SecretKey是注册时蜂巢颁发给用户的,你可以在蜂巢「用户中心」的「Access Key」查看并管理你的 Key NOS事件通知消息格式 ````````````````````````` NOS的事件通知消息内容具体含义如下: .. list-table:: :widths: 10 40 :header-rows: 1 * - 参数 - 说明 * - ReceiptHandle - 本次获取的消息对应的标记 * - MessageBodyMD5 - 消息对应的MD5,base64前的MD5 * - MessageBody - 消息的具体内容base64后的结果 xml格式例子: .. code:: xml 123455 C5DD56A39F5F7BB8B3337C6D11B6D8C7 This is a test message 123456 C5DD56A39F5F7BB8B3337C6D11B6D8C7 This is a test message json格式例子: .. code:: xml [ { "ReceiptHandle":"0", "MessageBodyMD5":"827ccb0eea8a706c4c34a16891f84e7b", "MessageBody":"MTIzNDU=" }, { "ReceiptHandle":"1", "MessageBodyMD5":"9b2e9d2b80e556dc50d8d0e017d5bc2d", "MessageBody":"SSBhbSBtZXNzYWdlMQ==" }, { "ReceiptHandle":"2", "MessageBodyMD5":"8e9415c13debac0448738fd7445cf675", "MessageBody":"SSBhbSBtZXNzYWdlMg==" } ] 其中MessageBody是消息的base64加密后的结果,解码后对应的格式如下: xml格式例子: .. code:: xml 1.0 nos:proxy hz The time, in ISO-8601 format, for example, 1970-01-01T00:00:00.000Z, when nos finished processing the request event-type nos-customer-ID-of-the-user-who-caused-the-event ip-address-where-request-came-from ip-address-where-request-came-from bucket-name nos-customer-ID-of-the-bucket-owner object-key object-size object-eTag object-key1 object-size1 object-eTag1 json格式例子: .. code:: xml { "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" } ] } } }