设置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所示。
授权信息
您必须是拥有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],值允许为任意字符,支持如下事件类型:
|
| 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)
}
}