华为云用户手册

  • 基本概念 账号 用户注册时的账号,账号对其所拥有的资源及云服务具有完全的访问权限,可以重置用户密码、分配用户权限等。由于账号是付费主体,为了确保账号安全,建议您不要直接使用账号进行日常管理工作,而是创建用户并使用用户进行日常管理工作。 用户 由账号在IAM中创建的用户,是云服务的使用人员,具有身份凭证(密码和访问密钥)。 在我的凭证下,您可以查看账号ID和IAM用户ID。通常在调用API的鉴权过程中,您需要用到账号、用户和密码等信息。 区域(Region) 从地理位置和网络时延维度划分,同一个Region内共享弹性计算、块存储、对象存储、VPC网络、弹性公网IP、镜像等公共服务。Region分为通用Region和专属Region,通用Region指面向公共租户提供通用云服务的Region;专属Region指只承载同一类业务或只面向特定租户提供业务服务的专用Region。 详情请参见区域和可用区。 可用区(AZ,Availability Zone) 一个可用区是一个或多个物理数据中心的集合,有独立的风火水电,AZ内逻辑上再将计算、网络、存储等资源划分成多个集群。一个Region中的多个AZ间通过高速光纤相连,以满足用户跨AZ构建高可用性系统的需求。 项目 区域默认对应一个项目,这个项目由系统预置,用来隔离物理区域间的资源(计算资源、存储资源和网络资源),以默认项目为单位进行授权,用户可以访问您账号中该区域的所有资源。如果您希望进行更加精细的权限控制,可以在区域默认的项目中创建子项目,并在子项目中创建资源,然后以子项目为单位进行授权,使得用户仅能访问特定子项目中的资源,使得资源的权限控制更加精确。 图1 项目隔离模型 同样在我的凭证下,您可以查看项目ID。 企业项目 企业项目是项目的升级版,针对企业不同项目间的资源进行分组和管理,是逻辑隔离。企业项目中可以包含多个区域的资源,且项目中的资源可以迁入迁出。 关于企业项目ID的获取及企业项目特性的详细信息,请参见《企业管理用户指南》。 父主题: 使用前必读
  • Token认证 Token的有效期为24小时,需要使用一个Token鉴权时,可以先缓存起来,避免频繁调用。 Token在计算机系统中代表令牌(临时)的意思,拥有Token就代表拥有某种权限。Token认证就是在调用API的时候将Token加到请求消息头中,从而通过身份认证,获得操作API的权限。Token可通过调用获取用户Token接口获取。 调用本服务API需要项目级别的Token,即调用获取用户Token接口时,请求body中auth.scope的取值需要选择project,如下所示。 { "auth": { "identity": { "methods": [ "password" ], "password": { "user": { "name": "username", //IAM用户名 "password": "********", //IAM用户密码 "domain": { "name": "domainname" //IAM用户所属账号名 } } } }, "scope": { "project": { "name": "xxxxxxxx" //项目名称 } } } } 获取Token后,再调用其他接口时,您需要在请求消息头中添加“X-Auth-Token”,其值即为Token。例如Token值为“ABCDEFJ....”,则调用接口时将“X-Auth-Token: ABCDEFJ....”加到请求消息头即可,如下所示。 1 2 3 POST https://iam.cn-north-1.myhuaweicloud.com/v3/auth/projects Content-Type: application/json X-Auth-Token: ABCDEFJ.... 您还可以通过这个视频教程了解如何使用Token认证:https://bbs.huaweicloud.com/videos/101333。
  • AK/SK认证 AK/SK签名认证方式仅支持消息体大小在12MB以内,12MB以上的请求请使用Token认证。 AK/SK认证就是使用AK/SK对请求进行签名,在请求时将签名信息添加到消息头,从而通过身份认证。 AK(Access Key ID):访问密钥ID。与私有访问密钥关联的唯一标识符;访问密钥ID和私有访问密钥一起使用,对请求进行加密签名。 SK(Secret Access Key):私有访问密钥。与访问密钥ID结合使用,对请求进行加密签名,可标识发送方,并防止请求被修改。 使用AK/SK认证时,您可以基于签名算法使用AK/SK对请求进行签名,也可以使用专门的签名SDK对请求进行签名。详细的签名方法和SDK使用方法请参见API签名指南。 签名SDK只提供签名功能,与服务提供的SDK不同,使用时请注意。
  • 支持的授权项 策略包含系统策略和自定义策略,如果系统策略不满足授权要求,管理员可以创建自定义策略,并通过给用户组授予自定义策略来进行精细的访问控制。策略支持的操作与API相对应,授权项列表说明如下: 权限:允许或拒绝某项操作。 对应API接口:自定义策略实际调用的API接口。 授权项:自定义策略中支持的Action,在自定义策略中的Action中写入授权项,可以实现授权项对应的权限功能。 依赖的授权项:部分Action存在对其他Action的依赖,需要将依赖的Action同时写入授权项,才能实现对应的权限功能。 IAM项目(Project)/企业项目(Enterprise Project):自定义策略的授权范围,包括IAM项目与企业项目。授权范围如果同时支持IAM项目和企业项目,表示此授权项对应的自定义策略,可以在IAM和企业管理两个服务中给用户组授权并生效。如果仅支持IAM项目,不支持企业项目,表示仅能在IAM中给用户组授权并生效,如果在企业管理中授权,则该自定义策略不生效。关于IAM项目与企业项目的区别,详情请参见:IAM与企业管理的区别。 专属分布式存储服务(Dedicated Distributed Storage Service,DSS)支持的自定义策略授权项如下所示: 专属分布式存储池管理,包含专属分布式存储池接口对应的授权项,如查询某个特定的专属分布式存储池详情和专属分布式存储池详情列表。 磁盘管理,包含磁盘接口对应的授权项,如查询所有磁盘详情。
  • 请求方法 HTTP请求方法(也称为操作或动词),它告诉服务您正在请求什么类型的操作。 表2 HTTP方法 方法 说明 GET 请求服务器返回指定资源。 PUT 请求服务器更新指定资源。 POST 请求服务器新增资源或执行特殊操作。 DELETE 请求服务器删除指定资源,如删除对象等。 HEAD 请求服务器资源头部。 PATCH 请求服务器更新资源的部分内容。 当资源不存在的时候,PATCH可能会去创建一个新的资源。 在获取用户Token的URI部分,您可以看到其请求方法为“POST”,则其请求为: 1 POST https://iam.cn-north-1.myhuaweicloud.com/v3/auth/tokens
  • 请求消息头 附加请求头字段,如指定的URI和HTTP方法所要求的字段。例如定义消息体类型的请求头“Content-Type”,请求鉴权信息等。 详细的公共请求消息头字段请参见表3。 表3 公共请求消息头 名称 描述 是否必选 示例 Host 请求的服务器信息,从服务API的URL中获取。值为hostname[:port]。端口缺省时使用默认的端口,https的默认端口为443。 否 使用AK/SK认证时该字段必选。 code.test.com or code.test.com:443 Content-Type 消息体的类型(格式)。推荐用户使用默认值application/json,有其他取值时会在具体接口中专门说明。 是 application/json Content-Length 请求body长度,单位为Byte。 否 3495 X-Project-Id project id,项目编号。请参考获取项目ID章节获取项目编号。 否 如果是专属云场景采用AK/SK认证方式的接口请求,或者多project场景采用AK/SK认证的接口请求,则该字段必选。 e9993fc787d94b6c886cbaa340f9c0f4 X-Auth-Token 用户Token。 用户Token也就是调用获取用户Token接口的响应值,该接口是唯一不需要认证的接口。 请求响应成功后在响应消息头(Headers)中包含的“X-Subject-Token”的值即为Token值。 否 使用Token认证时该字段必选。 注:以下仅为Token示例片段。 MIIPAgYJKoZIhvcNAQcCo...ggg1BBIINPXsidG9rZ API同时支持使用AK/SK认证,AK/SK认证使用SDK对请求进行签名,签名过程会自动往请求中添加Authorization(签名认证信息)和X-Sdk-Date(请求发送的时间)请求头。 AK/SK认证的详细说明请参见认证鉴权的“AK/SK认证”。 对于获取用户Token接口,由于不需要认证,所以只添加“Content-Type”即可,添加消息头后的请求如下所示。 1 2 POST https://iam.cn-north-1.myhuaweicloud.com/v3/auth/tokens Content-Type: application/json
  • 请求消息体(可选) 该部分可选。请求消息体通常以结构化格式(如JSON或XML)发出,与请求消息头中Content-Type对应,传递除请求消息头之外的内容。若请求消息体中的参数支持中文,则中文字符必须为UTF-8编码。 每个接口的请求消息体内容不同,也并不是每个接口都需要有请求消息体(或者说消息体为空),GET、DELETE操作类型的接口就不需要消息体,消息体具体内容需要根据具体接口而定。 对于获取用户Token接口,您可以从接口的请求部分看到所需的请求参数及参数说明。将消息体加入后的请求如下所示,加粗的斜体字段需要根据实际值填写,其中username为用户名,domainname为用户所属的账号名称,********为用户登录密码,xxxxxxxxxxxxxxxxxx为project的名称,如“cn-north-1”,您可以从地区和终端节点获取。 scope参数定义了Token的作用域,下面示例中获取的Token仅能访问project下的资源。您还可以设置Token的作用域为某个账号下所有资源或账号的某个project下的资源,详细定义请参见获取用户Token。 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 POST https://iam.cn-north-1.myhuaweicloud.com/v3/auth/tokens Content-Type: application/json { "auth": { "identity": { "methods": [ "password" ], "password": { "user": { "name": "username", "password": "********", "domain": { "name": "domainname" } } } }, "scope": { "project": { "name": "xxxxxxxxxxxxxxxxxx" } } } } 到这里为止这个请求需要的内容就具备齐全了,您可以使用curl、Postman或直接编写代码等方式发送请求调用API。对于获取用户Token接口,返回的响应消息头中的“x-subject-token”就是需要获取的用户Token。有了Token之后,您就可以使用Token认证调用其他API。
  • 请求URI 请求URI由如下部分组成: {URI-scheme}://{Endpoint}/{resource-path}?{query-string} 尽管请求URI包含在请求消息头中,但大多数语言或框架都要求您从请求消息中单独传递它,所以在此单独强调。 表1 URI中的参数说明 参数 描述 URI-scheme 表示用于传输请求的协议,当前所有API均采用HTTPS协议。 Endpoint 指定承载REST服务端点的服务器域名或IP,不同服务不同区域的Endpoint不同,您可以从地区和终端节点获取。 例如IAM服务在“华北-北京四”区域的Endpoint为“iam.cn-north-4.myhuaweicloud.com”。 resource-path 资源路径,即API访问路径。从具体API的URI模块获取,例如“获取用户Token”API的resource-path为“/v3/auth/tokens”。 query-string 查询参数,是可选部分,并不是每个API都有查询参数。查询参数前面需要带一个“?”,形式为“参数名=参数取值”,例如“?limit=10”,表示查询不超过10条数据。 例如您需要获取IAM在“华北-北京四”区域的Token,则需使用“华北-北京四”区域的Endpoint(iam.cn-north-4.myhuaweicloud.com),并在获取用户Token的URI部分找到resource-path(/v3/auth/tokens),拼接起来如下所示。 1 https://iam.cn-north-4.myhuaweicloud.com/v3/auth/tokens 图1 URI示意图 为方便查看,在每个具体API的URI部分,只给出resource-path部分,并将请求方法写在一起。这是因为URI-scheme都是HTTPS,而Endpoint在同一个区域也相同,所以简洁起见将这两部分省略。
  • 示例流程 图1 给用户授权DSS权限流程 创建用户组并授权 在IAM控制台创建用户组,并授予专属分布式存储服务只读权限“DSS ReadOnlyAccess”。 创建用户并加入用户组 在IAM控制台创建用户,并将其加入1中创建的用户组。 用户登录并验证权限 新创建的用户登录控制台,切换至授权区域,验证权限: 在“服务列表”中选择专属分布式存储服务,进入DSS主界面,单击右上角“申请存储池”,尝试申请存储池,如果无法申请存储池(假设当前权限仅包含DSS ReadOnlyAccess),表示“DSS ReadOnlyAccess”已生效。 在“服务列表”中选择除专属分布式存储服务外(假设当前策略仅包含DSS ReadOnlyAccess)的任一服务,若提示权限不足,表示“DSS ReadOnlyAccess”已生效。
  • Token认证 Token的有效期为24小时,需要使用一个Token鉴权时,可以先缓存起来,避免频繁调用。 Token在计算机系统中代表令牌(临时)的意思,拥有Token就代表拥有某种权限。Token认证就是在调用API的时候将Token加到请求消息头中,从而通过身份认证,获得操作API的权限。Token可通过调用获取用户Token接口获取。 调用本服务API需要项目级别的Token,即调用获取用户Token接口时,请求body中auth.scope的取值需要选择project,如下所示。 { "auth": { "identity": { "methods": [ "password" ], "password": { "user": { "name": "username", //IAM用户名 "password": "********", //IAM用户密码 "domain": { "name": "domainname" //IAM用户所属账号名 } } } }, "scope": { "project": { "name": "xxxxxxxx" //项目名称 } } } } 获取Token后,再调用其他接口时,您需要在请求消息头中添加“X-Auth-Token”,其值即为Token。例如Token值为“ABCDEFJ....”,则调用接口时将“X-Auth-Token: ABCDEFJ....”加到请求消息头即可,如下所示。 1 2 3 POST https://iam.cn-north-1.myhuaweicloud.com/v3/auth/projects Content-Type: application/json X-Auth-Token: ABCDEFJ.... 您还可以通过这个视频教程了解如何使用Token认证:https://bbs.huaweicloud.com/videos/101333。
  • AK/SK认证 AK/SK签名认证方式仅支持消息体大小在12MB以内,12MB以上的请求请使用Token认证。 AK/SK认证就是使用AK/SK对请求进行签名,在请求时将签名信息添加到消息头,从而通过身份认证。 AK(Access Key ID):访问密钥ID。与私有访问密钥关联的唯一标识符;访问密钥ID和私有访问密钥一起使用,对请求进行加密签名。 SK(Secret Access Key):私有访问密钥。与访问密钥ID结合使用,对请求进行加密签名,可标识发送方,并防止请求被修改。 使用AK/SK认证时,您可以基于签名算法使用AK/SK对请求进行签名,也可以使用专门的签名SDK对请求进行签名。详细的签名方法和SDK使用方法请参见API签名指南。 签名SDK只提供签名功能,与服务提供的SDK不同,使用时请注意。
  • 基本概念 账号 用户注册时的账号,账号对其所拥有的资源及云服务具有完全的访问权限,可以重置用户密码、分配用户权限等。由于账号是付费主体,为了确保账号安全,建议您不要直接使用账号进行日常管理工作,而是创建用户并使用用户进行日常管理工作。 用户 由账号在IAM中创建的用户,是云服务的使用人员,具有身份凭证(密码和访问密钥)。 在我的凭证下,您可以查看账号ID和IAM用户ID。通常在调用API的鉴权过程中,您需要用到账号、用户和密码等信息。 区域(Region) 从地理位置和网络时延维度划分,同一个Region内共享弹性计算、块存储、对象存储、VPC网络、弹性公网IP、镜像等公共服务。Region分为通用Region和专属Region,通用Region指面向公共租户提供通用云服务的Region;专属Region指只承载同一类业务或只面向特定租户提供业务服务的专用Region。 详情请参见区域和可用区。 可用区(AZ,Availability Zone) 一个可用区是一个或多个物理数据中心的集合,有独立的风火水电,AZ内逻辑上再将计算、网络、存储等资源划分成多个集群。一个Region中的多个AZ间通过高速光纤相连,以满足用户跨AZ构建高可用性系统的需求。 项目 区域默认对应一个项目,这个项目由系统预置,用来隔离物理区域间的资源(计算资源、存储资源和网络资源),以默认项目为单位进行授权,用户可以访问您账号中该区域的所有资源。如果您希望进行更加精细的权限控制,可以在区域默认的项目中创建子项目,并在子项目中创建资源,然后以子项目为单位进行授权,使得用户仅能访问特定子项目中的资源,使得资源的权限控制更加精确。 图1 项目隔离模型 同样在我的凭证下,您可以查看项目ID。 企业项目 企业项目是项目的升级版,针对企业不同项目间的资源进行分组和管理,是逻辑隔离。企业项目中可以包含多个区域的资源,且项目中的资源可以迁入迁出。 关于企业项目ID的获取及企业项目特性的详细信息,请参见《企业管理用户指南》。 父主题: 使用前必读
  • 请求消息体(可选) 该部分可选。请求消息体通常以结构化格式(如JSON或XML)发出,与请求消息头中Content-Type对应,传递除请求消息头之外的内容。若请求消息体中的参数支持中文,则中文字符必须为UTF-8编码。 每个接口的请求消息体内容不同,也并不是每个接口都需要有请求消息体(或者说消息体为空),GET、DELETE操作类型的接口就不需要消息体,消息体具体内容需要根据具体接口而定。 对于获取用户Token接口,您可以从接口的请求部分看到所需的请求参数及参数说明。将消息体加入后的请求如下所示,加粗的斜体字段需要根据实际值填写,其中username为用户名,domainname为用户所属的账号名称,********为用户登录密码,xxxxxxxxxxxxxxxxxx为project的名称,如“cn-north-1”,您可以从地区和终端节点获取。 scope参数定义了Token的作用域,下面示例中获取的Token仅能访问project下的资源。您还可以设置Token的作用域为某个账号下所有资源或账号的某个project下的资源,详细定义请参见获取用户Token。 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 POST https://iam.cn-north-1.myhuaweicloud.com/v3/auth/tokens Content-Type: application/json { "auth": { "identity": { "methods": [ "password" ], "password": { "user": { "name": "username", "password": "********", "domain": { "name": "domainname" } } } }, "scope": { "project": { "name": "xxxxxxxxxxxxxxxxxx" } } } } 到这里为止这个请求需要的内容就具备齐全了,您可以使用curl、Postman或直接编写代码等方式发送请求调用API。对于获取用户Token接口,返回的响应消息头中的“x-subject-token”就是需要获取的用户Token。有了Token之后,您就可以使用Token认证调用其他API。
  • 请求方法 HTTP请求方法(也称为操作或动词),它告诉服务您正在请求什么类型的操作。 表2 HTTP方法 方法 说明 GET 请求服务器返回指定资源。 PUT 请求服务器更新指定资源。 POST 请求服务器新增资源或执行特殊操作。 DELETE 请求服务器删除指定资源,如删除对象等。 HEAD 请求服务器资源头部。 PATCH 请求服务器更新资源的部分内容。 当资源不存在的时候,PATCH可能会去创建一个新的资源。 在获取用户Token的URI部分,您可以看到其请求方法为“POST”,则其请求为: 1 POST https://iam.cn-north-1.myhuaweicloud.com/v3/auth/tokens
  • 请求URI 请求URI由如下部分组成: {URI-scheme}://{Endpoint}/{resource-path}?{query-string} 尽管请求URI包含在请求消息头中,但大多数语言或框架都要求您从请求消息中单独传递它,所以在此单独强调。 表1 URI中的参数说明 参数 描述 URI-scheme 表示用于传输请求的协议,当前所有API均采用HTTPS协议。 Endpoint 指定承载REST服务端点的服务器域名或IP,不同服务不同区域的Endpoint不同,您可以从地区和终端节点获取。 例如IAM服务在“华北-北京四”区域的Endpoint为“iam.cn-north-4.myhuaweicloud.com”。 resource-path 资源路径,即API访问路径。从具体API的URI模块获取,例如“获取用户Token”API的resource-path为“/v3/auth/tokens”。 query-string 查询参数,是可选部分,并不是每个API都有查询参数。查询参数前面需要带一个“?”,形式为“参数名=参数取值”,例如“?limit=10”,表示查询不超过10条数据。 例如您需要获取IAM在“华北-北京四”区域的Token,则需使用“华北-北京四”区域的Endpoint(iam.cn-north-4.myhuaweicloud.com),并在获取用户Token的URI部分找到resource-path(/v3/auth/tokens),拼接起来如下所示。 1 https://iam.cn-north-4.myhuaweicloud.com/v3/auth/tokens 图1 URI示意图 为方便查看,在每个具体API的URI部分,只给出resource-path部分,并将请求方法写在一起。这是因为URI-scheme都是HTTPS,而Endpoint在同一个区域也相同,所以简洁起见将这两部分省略。
  • 请求消息头 附加请求头字段,如指定的URI和HTTP方法所要求的字段。例如定义消息体类型的请求头“Content-Type”,请求鉴权信息等。 详细的公共请求消息头字段请参见表3。 表3 公共请求消息头 名称 描述 是否必选 示例 Host 请求的服务器信息,从服务API的URL中获取。值为hostname[:port]。端口缺省时使用默认的端口,https的默认端口为443。 否 使用AK/SK认证时该字段必选。 code.test.com or code.test.com:443 Content-Type 消息体的类型(格式)。推荐用户使用默认值application/json,有其他取值时会在具体接口中专门说明。 是 application/json Content-Length 请求body长度,单位为Byte。 否 3495 X-Project-Id project id,项目编号。请参考获取项目ID章节获取项目编号。 否 如果是专属云场景采用AK/SK认证方式的接口请求,或者多project场景采用AK/SK认证的接口请求,则该字段必选。 e9993fc787d94b6c886cbaa340f9c0f4 X-Auth-Token 用户Token。 用户Token也就是调用获取用户Token接口的响应值,该接口是唯一不需要认证的接口。 请求响应成功后在响应消息头(Headers)中包含的“X-Subject-Token”的值即为Token值。 否 使用Token认证时该字段必选。 注:以下仅为Token示例片段。 MIIPAgYJKoZIhvcNAQcCo...ggg1BBIINPXsidG9rZ API同时支持使用AK/SK认证,AK/SK认证使用SDK对请求进行签名,签名过程会自动往请求中添加Authorization(签名认证信息)和X-Sdk-Date(请求发送的时间)请求头。 AK/SK认证的详细说明请参见认证鉴权的“AK/SK认证”。 对于获取用户Token接口,由于不需要认证,所以只添加“Content-Type”即可,添加消息头后的请求如下所示。 1 2 POST https://iam.cn-north-1.myhuaweicloud.com/v3/auth/tokens Content-Type: application/json
  • 算子参数配置示例 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异步启动 步骤五:查看运行记录 查看历史运行记录,了解工作流的执行情况。 父主题: 处理数据
  • SDK概述 对象存储服务软件开发工具包(OBS SDK,Object Storage Service Software Development Kit)是对OBS服务提供的REST API进行的封装,以简化用户的开发工作。用户直接调用OBS SDK提供的接口函数即可实现使用OBS服务业务能力的目的。 相关开发包请从华为云OBS开发工具包(SDK)获取。 同时,我们针对不同语言的SDK提供了开发指南和API参考。开发指南详细介绍了SDK的安装、开发操作、参数、示例和常见问题处理,API参考提供了各API的所有参数及定义。OBS提供了以下主流语言SDK供开发者使用: 语言 SDK开发指南 API参考 Java Java SDK开发指南 - Python Python SDK开发指南 - C C SDK开发指南 - Go Go SDK开发指南 - BrowserJS BrowserJS SDK开发指南 BrowserJS SDK API参考 .NET .NET SDK开发指南 .NET SDK API参考 Android Android SDK开发指南 Android SDK API参考 iOS iOS SDK开发指南 iOS SDK API参考 PHP PHP SDK开发指南 PHP SDK API参考 Node.js Node.js SDK开发指南 Node.js SDK API参考
  • 灰度发布 为保障新特性能平稳上线,可以通过灰度发布功能选择少部分用户试用,待新特性成熟以后,再切换版本让所有用户使用。 基于ServiceComb Java Chassis框架开发的微服务需要在POM中添加依赖darklaunch或handler-router,并且在配置文件中增加servicecomb.router.type=router。 基于Spring Cloud Huawei框架开发的微服务需要在POM中增加依赖spring-cloud-starter-huawei-router。 登录微服务引擎控制台。 在左侧导航栏选择“ServiceComb引擎专享版”。 单击待操作的引擎。 单击“微服务目录”。 未开启安全认证的ServiceComb引擎,请执行6。 开启安全认证的ServiceComb引擎,请执行5。 在弹出的“安全认证”对话框输入账号名及其密码,单击“确定”。 首次连接ServiceComb引擎,请输入root账号名及创建ServiceComb引擎时输入的密码。 创建账号请参考新增账号。 在“微服务列表”页签,单击微服务名称,进入详情页面,单击“灰度发布”。 单击“添加发布规则”,弹出“创建新规则”弹框。 按照权重方式添加灰度规则。 “发布规则”选择“权重”,显示权重规则设置页签。 对权重规则进行设置,权重规则配置项如下表所示。 配置项 说明 规则名称 自定义规则名称。 作用域 选择规则作用的版本。 勾选“是否添加自定义版本”,根据界面提示添加新版本。 规则配置 配置所选版本的引流权重,流量会按照配置的百分比分配给所选择的服务版本。 单击“确定”,完成权重规则配置和灰度发布。 按照自定义方式添加灰度规则。 只有ServiceComb Java Chassis框架开发的微服务通过依赖darklaunch实现灰度能力和Spring Cloud Huawei框架开发的微服务实现灰度能力,可通过此功能实现下发灰度规则。依赖handler-router下发的灰度规则需要手动在配置中心下发。 “发布规则”选择“自定义”,显示自定义规则设置页签。 对自定义规则进行设置,自定义规则配置项如下表所示。 配置项 说明 规则名称 自定义规则名称。 作用域 选择规则作用的版本。 勾选“是否添加自定义版本”,根据界面提示添加新版本。 规则配置 设置匹配规则的参数,使用darklaunch实现灰度能力时,设置的是policyCondition内容,其他设置的是Headers参数。 Spring Cloud Huawei框架开发的微服务设置的Headers参数请参见设置Header参数 。 参数名 根据契约的参数名或Header自定义的key作为参数名设置。 规则 通过选择匹配符和契约的Key或Header的Key对应的Value确定符合该规则的请求将被分配到微服务版本中。 说明: 当匹配符选~时,可使用*或者?字符的模糊匹配规则自定义规则值,*表示任意长度字符,?表示一个字符。比如,字段Name的规则值配置为*1000时,表示Name后4位为1000的都能匹配上。 当匹配符没有选~时,*或者?字符只是普通字符,没有模糊匹配的作用。 单击“确定”,完成自定义规则配置和灰度发布。 下发灰度发布规则样例如下: ServiceComb Java Chassis框架开发的微服务,在ServiceComb引擎页面下发规则是基于darklaunch依赖下发的,通过配置自定义方式添加灰度规则。 其中,在规则配置中,参数名Key必须是契约里面存在的。有可能服务端接口写的是String paramA,加了注解实际生成的是paramB,所以这里应该是写paramB。 通过选择匹配符和契约的Key对应的Value确定符合该规则的请求将被分配到微服务版本中。 成功下发的规则内容如下:配置项为cse.darklaunch.policy.${serviceName}。 ServiceComb Java Chassis框架开发的微服务,依赖handler-router下发的灰度规则需要手动在配置中心下发,配置项为:servicecomb.routeRule.${serviceName},内容如下: Spring Cloud Huawei框架开发的微服务,ServiceComb引擎页面下发灰度规则如下:
共100000条