使用EG发送OBS事件通知
使用场景
在对桶及桶中的对象执行某些操作后,如果您希望能够及时感知,进而触发后续操作流程,那么可以通过EG事件通知来实现。
例如:您需要向源桶中上传图片后,自动触发后续流程执行为图片添加水印,并将添加水印后的图片存放至目标桶中,那么可以通过配置EG事件通知来实现。
OBS结合EG使用原理
对象存储服务(Object Storage Service,OBS)用于存储文件、图片、视频等数据,通过对文件、图片、视频等对象执行上传、修改、删除等操作来产生OBS事件;事件网格服务(EventGrid,EG)捕获到OBS事件后,会按照事先配置好的规则自动触发后续操作任务或流程执行。因此,OBS和EG的结合使用,即OBS“自动发送通知”,EG“自动派发任务”,期间无需人工干预。
EG主要由事件源、通道、事件目标组成:
- 事件源:用户请求操作云服务资源产生云服务事件作为事件源。
- 通道:事件的中转站,负责接收来自云服务的事件。
- 事件目标:事件的处理终端,受来自通道的云服务事件触发,促使其他云服务执行一些操作或流程(如:使用函数工作流服务为图片添加水印并存储至OBS桶中)。
OBS结合EG使用原理如图1所示。
OBS结合EG事件通知使用的原理如下:
- 管理员提前创建EG通知,配置好事件源、通道、事件目标。
- 管理员或其他用户对OBS桶中对象执行操作,产生OBS事件作为事件源。
- EG(事件网格服务)通过通道将事件源推送至事件目标,事件目标促使其他云服务执行后续一些操作或流程。
关于OBS结合EG事件通知使用的实践案例,请参见结合EG事件通知自动处理OBS桶中的图片。
支持的OBS事件类型
EG通知支持的OBS事件源类型有两种:OBS应用事件源、对象存储服务 OBS。
- OBS应用事件源:该事件源来源于对象存储服务,操作OBS桶内对象的特定行为产生的事件。
- 对象存储服务 OBS:该事件源来源于对象存储服务,关于OBS桶对象相关的操作以及系统内部触发的操作产生的审计日志事件。
OBS事件源类型 |
EG事件类型 |
说明 |
---|---|---|
OBS应用事件源 |
OBS:DWR:ObjectCreated:PUT |
上传对象(使用PUT方法)。 |
OBS:DWR:ObjectCreated:POST |
上传对象(使用POST方法)。 |
|
OBS:DWR:ObjectCreated:COPY |
复制对象 |
|
OBS:DWR:ObjectCreated:CompleteMultipartUpload |
采用多段上传时的合并分段任务。 |
|
OBS:DWR:ObjectRemoved:Delete |
指定对象版本号删除对象。 |
|
OBS:DWR:ObjectRemoved:DeleteMarkerCreated |
不指定对象版本号删除对象。 |
|
对象存储服务 OBS |
OBS:CloudTrace:ApiCall |
调用ApiGateway触发的操作所产生的审计日志事件。 |
OBS:CloudTrace:ObsSDK |
调用OBS提供的SDK触发的关于OBS桶相关操作所产生的审计日志事件。 |
|
OBS:CloudTrace:ConsoleAction |
通过管理控制台执行的操作所产生的审计日志事件。 |
|
OBS:CloudTrace:SystemAction |
系统内部触发的操作所产生的审计日志事件。 |
|
OBS:CloudTrace:Others |
除通过OBS SDK触发的关于OBS桶相关操作外的操作所产生的审计日志事件。 |
OBS发送的事件通知消息结构
当用户对桶中对象执行操作产生OBS事件后,OBS会向EG发送固定消息结构(JSON格式)的事件通知,EG收到OBS消息通知后会触发其他云服务执行一些操作或流程。
OBS向EG发布的事件通知是具有以下JSON结构的消息:
{ channel_id: "a1b2c3d4e5f678901234567890abcdef", envents: [ { specversion: "1.0", id: "17793124-84s5-5e1c-9s20-8fes5s8b54wf", source: "HC.OBS.DWR", type: "OBS:DWR:ObjectCreated:PUT", datacontenttype: "application/json", dataschema: "", subject: "exampleobject", time: "Fri, 04 Jul 2025 06:08:01 GMT", ttl: "4000", data: { eventVersion: "3.0", eventSource: "OBS", eventRegion: "cn-east-3", eventTime: "2025-7-04T06:08:01.957Z", eventName: "ObjectCreated:PUT", userIdentity: { ID: "08b4efe0fc00d3ce0f17c01b948f6e80" }, requestParameters: { sourceIPAddress: "x.x.x.x" }, responseElements: { x-obs-request-id: "000001980D3CC5B5024FE333FEB97E7F", x-obs-id-2: "", }, obs: { Version: "1.0", configurationId: "test-trigger", bucket: { name: "examplebucket", ownerIdentity: { ID: "08b4efe0fc00d3ce0f17c01b948f6e80", }, bucket: "examplebucket" }, object: { key: "exampleobject", eTag: "65a8e27d8879283831b664bd8b7f0ad4", size: "1024", versionId: 9876543210987654321, sequencer: "1", oldpsxpth: "" } } } }, ] }
各字段说明如下:
字段名称 |
说明 |
---|---|
channel_id |
EG事件通道的唯一标识符。 |
events[].specversion |
EG事件规范版本。 |
events[].id |
EG事件的唯一标识符。 |
events[].source |
EG事件源服务名,固定为"HC.OBS.DWR"。 |
events[].type |
EG事件类型,以“,”分割的字符串类型。 |
events[].datacontenttype |
EG事件数据的内容类型,固定为application/json。 |
events[].dataschema |
EG事件数据的模式。 |
events[].subject |
对象名。 |
events[].time |
EG事件的发生时间,使用UTC时间格式。 |
events[].ttl |
EG事件的生存时间,默认为4秒。 |
events[].data.eventVersion |
OBS消息版本号。 |
events[].data.eventSource |
消息源,固定为"OBS"。 |
events[].data.eventRegion |
事件所在区域。 |
events[].data.eventTime |
事件时间,格式为ISO-8601。 |
events[].data.eventName |
触发事件通知的事件名。 |
events[].data.userIdentity.ID |
触发事件的用户对应的计费ID。 |
events[].data.requestParameters.sourceIPAddress |
请求的源IP。 |
events[].data.responseElements.x-obs-request-id |
请求对应的RequestID。 |
events[].data.responseElements.x-obs-id-2 |
帮助定位问题的特殊符号。 |
events[].data.obs.Version |
OBS版本。 |
events[].data.obs.configurationId |
此事件匹配的OBS中事件触发器的名称。 |
events[].data.obs.bucket.name |
桶的名称。 |
events[].data.obs.bucket.ownerIdentity.ID |
桶拥有者的账号ID。 |
events[].data.obs.bucket.bucket |
桶的名称。 |
events[].data.obs.object.key |
对象名。 |
events[].data.obs.object.eTag |
对象的ETag。 |
events[].data.obs.object.size |
对象的大小。 |
events[].data.obs.object.versionId |
对象的版本ID。 |
events[].data.obs.object.sequencer |
确定某个特定对象事件顺序的标识。 |
events[].data.obs.object.oldpsxpth |
文件在并行文件系统中rename前的路径。 |
- 上传对象
{ channel_id: "a1b2c3d4e5f678901234567890abcdef", envents: [ { specversion: "1.0", id: "17793124-84s5-5e1c-9s20-8fes5s8b54wf", source: "HC.OBS.DWR", type: "OBS:DWR:ObjectCreated:PUT", datacontenttype: "application/json", dataschema: "", subject: "exampleobject", time: "Fri, 04 Jul 2025 06:08:01 GMT", ttl: "4000", data: { eventVersion: "3.0", eventSource: "OBS", eventRegion: "cn-east-3", eventTime: "2025-7-04T06:08:01.957Z", eventName: "ObjectCreated:PUT", userIdentity: { ID: "08b4efe0fc00d3ce0f17c01b948f6e80" }, requestParameters: { sourceIPAddress: "x.x.x.x" }, responseElements: { x-obs-request-id: "000001980D3CC5B5024FE333FEB97E7F", x-obs-id-2: "", }, obs: { Version: "1.0", configurationId: "test-trigger", bucket: { name: "examplebucket", ownerIdentity: { ID: "08b4efe0fc00d3ce0f17c01b948f6e80", }, bucket: "examplebucket" }, object: { key: "exampleobject", eTag: "65a8e27d8879283831b664bd8b7f0ad4", size: "1024", versionId: 9876543210987654321, sequencer: "1", oldpsxpth: "" } } } }, ] }
- 删除对象(手动删除)
{ channel_id: "a1b2c3d4e5f678901234567890abcdef", envents: [ { specversion: "1.0", id: "17793124-84s5-5e1c-9s20-8fes5s8b54wf", source: "HC.OBS.DWR", type: "OBS:DWR:ObjectRemoved:Delete", datacontenttype: "application/json", dataschema: "", subject: "exampleobject", time: "Fri, 04 Jul 2025 06:08:01 GMT", ttl: "4000", data: { eventVersion: "3.0", eventSource: "OBS", eventRegion: "cn-east-3", eventTime: "2025-7-04T06:08:01.957Z", eventName: "ObjectRemoved:Delete", userIdentity: { ID: "08b4efe0fc00d3ce0f17c01b948f6e80" }, requestParameters: { sourceIPAddress: "x.x.x.x" }, responseElements: { x-obs-request-id: "000001980D3CC5B5024FE333FEB97E7F", x-obs-id-2: "", }, obs: { Version: "1.0", configurationId: "test-trigger", bucket: { name: "examplebucket", ownerIdentity: { ID: "08b4efe0fc00d3ce0f17c01b948f6e80", }, bucket: "examplebucket" }, object: { key: "exampleobject", eTag: "65a8e27d8879283831b664bd8b7f0ad4", size: "1024", versionId: 9876543210987654321, sequencer: "1", oldpsxpth: "" } } } }, ] }
- 删除对象(使用生命周期规则删除)
{ channel_id: "a1b2c3d4e5f678901234567890abcdef", envents: [ { specversion: "1.0", id: "17793124-84s5-5e1c-9s20-8fes5s8b54wf", source: "HC.OBS.DWR", type: "OBS:DWR:ObjectRemoved:Delete", datacontenttype: "application/json", dataschema: "", subject: "exampleobject", time: "Fri, 04 Jul 2025 06:08:01 GMT", ttl: "4000", data: { eventVersion: "3.0", eventSource: "OBS", eventRegion: "cn-east-3", eventTime: "2025-7-04T06:08:01.957Z", eventName: "ObjectRemoved:Delete", userIdentity: { ID: "08b4efe0fc00d3ce0f17c01b948f6e80" }, requestParameters: { sourceIPAddress: "x.x.x.x" }, responseElements: { x-obs-request-id: "000001980D3CC5B5024FE333FEB97E7F", x-obs-id-2: "", }, obs: { Version: "1.0", configurationId: "test-trigger", bucket: { name: "examplebucket", ownerIdentity: { ID: "08b4efe0fc00d3ce0f17c01b948f6e80", }, bucket: "examplebucket" }, object: { key: "exampleobject", eTag: "65a8e27d8879283831b664bd8b7f0ad4", size: "1024", versionId: 9876543210987654321, sequencer: "1", oldpsxpth: "" } } } }, ] }
约束与限制
约束类别 |
具体限制 |
---|---|
OBS桶限制 |
|
权限限制 |
如果事件源选择“OBS应用事件源”,需您的账号添加“Tenant Administrator”权限,如何授权请参见依赖角色的授权方法。 |
创建EG通知限制 |
|
编辑EG通知限制 |
|
EG通知费用说明
使用EG通知需支付EG服务费用,计费详情请参见EG计费说明。
前提条件
- 已开通事件网格服务并为账号或IAM用户授予“EG FullAccess”权限。
- 华为账号或IAM用户已添加“Tenant Administrator”权限,如何授权请参见创建IAM用户并授权使用OBS。
创建EG通知
OBS支持通过控制台方式创建EG通知,不支持通过API、SDK、OBS Browser+、obsutil方式创建EG通知。
禁用或启用、修改、删除EG通知
OBS支持通过控制台方式禁用或启用、修改、删除EG通知,不支持通过API、SDK、OBS Browser+、obsutil方式禁用或启用、修改、删除EG通知。
导出EG通知
OBS支持通过控制台方式导出EG通知,不支持通过API、SDK、OBS Browser+、obsutil方式导出EG通知。
相关文档
- 关于OBS结合EG通知的使用实践案例,请参见结合EG事件通知自动处理OBS桶中的图片。
- 为什么删除对象没有触发EG事件通知?
- 更多关于事件网格的内容,请参见事件网格 EG。