云服务器内容精选

  • DWR权限 默认情况下,管理员创建的IAM用户没有任何权限,需要将其加入用户组,并给用户组授予策略或角色,才能使得用户组中的用户获得对应的权限,这一过程称为授权。授权后,用户就可以基于被授予的权限对云服务进行操作。 DWR部署时通过物理区域划分,为项目级服务。授权时,“作用范围”需要选择“区域级项目”,然后在指定区域(如华北-北京1)对应的项目(cn-north-1)中设置相关权限,并且该权限仅对此项目生效;如果在“所有项目”中设置权限,则该权限在所有区域项目中都生效。访问DWR时,需要先切换至授权区域。 权限根据授权精细程度分为角色和策略。 角色:IAM最初提供的一种根据用户的工作职能定义权限的粗粒度授权机制。该机制以服务为粒度,提供有限的服务相关角色用于授权。由于华为云各服务之间存在业务依赖关系,因此给用户授予角色时,可能需要一并授予依赖的其他角色,才能正确完成业务。角色并不能满足用户对精细化授权的要求,无法完全达到企业对权限最小化的安全管控要求。 策略:IAM最新提供的一种细粒度授权的能力,可以精确到具体服务的操作、资源以及请求条件等。基于策略的授权是一种更加灵活的授权方式,能够满足企业对权限最小化的安全管控要求。例如:针对DWR服务,管理员能够控制IAM用户仅能对某一类云服务器资源进行指定的管理操作。多数细粒度策略以API接口为粒度进行权限拆分。 如表1所示,包括了DWR的所有系统权限。 表1 DWR系统权限 系统角色/策略名称 描述 类别 Tenant Administrator 拥有该权限的用户拥有除IAM外,其他所有服务的所有执行权限。 系统角色 DWR FullAccess 管理员权限,拥有该权限的用户可以操作并使用所有操作。 系统策略 DWR ReadOnlyAccess 只读权限,拥有该权限的用户仅能查看DWR服务数据。 系统策略 DWR操作与资源权限关系列出了DWR常用操作与系统权限的授权关系,您可以参照该表选择合适的系统权限。 表2 DWR操作与资源权限关系 操作 DWR FullAccess DWR ReadOnlyAccess 查询工作流实例详情 √ √ 查询工作流详情 √ √ 查询华为云系统算子 √ √ 查询公共算子 √ √ 查询用户第三方算子 √ √ 查询第三方算子服务协议是否同意 √ √ 获取DWR工作流是否开通授权 √ √ 更新工作流参数 √ x 更新用户第三方算子 √ x 恢复的工作流实例 √ x DWR工作流开通授权 √ x 同意第三方算子服务协议 √ x 列举工作流 √ √ 列举华为云系统算子 √ √ 列举公共算子 √ √ 列举用户第三方算子 √ √ 禁用用户第三方算子 √ x 创建工作流 √ x 删除工作流 √ x 删除用户第三方算子 √ x 创建用户第三方算子 √ x 执行工作流 √ x
  • 算子参数配置示例 Inputs参数 Input结构体参数说明参见创建工作流API。 regex参数设置的正则表达式请使用regexploit工具校验。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [ { //算子所在工作流输入列表 "parameter_name": "bucket", "parameter_value": "", "value_type": "", "default": "", "type": "string", "label": "Body", "constraints": { "regex": ".*"//正则表达式请使用regexploit工具校验 }, "invisible": false, "description": "doc destination bucket name" } ] 动态参数 1 2 3 4 5 { "bucket": { "get_input": "$.inputs.bucket"//该值需要跟inputs参数中的parameter_name取值保持一致 } } 权限版本 obs授权参见对象相关授权项和桶相关授权。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 [ { //1.1版本支持细粒度授权,可以精确到具体服务的操作、资源以及请求条件等 "version": "1.1", "statement": [ { //对IAM用户组授予OBS指定资源的指定操作权限 "action": [ "obs:bucket:HeadBucket", "obs:bucket:ListBucketMultipartUploads", "obs:object:AbortMultipartUpload", "obs:object:PutObject", "obs:bucket:GetBucketAcl", "obs:object:GetObject" ] } ] } ]
  • 前提条件 算子已开发完成,开发规范参考自定义函数开发规范,建议使用Go、Python开发(算子的冷启动效果更好)。 算子已在华为云云市场上架,上架指导参考发布API类商品操作指导。 开发的新算子如果要支持同步工作流,需要保证同步工作流最后一个算子返回方式为以下的一种: 返回方式1:字符串数据 { "execution_name":"84a3dd2bd67f43aa9b98cdd74604ca68", //工作流实例名称 "graph_name":"test_workflow", //工作流名称 "Records":[ // 处理对象 ], "dynamic_source": {//执行算子的输出结果 "tasks": [ {body}, // 直接返回body字符串 ] } } 返回方式2:文件流数据 { "execution_name":"84a3dd2bd67f43aa9b98cdd74604ca68", //工作流实例名称 "graph_name":"test_workflow", //工作流名称 "Records":[ // 处理对象 ], "dynamic_source":{ //执行算子的输出结果 "tasks":[ { "output":{ // 同步返回的输出文件地址:桶名、对象名、区域 "bucket":"bucketname", "object":"objectname", "location":"cn-north-4" } } ] } }
  • DWR自定义策略样例 示例1:授权用户创建、删除、执行工作流 1 2 3 4 5 6 7 8 9 10 11 12 13 { "Version": "1.1", "Statement": [{ "Effect": "Allow", "Action": [ "dwr:workflow:get*", "dwr:workflow:list*", "dwr:workflow:createWorkflow", "dwr:workflow:deleteWorkflow", "dwr:workflow:executeAsync", ], }] } 示例2:授权用户查询、创建、删除、禁用第三方算子 1 2 3 4 5 6 7 8 9 10 11 12 13 14 { "Version": "1.1", "Statement": [{ "Effect": "Allow", "Action": [ "dwr:workflow:get*", "dwr:workflow:list*", "dwr:workflow:createMyActionTemplate", "dwr:workflow:deleteMyActionTemplate", "dwr:workflow:forbidMyActionTemplate", ], }] }
  • 对接转码函数示例(GO语言) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 package main import ( "encoding/json" "errors" "go-runtime/go-api/context" ) func DemoTranscodeHandler(jsonData []byte, ctx context.RuntimeContext) (interface{}, error) { var eventMsg Payload err := json.Unmarshal(jsonData, &eventMsg) if err != nil { return nil, errors.New("not correct format") } // 存储输入桶和对象值 record := eventMsg.Records[0] // 定义输出 resp := struct { OBSMessages Inputs map[string]interface{} `json:"inputs"` ExecutionName string `json:"execution_name"` GraphName string `json:"graph_name"` DynamicSource struct { *CreateTranscodeDynamicSourceBody } `json:"dynamic_source"` }{} // 配置截图参数,为下游截图任务提供参数配置 resp.DynamicSource.CreateTranscodeDynamicSourceBody = &CreateTranscodeDynamicSourceBody{ Transcodes: []*CreateTranscodeTaskBody{ &CreateTranscodeTaskBody{ //源文件地址。 Input: &FileAddr{ Location: "cn-north-4", BucketName: record.Obs.Bucket.Name, Object: record.Obs.Object.Key, }, //输出地址。 Output: &FileAddr{ Location: "cn-north-4", BucketName: record.Obs.Bucket.Name, Object: "transcode_out", }, TransTemplateID: []int{7000523, 7000524, 7000526, 7000528, 7000530, 7000538}, OutputFilenames: []string{"out_file1", "out_file2", "out_file3", "out_file4", "out_file5", "out_file6"}, }, }, } // 以下参数需要继承传递,方便工作流下游函数获取对应参数值 resp.Inputs = eventMsg.Inputs resp.Records = eventMsg.Records resp.GraphName = eventMsg.GraphName resp.ExecutionName = eventMsg.ExecutionName return resp, nil }
  • 结构体示例(GO语言) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 package main type CreateTranscodeDynamicSourceBody struct { Transcodes []*CreateTranscodeTaskBody `json:"transcodes"` } type CreateTranscodeTaskBody struct { //源文件存储地址。 Input *FileAddr `json:"input,omitempty"` //转码后的视频文件存储地址。 Output *FileAddr `json:"output"` //转码模板ID,数组 TransTemplateID []int `json:"trans_template_id,omitempty"` //支持图片水印和文字水印,最多支持20个。 Watermarks []*Watermark `json:"watermarks,omitempty"` //任务优先级。 Priority string `json:"priority,omitempty"` //输出文件名称,每一路转码输出对应一个名称,需要与转码模板ID数组的顺序对应。 OutputFilenames []string `json:"output_filenames,omitempty"` } type Watermark struct { Input *FileAddr `json:"input,omitempty"` TemplateID int `json:"template_id,omitempty"` TextContext string `json:"text_context,omitempty"` ImageWatermark *ImageWatermark `json:"image_watermark,omitempty"` TextWatermark *TextWatermark `json:"text_watermark,omitempty"` } type TextWatermark struct { Dx string `json:"dx,omitempty"` Dy string `json:"dy,omitempty"` ReferPos string `json:"referpos,omitempty"` TimelineStart string `json:"timeline_start,omitempty"` TimelineDuration string `json:"timeline_duration,omitempty"` FontName string `json:"font_name,omitempty"` FontSize string `json:"font_size,omitempty"` FontColor string `json:"font_color,omitempty"` Base string `json:"base,omitempty"` } type ImageWatermark struct { Dx string `json:"dx,omitempty"` Dy string `json:"dy,omitempty"` ReferPos string `json:"referpos,omitempty"` TimelineStart string `json:"timeline_start,omitempty"` TimelineDuration string `json:"timeline_duration,omitempty"` ImageProcess string `json:"image_process,omitempty"` Width string `json:"width,omitempty"` Height string `json:"height,omitempty"` Base string `json:"base,omitempty"` } type CreateThumbnailDynamicSourceBody struct { Thumbnails []*ThumbnailCreateTaskBody `json:"thumbnails"` } //FileAddr 文件路径结构定义 type FileAddr struct { Location string `json:"location"` BucketName string `json:"bucket"` Object string `json:"object"` } type ThumbnailCreateTaskBody struct { //源文件地址。 Input *FileAddr `json:"input"` //输出地址。 Output *FileAddr `json:"output"` //是否压缩抽帧图片生成tar包。 Tar int `json:"tar,omitempty"` //是否同步处理,同步处理是指不下载全部文件,快速定位到截图位置进行截图。 Mode int `json:"sync,omitempty"` //截图参数 ThumbnailParam *ThumbnailParam `json:"thumbnail_para"` } type ThumbnailParam struct { Type string `json:"type"` Time int64 `json:"time,omitempty"` StartTime int64 `json:"start_time,omitempty"` Duration int64 `json:"duration,omitempty"` Dots []int64 `json:"dots,omitempty"` Format int64 `json:"format,omitempty"` AspectRatio int64 `json:"aspect_ratio,omitempty"` Width int64 `json:"width,omitempty"` Height int64 `json:"height,omitempty"` MaxLength int64 `json:"max_length,omitempty"` OutputFileName string `json:"output_filename,omitempty"` } type OBSMessages struct { Records []OBSRecord `json:"Records"` } // OBSRecord OBS消息格式 type OBSRecord struct { EventVersion string `json:"eventVersion"` EventSource string `json:"eventSource"` EventRegion string `json:"eventRegion"` EventTime string `json:"eventTime"` EventName string `json:"eventName"` UserIdentity UserIdentity `json:"userIdentity"` RequestParameters RequestParameters `json:"requestParameters"` ResponseElements ResponseElements `json:"responseElements"` Obs *OBSInfo `json:"obs"` } // UserIdentity 用户id type UserIdentity struct { ID string `json:"ID,omitempty"` } //RequestParameters 原始请求参数 type RequestParameters struct { SourceIPAddress string `json:"sourceIPAddress,omitempty"` } //ResponseElements 响应参数 type ResponseElements struct { OBSRequestID string `json:"x-obs-request-id"` OBSID2 string `json:"x-obs-id-2"` } //OBSInfo OBS信息 type OBSInfo struct { Version string `json:"Version"` ConfigurationID string `json:"configurationId"` Bucket BucketInfo `json:"bucket"` Object ObjectInfo `json:"object"` } //BucketInfo 桶信息 type BucketInfo struct { Name string `json:"name"` OwnerIdentity UserIdentity `json:"ownerIdentity"` Bucket string `json:"bucket"` } //ObjectInfo 对象信息 type ObjectInfo struct { Key string `json:"key"` Tag string `json:"eTag"` Size uint64 `json:"size"` VersionID string `json:"versionId"` Sequencer string `json:"sequencer"` } type Payload struct { ExecutionName string `json:"execution_name"` GraphName string `json:"graph_name"` OBSMessages DynamicSource interface{} `json:"dynamic_source"` Inputs map[string]interface{} `json:"inputs"` }
  • 对接截图函数示例(GO语言) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 package main import ( "encoding/json" "errors" "go-runtime/go-api/context" ) func DemoHandler(jsonData []byte, ctx context.RuntimeContext) (interface{}, error) { var eventMsg Payload err := json.Unmarshal(jsonData, &eventMsg) if err != nil { return nil, errors.New("not correct format") } // 存储输入桶和对象值 record := eventMsg.Records[0] // 定义输出 resp := struct { OBSMessages Inputs map[string]interface{} `json:"inputs"` ExecutionName string `json:"execution_name"` GraphName string `json:"graph_name"` DynamicSource struct { *CreateThumbnailDynamicSourceBody } `json:"dynamic_source"` }{} // 配置截图参数,为下游截图任务提供参数配置 resp.DynamicSource.CreateThumbnailDynamicSourceBody = &CreateThumbnailDynamicSourceBody{ Thumbnails: []*ThumbnailCreateTaskBody{ &ThumbnailCreateTaskBody{ //源文件地址。 Input: &FileAddr{ Location: "cn-north-1", BucketName: record.Obs.Bucket.Name, Object: record.Obs.Object.Key, }, //输出地址。 Output: &FileAddr{ Location: "cn-north-1", BucketName: record.Obs.Bucket.Name, Object: "thumb_out", }, //是否压缩抽帧图片生成tar包。 Tar: 0, //是否同步处理,同步处理是指不下载全部文件,快速定位到截图位置进行截图。 Mode: 0, //截图参数 ThumbnailParam: &ThumbnailParam{ Type: "DOTS", MaxLength: 0, Dots: []int64{2, 10, 14}, // 截图的位置(s) OutputFileName: "default_cover.jpg", }, }, }, } // 以下参数需要继承传递,方便工作流下游函数获取对应参数值 resp.Inputs = eventMsg.Inputs resp.Records = eventMsg.Records resp.GraphName = eventMsg.GraphName resp.ExecutionName = eventMsg.ExecutionName return resp, nil }
  • 函数输出参数 函数输出参数的JSON格式的结构体定义如下: 表3 函数输出的JSON格式体 名称 是否必选 参数类型 说明 约束 execution_name 是 String 工作流实例名称。 继承函数输入参数的execution_name。 graph_name 是 String 工作流名称。 继承函数输入参数的graph_name。 Records 是 Array 工作流触发的事件源事件消息。 如果没有变化,则继承函数输入参数的records。 inputs 否 Map[String]String 用户可修改参数列表。 如果没有新增,则继承函数输入参数的inputs。 dynamic_source 否 Map 函数的输出参数,可用于传递给下一个执行的函数。 - operation_name 否 String 函数操作名。 系统内置的工作流函数操作名有: 视频解析:MPC.Metadata 视频截图:MPC.Thumbnail 视频转码:MPC.Transcode SMN消息通知:SMN.Publish
  • 函数输入参数 工作流执行自定义函数时,函数输入参数的JSON格式的结构体和环境变量的定义如下: 表1 函数输入的JSON格式体 名称 是否必选 参数类型 说明 execution_name 是 String 工作流实例名称。 graph_name 是 String 工作流名称。 Records 是 Array 工作流触发的事件源事件消息。 inputs 否 Map[String]String 用户可修改参数列表,可以为空。 dynamic_source 否 Map 函数执行必须的参数,可用于传入调用的服务。 表2 函数的环境变量 名称 是否必选 参数类型 说明 region 否 String 当前区域名称。 函数输入的JSON示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 { "execution_name": "84a3dd2bd67f43aa9b98cdd74604ca68",//工作流实例名称 "graph_name": "test_workflow",//工作流名称 "Records": [ { "eventName": "ObjectCreated:Put",//触发事件通知的事件名 "eventRegion": "cn-north-4",//事件所在的region "eventSource": "OBS",//消息源,固定为"OBS" "eventTime": "2021-12-23T14:50:22.957Z",//事件时间,格式为ISO-8601,示例:2020-07-10T09:24:11.418Z "eventVersion": "3.0",//版本号,目前为"3.0" "obs": { "Version": "1.0", "bucket": { "bucket": "examplebucket",//桶名 "name": "examplebucket",//桶名 "ownerIdentity": { "ID": "08b4efe0fc00d3ce0f17c01b948f6e80"//桶拥有者的账号ID } }, "configurationId":"test-trigger",//此事件匹配的OBS中事件触发器的名称 "object": { "eTag": "fc85a07cff68977bf5b2108e7436ca2d",//对象的etag "key": "exampleobject.docx",//对象名 "oldpsxpth": "",//文件在并行文件系统中rename前的路径 "sequencer": "1",//确定某个特定对象事件顺序的标识 "size": "524298",//对象的大小 "versionId": "G001017DE60E176D0000401106696610null"//对象的版本ID } }, "requestParameters": { "sourceIPAddress": "x.x.x.x"//请求的源IP }, "responseElements": { "x-obs-id-2": "",//帮助定位问题的特殊符号 "x-obs-request-id": "84a3dd2bd67f43aa9b98cdd74604ca68"//请求对应的requestid }, "userIdentity": { "ID": "08b4efe0fc00d3ce0f17c01b948f6e80"//触发事件的用户对应的计费ID } } ], "inputs": { //执行工作流的输入参数 "parametername": "parametervalue", "parametername": "parametervalue" }, "dynamic_source": { //执行自定义函数的输入参数 "parametername": "parametervalue", "parametername": "parametervalue" } }
  • 示例流程 图1 给用户授予DWR权限流程 创建用户组并授权 在IAM控制台创建用户组,并授予数据工坊只读权限“DWR ReadOnlyAccess”。 创建用户并加入用户组 在IAM控制台创建用户,并将其加入步骤1中创建的用户组。 用户登录并验证权限 新创建的用户登录控制台,切换至授权区域,验证权限:在“服务列表”中选择数据工坊,进入DWR工作流页面,单击右上角“创建工作流”,尝试创建工作流,如果无法创建(假设当前权限仅包含DWR ReadOnlyAccess),表示“DWR ReadOnlyAccess”已生效。
  • 算子参数配置示例 Inputs参数 Input结构体参数说明参见创建工作流API。 regex参数设置的正则表达式请使用regexploit工具校验。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [ { //算子所在工作流输入列表 "parameter_name": "bucket", "parameter_value": "", "value_type": "", "default": "", "type": "string", "label": "Body", "constraints": { "regex": ".*"//正则表达式请使用regexploit工具校验 }, "invisible": false, "description": "doc destination bucket name" } ] 动态参数 1 2 3 4 5 { "bucket": { "get_input": "$.inputs.bucket"//该值需要跟inputs参数中的parameter_name取值保持一致 } } 权限版本 obs授权参见对象相关授权项和桶相关授权。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 [ { //1.1版本支持细粒度授权,可以精确到具体服务的操作、资源以及请求条件等 "version": "1.1", "statement": [ { //对IAM用户组授予OBS指定资源的指定操作权限 "action": [ "obs:bucket:HeadBucket", "obs:bucket:ListBucketMultipartUploads", "obs:object:AbortMultipartUpload", "obs:object:PutObject", "obs:bucket:GetBucketAcl", "obs:object:GetObject" ] } ] } ]
  • 创建IAM用户 IAM用户由账号管理员创建并管理,可以确保账号及资源的安全性,有关IAM的详细介绍请参见IAM用户。此处介绍如何创建一个具有DWR访问权限的IAM用户。如果您不需要使用IAM用户,可以略过此部分内容。 在华为云官网,单击页面右上角的“控制台”,使用注册账号登录控制台。 在“控制台”页面,鼠标移动至右上方的用户名,在下拉列表中选择“统一身份认证”。 创建用户组。 详细步骤请参见创建用户组,创建成功后,为该用户组配置Tenant Administrator权限。 创建用户。 详细步骤请参见创建用户,创建用户时“所属用户组”需选择步骤3创建的用户组。
  • 入门流程 当需要使用DWR服务对OBS内存储的数据自动进行多项复杂任务(如解析、转码、截图等)处理时,建议参考表1逐步操作。 表1 DWR使用流程简介 操作步骤 操作说明 步骤一:准备工作 注册华为云账号,并开通数据工坊DWR服务。 (可选)步骤二:浏览算子市场 在算子市场查找需要的算子,了解已有算子的功能。 步骤三:创建工作流 创建工作流对算子进行编排。 步骤四:启动工作流 当前DWR支持同步和异步两种方式启动工作流。 创建事件触发器异步启动 使用API同步启动 使用API异步启动 步骤五:查看运行记录 查看历史运行记录,了解工作流的执行情况。 父主题: 处理数据
  • 资源和成本 表1 资源和成本规划 资源 资源说明 数量 每月费用 OBS 算子请求OBS API。 1 通过算子对数据进行处理,都会涉及到对OBS API的调用,每调用一次API都计算一次请求次数。对象存储服务OBS会根据调用API的请求次数进行费用收取,收取详情参见OBS请求费用说明。 FunctionGraph函数 算子使用FunctionGraph函数工作流。 1 通过算子对数据进行处理,会使用到函数工作流的资源,比如算子执行时长,函数工作流会根据资源使用情况进行收费,收费详情参见函数工作流计费说明。 视频转码 新建转码任务可以将视频进行转码,并在转码过程中压制水印、视频截图等。视频转码前需要配置转码模板。 待转码的音视频需要存储在与媒体处理服务同区域的OBS桶中,且该OBS桶已授权。 1 由媒体处理服务MPC进行收费,详情查看计费说明。
  • 操作场景 内容审核结束后,可以对违规文件做冻结处理,冻结处理的方式有以下两种: 将文件权限修改为私有:对于审核为违规的文件对象,其对象权限将被修改为私有,仅其拥有者具有读写权限。 将文件转移到指定桶:对于审核为违规的文件,需要将其转移到指定的OBS桶内。 以上两种冻结方式均需要您委托DWR服务去访问OBS服务,因此需要提供权限委托。 针对两种冻结方式,在创建委托时,需要授权的OBS服务权限如下: 表1 “将文件权限修改为私有”所需的OBS权限 名称 说明 obs:object:PutObjectAcl 设置对象ACL obs:object:GetObjectAcl 获取对象ACL 表2 “将文件转移到指定桶”所需的OBS权限 名称 说明 obs:bucket:ListBucketMultipartUploads 列举多段上传任务 obs:object:GetObject 获取对象内容、获取对象元数据 obs:object:DeleteObject 删除对象、批量删除对象 obs:object:ListMultipartUploadParts 列举已上传的段 obs:bucket:ListBucket 列举桶内对象 obs:object:PutObject PUT上传、POST上传、复制对象、追加写对象、初始化上传段任务、上传段、合并段