更新时间:2026-08-03 GMT+08:00
分享

设置DIS通知策略

功能说明

如果需要将OBS桶中对象变化的事件推送到DIS的事件通道中,可以调用此接口来配置DIS通知策略。接口是幂等的,如果桶上已存在相同策略内容,则返回成功,status code返回值为200;否则status code返回值为201。

融合桶不支持设置DIS通知策略。

接口约束

  • 需要使用IAM的角色与策略授权功能,增加Tenant Administrator权限后才能设置、获取、删除DIS通知策略。使用DIS消息通知需要使用IAM的角色与策略授权功能,创建对OBS云服务的委托,委托赋予的权限需为数据接入服务DIS的DIS User权限。
  • 一个桶中最多同时配置10条DIS通知规则。
  • 对于时延敏感(秒级)的业务,消息通知无法保证时延。
  • 新创建的DIS通知将在5分钟之内生效。
  • 一个桶的多条DIS通知规则不允许重复,即任意对象在发生任意事件时都不能同时匹配两条以上的DIS通知规则,重复规则会创建失败。

    针对同一事件,如果配置了一条前后缀都为空的规则,则不允许再配置第二条规则。前后缀都为空表示对所有对象生效。

    例如:针对Put事件,已存在一条规则A,定义的前缀是“abcd”,后缀是“.txt”。如果要创建另外一条针对Put事件的规则B,则规则B配置不同前后缀的结果如表1所示。

    表1 规则B前后缀配置场景及结果

    规则A前后缀配置

    规则B前后缀配置

    规则B创建结果

    原因

    前缀:abcd

    后缀:.txt

    前缀:abcd

    后缀:.txt

    失败

    前后缀相同

    前缀:abcd

    后缀:空

    失败

    前缀相同,后缀B包含A

    前缀:ab

    后缀:xt

    失败

    前缀B包含A,后缀B包含A

    前缀:abef

    后缀:.txt

    成功

    前缀不同,后缀相同

    前缀:abcd

    后缀:.mp4

    成功

    前缀相同,后缀不同

授权信息

您必须是拥有Tenant Administrator权限,才能调用本接口。配置Tenant Administrator权限,需要使用角色与策略授权(旧版IAM,即IAM v3接口),授权操作请参考使用IAM授权

方法定义

func (obsClient ObsClient) SetDisPolicy(input *SetDisPolicyInput, extensions ...extensionOptions) (output *BaseModel, err error)

请求参数说明

表1 请求参数说明

参数

类型

必填

说明

bucketName

string

参数解释:

桶名。

响应参数说明

表2 GetDisPolicyOutput参数说明

字段

类型

说明

BaseModel

BaseModel

参数解释:

基础模型,包含 RequestId 等。

Rules

[]DisPolicyRule

DIS 策略规则列表

约束限制:

同一个桶下的不同策略前缀不能重复和起始包含,委托建议使用同一个

取值范围:

数组大小的取值范围为[1, 10]

表3 DisPolicyRule参数说明

字段

类型

说明

ID

string

规则 ID

取值范围:

[1, 256],满足“^[a-zA-Z0-9_-]{1, 256}$”

Stream

string

DIS服务通道名称。

需要先在DIS服务创建此通道

Project

string

DIS服务通道所属的项目ID

Events

[]string

OBS事件列表

有效值:长度[0, 1023],值允许为任意字符,支持如下事件类型:

  • ObjectCreated:* (所有上传操作)
  • ObjectCreated:Put (上传对象)
  • ObjectCreated:Post (使用浏览器上传对象)
  • ObjectCreated:Copy (拷贝对象)
  • ObjectCreated:CompleteMultipartUpload (合并段)
  • ObjectRemoved:* (所有删除操作)
  • ObjectRemoved:Delete (指定对象版本号删除对象)
  • ObjectRemoved:DeleteMarkerCreated (不指定对象版本号删除对象)

Prefix

string

对象名前缀,用于指定的对象名关键字,根据定义的前缀,输入需要过滤的对象的关键字信息,字符越长匹配精度越高,最大可支持1024个字符,最小可为空。同时,prefix和suffix加起来长度最大为1024个字符

Suffix

string

对象名后缀。用于指定的对象名关键字,根据定义的后缀,输入需要过滤的对象的关键字信息,字符越长匹配精度越高,最大可支持1024个字符,最小可为空。同时,prefix和suffix加起来长度最大为1024个字符

Agency

string

IAM委托名,被委托方必须包含OBS服务,赋予的权限必须是DIS服务的DIS Administrator或DIS User

代码示例

示例1-为桶examplebucket创建DIS通知策略,将所有对象上传和删除的事件通知到名称为my-dis-stream的DIS通道中(在DIS云服务中可以购买查看)。

package main

import (
	"fmt"
	"log"
        obs "github.com/huaweicloud/huaweicloud-sdk-go-obs/obs"
)

func main() {
    //推荐通过环境变量获取AKSK,这里也可以使用其他外部引入方式传入,如果使用硬编码可能会存在泄露风险。
    //您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html。
        ak := os.Getenv("AccessKeyID")
        sk := os.Getenv("SecretAccessKey")
    // 【可选】如果使用临时AK/SK和SecurityToken访问OBS,同样建议您尽量避免使用硬编码,以降低信息泄露风险。您可以通过环境变量获取访问密钥AK/SK,也可以使用其他外部引入方式传入。
    securityToken := os.Getenv("SecurityToken")
    // endpoint填写Bucket对应的Endpoint,这里以华北-北京四为例,其他地区请按实际情况填写。     endPoint := "https://obs.cn-north-4.myhuaweicloud.com"
	// 创建客户端
    obsClient, err := obs.New(ak, sk, endPoint, obs.WithSecurityToken(securityToken))
    if err != nil {
        fmt.Printf("Create obsClient error, errMsg: %s", err.Error())
    }

// 设置 DIS 策略
	input := &obs.SetDisPolicyInput{
		Bucket: "examplebucket",
		Rules: []obs.DisPolicyRule{
			{
				ID:      "dis-rule-01",
				Stream:  "my-dis-stream",
				Project: "project-id-12345",
				Events: []string{
					"ObjectCreated:*",
					"ObjectRemoved:*",
				},
				Agency: "obs_dis_agency",
			},
		},
	}

	output, err := client.SetDisPolicy(input)
	if err != nil {
		log.Fatalf("Failed to set DIS policy: %v", err)
	}

	fmt.Printf("Request ID: %s\n", output.RequestId)
	fmt.Println("DIS policy set successfully")
}

示例2-桶examplebucket同时创建多条DIS通知策略,分别是监控桶上前缀为upload/的对象创建事件和后缀为.log的删除事件,事件推送到名称为my-dis-stream的DIS通道中(在DIS云服务中可以购买查看)。

package main

import (
	"fmt"
	"log"
        obs "github.com/huaweicloud/huaweicloud-sdk-go-obs/obs"
)

func main() {
    //推荐通过环境变量获取AKSK,这里也可以使用其他外部引入方式传入,如果使用硬编码可能会存在泄露风险。
    //您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html。
        ak := os.Getenv("AccessKeyID")
        sk := os.Getenv("SecretAccessKey")
    // 【可选】如果使用临时AK/SK和SecurityToken访问OBS,同样建议您尽量避免使用硬编码,以降低信息泄露风险。您可以通过环境变量获取访问密钥AK/SK,也可以使用其他外部引入方式传入。
    securityToken := os.Getenv("SecurityToken")
    // endpoint填写Bucket对应的Endpoint,这里以华北-北京四为例,其他地区请按实际情况填写。     endPoint := "https://obs.cn-north-4.myhuaweicloud.com"
	// 创建客户端
    obsClient, err := obs.New(ak, sk, endPoint, obs.WithSecurityToken(securityToken))
    if err != nil {
        fmt.Printf("Create obsClient error, errMsg: %s", err.Error())
    }
	// 设置多规则 DIS 策略
	input := &obs.SetDisPolicyInput{
		Bucket: "examplebucket",
		Rules: []obs.DisPolicyRule{
			{
				ID:      "create-rule",
				Stream:  "my-dis-stream",
				Project: "project-id-12345",
				Events: []string{
					"ObjectCreated:*",
				},
				Prefix: "upload/",
				Agency: "obs_dis_agency",
			},
			{
				ID:      "delete-rule",
				Stream:  "my-dis-stream",
				Project: "project-id-12345",
				Events: []string{
					"ObjectRemoved:*",
				},
				Suffix: ".log",
				Agency: "obs_dis_agency",
			},
		},
	}

	output, err := client.SetDisPolicy(input)
	if err != nil {
		log.Fatalf("Failed to set multi-rule DIS policy: %v", err)
	}

	fmt.Printf("Request ID: %s\n", output.RequestId)
	fmt.Printf("Configured %d rules\n", len(input.Rules))
	fmt.Println("Multi-rule DIS policy set successfully")
}

示例3-删除桶examplebucket上多条DIS策略中rule id为rule-001的策略。

package main

import (
	"fmt"
	"log"
        obs "github.com/huaweicloud/huaweicloud-sdk-go-obs/obs"
)

func main() {
    //推荐通过环境变量获取AKSK,这里也可以使用其他外部引入方式传入,如果使用硬编码可能会存在泄露风险。
    //您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html。
        ak := os.Getenv("AccessKeyID")
        sk := os.Getenv("SecretAccessKey")
    // 【可选】如果使用临时AK/SK和SecurityToken访问OBS,同样建议您尽量避免使用硬编码,以降低信息泄露风险。您可以通过环境变量获取访问密钥AK/SK,也可以使用其他外部引入方式传入。
    securityToken := os.Getenv("SecurityToken")
    // endpoint填写Bucket对应的Endpoint,这里以华北-北京四为例,其他地区请按实际情况填写。     endPoint := "https://obs.cn-north-4.myhuaweicloud.com"
	// 创建客户端
    obsClient, err := obs.New(ak, sk, endPoint, obs.WithSecurityToken(securityToken))
    if err != nil {
        fmt.Printf("Create obsClient error, errMsg: %s", err.Error())
    }
	bucketName := "examplebucket"
	idsToDelete := []string{"rule-001"}

	// 步骤 1:获取当前策略
	currentPolicy, err := client.GetDisPolicy(bucketName)
	if err != nil {
		log.Fatalf("获取 DIS 策略失败: %v", err)
	}

	fmt.Printf("当前规则数量: %d\n", len(currentPolicy.Rules))

	// 步骤 2:构建要删除的 ID 映射
	idMap := make(map[string]bool)
	for _, id := range idsToDelete {
		idMap[id] = true
	}

	// 步骤 3:从规则列表中移除要删除的规则
	var updatedRules []obs.DisPolicyRule
	for _, rule := range currentPolicy.Rules {
		if !idMap[rule.ID] {
			updatedRules = append(updatedRules, rule)
		}
	}

	// 步骤 4:重新设置策略
	setInput := &obs.SetDisPolicyInput{
		Bucket: bucketName,
		Rules:  updatedRules,
	}

	_, err = client.SetDisPolicy(setInput)
	if err != nil {
		log.Fatalf("设置新策略失败: %v", err)
	}

	fmt.Printf("成功删除 %d 条规则! 剩余规则数量: %d\n", len(idsToDelete), len(updatedRules))
}

示例4-在桶examplebucket上,已经配置过DIS策略的情况下,再添加一条DIS策略。

package main

import (
	"fmt"
	"log"
        obs "github.com/huaweicloud/huaweicloud-sdk-go-obs/obs"
)

func main() {
    //推荐通过环境变量获取AKSK,这里也可以使用其他外部引入方式传入,如果使用硬编码可能会存在泄露风险。
    //您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html。
        ak := os.Getenv("AccessKeyID")
        sk := os.Getenv("SecretAccessKey")
    // 【可选】如果使用临时AK/SK和SecurityToken访问OBS,同样建议您尽量避免使用硬编码,以降低信息泄露风险。您可以通过环境变量获取访问密钥AK/SK,也可以使用其他外部引入方式传入。
    securityToken := os.Getenv("SecurityToken")
    // endpoint填写Bucket对应的Endpoint,这里以华北-北京四为例,其他地区请按实际情况填写。     endPoint := "https://obs.cn-north-4.myhuaweicloud.com"
	// 创建客户端
    obsClient, err := obs.New(ak, sk, endPoint, obs.WithSecurityToken(securityToken))
    if err != nil {
        fmt.Printf("Create obsClient error, errMsg: %s", err.Error())
    }
// 获取现有策略
output, err := client.GetDisPolicy("examplebucket")
if err != nil {
	log.Fatalf("Failed to get DIS policy: %v", err)
}

// 添加新规则
newRules := append(output.Rules, obs.DisPolicyRule{
	ID:      "new-rule",
	Stream:  "my-dis-stream",
	Project: "project-id-12345",
	Events: []string{
		"ObjectCreated:*",
	},
	Agency: "obs_dis_agency",
})

// 更新策略
updateInput := &obs.SetDisPolicyInput{
	Bucket: "examplebucket",
	Rules:  newRules,
}

_, err = client.SetDisPolicy(updateInput)
if err != nil {
	log.Fatalf("Failed to update DIS policy: %v", err)
}
}

相关链接

  • 更多关于桶清单的示例代码,请参见Github示例
  • DIS通知接口返回的错误码含义、问题原因及处理措施可参考OBS错误码

相关文档