更新时间:2025-08-13 GMT+08:00
分享

使用EG发送OBS事件通知

使用场景

在对桶及桶中的对象执行某些操作后,如果您希望能够及时感知,进而触发后续操作流程,那么可以通过EG事件通知来实现。

例如:您需要向源桶中上传图片后,自动触发后续流程执行为图片添加水印,并将添加水印后的图片存放至目标桶中,那么可以通过配置EG事件通知来实现。

OBS结合EG使用原理

对象存储服务(Object Storage Service,OBS)用于存储文件、图片、视频等数据,通过对文件、图片、视频等对象执行上传、修改、删除等操作来产生OBS事件;事件网格服务(EventGrid,EG)捕获到OBS事件后,会按照事先配置好的规则自动触发后续操作任务或流程执行。因此,OBS和EG的结合使用,即OBS“自动发送通知”,EG“自动派发任务”,期间无需人工干预

EG主要由事件源、通道、事件目标组成:

  • 事件源:用户请求操作云服务资源产生云服务事件作为事件源。
  • 通道:事件的中转站,负责接收来自云服务的事件。
  • 事件目标:事件的处理终端,受来自通道的云服务事件触发,促使其他云服务执行一些操作或流程(如:使用函数工作流服务为图片添加水印并存储至OBS桶中)。

OBS结合EG使用原理如图1所示。

图1 EG事件通知原理图

OBS结合EG事件通知使用的原理如下:

  1. 管理员提前创建EG通知,配置好事件源、通道、事件目标。
  2. 管理员或其他用户对OBS桶中对象执行操作,产生OBS事件作为事件源。
  3. EG(事件网格服务)通过通道将事件源推送至事件目标,事件目标促使其他云服务执行后续一些操作或流程。

关于OBS结合EG事件通知使用的实践案例,请参见结合EG事件通知自动处理OBS桶中的图片

支持的OBS事件类型

EG通知支持的OBS事件源类型有两种:OBS应用事件源、对象存储服务 OBS。

  • OBS应用事件源:该事件源来源于对象存储服务,操作OBS桶内对象的特定行为产生的事件。
  • 对象存储服务 OBS:该事件源来源于对象存储服务,关于OBS桶对象相关的操作以及系统内部触发的操作产生的审计日志事件。
表1 EG通知支持的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: ""
                    }
                }
            }
        },
    ]
}

各字段说明如下:

表2 EG事件通知消息字段说明

字段名称

说明

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: ""
                        }
                    }
                }
            },
        ]
    }

约束与限制

表3 约束与限制

约束类别

具体限制

OBS桶限制

  • 一个桶中最多同时配置10条EG通知。
  • 一个桶的多条EG通知不允许重复,即任意对象在发生任意事件时都不能同时匹配两条以上的EG通知规则,重复规则会创建失败。

权限限制

如果事件源选择“OBS应用事件源”,需您的账号添加“Tenant Administrator”权限,如何授权请参见依赖角色的授权方法

创建EG通知限制

  • 一个订阅最多关联五个事件目标。
  • 同一个事件在EG通道内传递的次数不能超过三次。

编辑EG通知限制

  • 已创建的订阅,无法修改事件源提供方。
  • 已创建的订阅,无法修改已绑定的自定义事件通道。

EG通知费用说明

使用EG通知需支付EG服务费用,计费详情请参见EG计费说明

前提条件

创建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通知。

相关文档

相关文档