华为云用户手册

  • 请求参数 表1 请求参数列表 参数名称 参数类型 是否必选 描述 Bucket string 必选 桶名。 约束限制: 桶的名字需全局唯一,不能与已有的任何桶名称重复,包括其他用户创建的桶。 桶命名规则如下: 3~63个字符,数字或字母开头,支持小写字母、数字、“-”、“.”。 禁止使用IP地址。 禁止以“-”或“.”开头及结尾。 禁止两个“.”相邻(如:“my..bucket”)。 禁止“.”和“-”相邻(如:“my-.bucket”和“my.-bucket”)。 同一用户在同一个区域多次创建同名桶不会报错,创建的桶属性以第一次请求为准。 取值范围: 长度为3~63个字符。 默认取值: 无 Key string 必选 参数解释: 对象名。对象名是对象在存储桶中的唯一标识。对象名是对象在桶中的完整路径,路径中不包含桶名。 例如,您对象的访问地址为examplebucket.obs.cn-north-4.myhuaweicloud.com/folder/test.txt 中,对象名为folder/test.txt。 约束限制: 无 取值范围: 长度大于0且不超过1024的字符串。 默认取值: 无 VersionId string 可选 参数解释: 对象的版本号。例如:G001117FCE89978B0000401205D5DC9A。 约束限制: 无 取值范围: 长度为32的字符串。 默认取值: 无 Tags Tag[] 必选 参数解释: 对象标签列表。 约束限制: 一个桶默认最大拥有10个标签。每个标签有且只有一对键值。 同一个桶标签的键不能重复,但是值可以重复,并且可以为空。 取值范围: 详见Tag。 默认取值: 无 表2 Tag 参数名称 参数类型 是否必选 描述 Key string 作为请求参数时必选 参数解释: 标签的键。 约束限制: 同一个桶标签的键不能重复。 最大长度为36个字符。 UTF-8格式表示的字母(含中文)、数字、空格,以及以下字符:_ . : = + - @。 区分大小写。 不能为空。 取值范围: 长度为1到36个字符。 默认取值: 无 Value string 作为请求参数时必选 参数解释: 标签的值。 约束限制: 标签的值可以重复。 长度范围为0到43个字符。 UTF-8格式表示的字母(含中文)、数字、空格,以及以下字符:_ . : = + - @。 区分大小写。 可以为空 取值范围: 长度为0到43个字符。 默认取值: 无
  • 接口约束 您必须是桶拥有者或拥有设置对象标签的权限,才能设置对象标签。建议使用 IAM 或桶策略进行授权,如果请求中不携带版本号(versionId),使用IAM则需授予obs:object:PutObjectTagging权限,使用桶策略则需授予PutObjectTagging权限。如果请求中携带版本号(versionId),使用IAM则需额外授予obs:object:PutObjectVersionTagging权限,使用桶策略则需额外授予PutObjectVersionTagging权限。相关授权方式介绍可参见OBS权限控制概述,配置方式详见使用IAM自定义策略、自定义创建桶策略。 默认设置Object当前版本的标签信息。可以通过指定versionId参数来设置指定Object版本的标签信息。如果对应版本为删除标记(Delete Marker),则OBS将返回404 Not Found。 并行文件系统不支持该功能。 每个对象最多能设置10个标签。 OBS支持的Region与Endpoint的对应关系,详细信息请参见地区与终端节点。
  • OBS服务端错误码(Python SDK) 在向OBS服务端发出请求后,如果遇到错误,会在响应中包含响应的错误码描述错误信息。 详细的错误码及其对应的描述和HTTP状态码见下表: HTTP状态码 错误码 错误信息 处理措施 301 Moved Permanently PermanentRedirect 尝试访问的桶必须使用指定的地址,请将以后的请求发送到这个地址。 按照返回的重定向地址发送请求。 301 Moved Permanently WebsiteRedirect Website请求缺少bucketName。 携带桶名后重试。 307 Moved Temporarily TemporaryRedirect 临时重定向,当DNS更新时,请求将被重定向到桶。 会自动重定向,也可以将请求发送到重定向地址。 400 Bad Request BadDigest 客户端指定的对象内容的MD5值与系统接收到的内容MD5值不一致。 检查头域中携带的MD5与消息体计算出来的MD5是否一致。 400 Bad Request BadDomainName 域名 不合法。 使用合法的域名。 400 Bad Request BadRequest 请求参数不合法。 根据返回的错误消息体提示进行修改。 400 Bad Request CustomDomainAreadyExist 配置了已存在的域。 已经配置过了,不需要再配置。 400 Bad Request CustomDomainNotExist 删除不存在的域。 未配置或已经删除,无需删除。 400 Bad Request EntityTooLarge 用户POST上传的对象大小超过了条件允许的最大大小。 修改POST上传的policy中的条件或者减少对象大小。 400 Bad Request EntityTooSmall 用户POST上传的对象大小小于条件允许的最小大小。 修改POST上传的policy中的条件或者增加对象大小。 400 Bad Request IllegalLocationConstraintException 用户未带Location在非默认Region创桶。 请求发往默认Region创桶或带非默认Region的Location创桶。 400 Bad Request IncompleteBody 由于网络原因或其他问题导致请求体未接受完整。 重新上传对象。 400 Bad Request IncorrectNumberOfFilesInPost Request 每个POST请求都需要带一个上传的文件。 带上一个上传文件。 400 Bad Request InvalidArgument 无效的参数。 根据返回的错误消息体提示进行修改。 400 Bad Request InvalidBucket 请求访问的桶已不存在。 更换桶名。 400 Bad Request InvalidBucketName 请求中指定的桶名无效,超长或带不允许的特殊字符。 更换桶名。 400 Bad Request InvalidEncryptionAlgorithmError 错误的加密算法。下载SSE-C加密的对象,携带的加密头域错误,导致不能解密。 携带正确的加密头域下载对象。 400 Bad Request InvalidLocationConstraint 创建桶时,指定的Location不合法或不存在。 指定正确的Location创桶。 400 Bad Request InvalidPart 一个或多个指定的段无法找到。这些段可能没有上传,或者指定的entity tag与段的entity tag不一致。 按照正确的段和entity tag合并段。 400 Bad Request InvalidPartOrder 段列表的顺序不是升序,段列表必须按段号升序排列。 按段号升序排列后重新合并。 400 Bad Request InvalidPolicyDocument 表单中的内容与策略文档中指定的条件不一致。 根据返回的错误消息体提示修改构造表单的policy重试。 400 Bad Request InvalidRedirectLocation 无效的重定向地址。 指定正确的地址。 400 Bad Request InvalidRequest 无效请求。 根据返回的错误消息体提示进行修改。 400 Bad Request InvalidRequestBody 请求体无效,需要消息体的请求没有上传消息体。 按照正确的格式上传消息体。 400 Bad Request InvalidTargetBucketForLogging delivery group对目标桶无ACL权限。 对目标桶配置ACL权限后重试。 400 Bad Request KeyTooLongError 提供的Key过长。 使用较短的Key。 400 Bad Request KMS.DisabledException SSE-KMS加密方式下,主密钥被禁用。 更换密钥后重试,或联系技术支持。 400 Bad Request KMS.NotFoundException SSE-KMS加密方式下,主密钥不存在。 携带正确的主密钥重试。 400 Bad Request MalformedACLError 提供的XML格式错误,或者不符合要求的格式。 使用正确的XML格式重试。 400 Bad Request MalformedError 请求中携带的XML格式不正确。 使用正确的XML格式重试。 400 Bad Request MalformedLoggingStatus Logging的XML格式不正确。 使用正确的XML格式重试。 400 Bad Request MalformedPolicy Bucket policy检查不通过。 根据返回的错误消息体提示结合桶policy的要求进行修改。 400 Bad Request MalformedQuotaError Quota的XML格式不正确。 使用正确的XML格式重试。 400 Bad Request MalformedXML 当用户发送了一个配置项的错误格式的XML会出现这样的错误。 使用正确的XML格式重试。 400 Bad Request MaxMessageLengthExceeded 拷贝对象,带请求消息体。 拷贝对象不带消息体重试。 400 Bad Request MetadataTooLarge 元数据消息头超过了允许的最大元数据大小。 减少元数据消息头。 400 Bad Request MissingRegion 请求中缺少Region信息,且系统无默认Region。 请求中携带Region信息。 400 Bad Request MissingRequestBodyError 当用户发送一个空的XML文档作为请求时会发生。 提供正确的XML文档。 400 Bad Request MissingRequiredHeader 请求中缺少必要的头域。 提供必要的头域。 400 Bad Request MissingSecurityHeader 请求缺少一个必须的头。 提供必要的头域。 400 Bad Request TooManyBuckets 用户拥有的桶的数量达到了系统的上限,并且请求试图创建一个新桶。 删除部分桶后重试。 400 Bad Request TooManyCustomDomains 配置了过多的用户域 删除部分用户域后重试。 400 Bad Request TooManyWrongSignature 因高频错误请求被拒绝服务。 更换正确的Access Key后重试。 400 Bad Request UnexpectedContent 该请求需要消息体而客户端没带,或该请求不需要消息体而客户端带了。 根据说明重试。 400 Bad Request UserKeyMustBeSpecified 该操作只有特殊用户可使用。 请联系技术支持。 403 Forbidden AccessDenied 拒绝访问,请求没有携带日期头域或者头域格式错误。 请求携带正确的日期头域。 403 Forbidden AccessForbidden 权限不足,桶未配置CORS或者CORS规则不匹配。 修改桶的CORS配置,或者根据桶的CORS配置发送匹配的OPTIONS请求。 403 Forbidden AllAccessDisabled 用户无权限执行某操作。桶名为禁用关键字。 更换桶名。 403 Forbidden DeregisterUserId 用户已经注销。 充值或重新开户。 403 Forbidden InArrearOrInsufficientBalance 用户欠费或余额不足而没有权限进行某种操作。 充值。 403 Forbidden InsufficientStorageSpace 存储空间不足。 超过配额限制,增加配额或删除部分对象。 403 Forbidden InvalidAccessKeyId 系统记录中不存在客户提供的Access Key Id。 携带正确的Access Key Id。 403 Forbidden NotSignedUp 你的账户还没有在系统中注册,必须先在系统中注册了才能使用该账户。 先注册OBS服务。 403 Forbidden RequestTimeTooSkewed 请求的时间与服务器的时间相差太大。 检查客户端时间是否与当前时间相差太大。 403 Forbidden SignatureDoesNotMatch 请求中带的签名与系统计算得到的签名不一致。 检查你的Secret Access Key和签名计算方法。 403 Forbidden Unauthorized 用户未实名认证。 请实名认证后重试。 404 Not Found NoSuchBucket 指定的桶不存在。 先创桶再操作。 404 Not Found NoSuchBucketPolicy 桶policy不存在。 先配置桶policy。 404 Not Found NoSuchCORSConfiguration CORS配置不存在。 先配置CORS。 404 Not Found NoSuchCustomDomain 请求的用户域不存在。 先设置用户域。 404 Not Found NoSuchKey 指定的Key不存在。 先上传对象。 404 Not Found NoSuchLifecycleConfiguration 请求的LifeCycle不存在。 先配置LifeCycle。 404 Not Found NoSuchUpload 指定的多段上传不存在。Upload ID不存在,或者多段上传已经终止或完成。 使用存在的段或重新初始化段。 404 Not Found NoSuchVersion 请求中指定的version ID与现存的所有版本都不匹配。 使用正确的version ID。 404 Not Found NoSuchWebsiteConfiguration 请求的Website不存在。 先配置Website。 405 Method Not Allowed MethodNotAllowed 指定的方法不允许操作在请求的资源上。 对应返回的Message为:Specified method is not supported. 方法不允许。 408 Request Timeout RequestTimeout 用户与Server之间的socket连接在超时时间内没有进行读写操作。 检查网络后重试,或联系技术支持。 409 Conflict BucketAlreadyExists 请求的桶名已经存在。桶的命名空间是系统中所有用户共用的,选择一个不同的桶名再重试一次。 更换桶名。 409 Conflict BucketAlreadyOwnedByYou 发起该请求的用户已经创建过了这个名字的桶,并拥有这个桶。 不需要再创桶了。 409 Conflict BucketNotEmpty 用户尝试删除的桶不为空。 先删除桶中对象,然后再删桶。 409 Conflict InvalidBucketState 无效的桶状态,配置跨Region复制后不允许关闭桶多版本。 不关闭桶的多版本或取消跨Region复制。 409 Conflict OperationAborted 另外一个冲突的操作当前正作用在这个资源上,请重试。 等待一段时间后重试。 409 Conflict ServiceNotSupported 请求的方法服务端不支持。 服务端不支持,请联系技术支持。 411 Length Required MissingContentLength 必须要提供HTTP消息头中的Content-Length字段。 提供Content-Length消息头。 412 Precondition Failed PreconditionFailed 用户指定的先决条件中至少有一项没有包含。 根据返回消息体中的Condition提示进行修改。 416 Client Requested Range Not Satisfiable InvalidRange 请求的range不可获得。 携带正确的range重试。 500 Internal Server Error InternalError 系统遇到内部错误,请重试。 请联系技术支持。 501 Not Implemented ServiceNotImplemented 请求的方法服务端没有实现。 当前不支持,请联系技术支持。 503 Service Unavailable ServiceUnavailable 服务器过载或者内部错误异常。 等待一段时间后重试,或联系技术支持。 503 Service Unavailable SlowDown 请降低请求频率。 请降低请求频率。 父主题: 异常处理(Python SDK)
  • 请求参数说明 参数名称 参数类型 是否必选 描述 bucketName str 必选 参数解释: 桶名。 约束限制: 桶的名字需全局唯一,不能与已有的任何桶名称重复,包括其他用户创建的桶。 桶命名规则如下: 3~63个字符,数字或字母开头,支持小写字母、数字、“-”、“.”。 禁止使用IP地址。 禁止以“-”或“.”开头及结尾。 禁止两个“.”相邻(如:“my..bucket”)。 禁止“.”和“-”相邻(如:“my-.bucket”和“my.-bucket”)。 同一用户在同一个区域多次创建同名桶不会报错,创建的桶属性以第一次请求为准。 默认取值: 无 extensionHeaders dict 可选 参数解释: 接口的拓展头域。 取值范围: 参考自定义头域。 默认取值: 无
  • 接口约束 您必须是桶拥有者或拥有获取桶的生命周期配置的权限,才能获取桶的生命周配置。建议使用IAM或桶策略进行授权,如果使用IAM则需授予obs:bucket:GetLifecycleConfiguration权限,如果使用桶策略则需授予GetLifecycleConfiguration权限。相关授权方式介绍可参见OBS权限控制概述,配置方式详见使用IAM自定义策略、自定义创建桶策略。 OBS支持的Region与Endpoint的对应关系,详细信息请参见地区与终端节点。
  • 返回结果说明 类型 说明 GetResult 参数解释: SDK公共结果对象。 表3 GetResult 参数名称 参数类型 描述 status int 参数解释: HTTP状态码。 取值范围: 状态码是一组从2xx(成功)到4xx或5xx(错误)的数字代码,状态码表示了请求响应的状态。完整的状态码列表请参见状态码。 默认取值: 无 reason str 参数解释: HTTP文本描述。 默认取值: 无 errorCode str 参数解释: OBS服务端错误码,当status参数小于300时为空。 默认取值: 无 errorMessage str 参数解释: OBS服务端错误描述,当status参数小于300时为空。 默认取值: 无 requestId str 参数解释: OBS服务端返回的请求ID。 默认取值: 无 indicator str 参数解释: OBS服务端返回的错误定位码。 默认取值: 无 hostId str 参数解释: 请求的服务端ID,当status参数小于300时为空。 默认取值: 无 resource str 参数解释: 发生错误时相关的桶或对象,当status参数小于300时为空。 默认取值: 无 header list 参数解释: 响应消息头列表,由多个元组构成。每个元组均包含两个元素,代表响应头的键值对。 默认取值: 无 body object 参数解释: 操作成功后的结果数据,当status大于300时为空。该值根据调用接口的不同而不同,参见“桶相关接口”章节和“对象相关接口”章节的详细描述。 默认取值: 无
  • 请求参数说明 参数名称 参数类型 是否必选 描述 bucketName str 必选 参数解释: 桶名。 约束限制: 桶的名字需全局唯一,不能与已有的任何桶名称重复,包括其他用户创建的桶。 桶命名规则如下: 3~63个字符,数字或字母开头,支持小写字母、数字、“-”、“.”。 禁止使用IP地址。 禁止以“-”或“.”开头及结尾。 禁止两个“.”相邻(如:“my..bucket”)。 禁止“.”和“-”相邻(如:“my-.bucket”和“my.-bucket”)。 同一用户在同一个区域多次创建同名桶不会报错,创建的桶属性以第一次请求为准。 默认取值: 无 extensionHeaders dict 可选 参数解释: 接口的拓展头域。 取值范围: 参考自定义头域。 默认取值: 无
  • 接口约束 您必须是桶拥有者或拥有获取桶标签的权限,才能获取桶标签。建议使用IAM或桶策略进行授权,如果使用IAM则需授予obs:bucket:GetBucketTagging权限,如果使用桶策略则需授予GetBucketTagging权限。相关授权方式介绍可参见OBS权限控制概述,配置方式详见使用IAM自定义策略、自定义创建桶策略。 OBS支持的Region与Endpoint的对应关系,详细信息请参见地区与终端节点。
  • 代码样例 此用例用于生成带授权信息的临时URL。 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 from obs import ObsClient import os import traceback import base64 # 推荐通过环境变量获取AKSK,这里也可以使用其他外部引入方式传入,如果使用硬编码可能会存在泄露风险 # 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html ak = os.getenv("AccessKeyID") sk = os.getenv("SecretAccessKey") # 【可选】如果使用临时AKSK和SecurityToken访问OBS,则同样推荐通过环境变量获取 # security_token = os.getenv("SecurityToken") # server填写Bucket对应的Endpoint, 这里以华北-北京四为例,其他地区请按实际情况填写 server = "https://obs.cn-north-4.myhuaweicloud.com" # 创建obsClient实例 # 如果使用临时AKSK和SecurityToken访问OBS,需要在创建实例时通过security_token参数指定securityToken值 obsClient = ObsClient(access_key_id=ak, secret_access_key=sk, server=server) try: # 生成创建桶的带授权信息的URL res1 = obsClient.createSignedUrl(method='PUT', bucketName='bucketname', expires=3600) print('signedUrl:', res1.signedUrl) print('actualSignedRequestHeaders:', res1.actualSignedRequestHeaders) # 生成上传对象的带授权信息的URL res2 = obsClient.createSignedUrl(method='PUT', bucketName='bucketname', objectKey='objectkey', expires=3600, headers={'Content-Type': 'text/plain'}) print('signedUrl:', res2.signedUrl) print('actualSignedRequestHeaders:', res2.actualSignedRequestHeaders) # 生成设置对象ACL的带授权信息的URL res3 = obsClient.createSignedUrl(method='PUT', bucketName='bucketname', objectKey='objectkey', specialParam='acl', expires=3600, headers={'x-obs-acl': 'private'}) print('signedUrl:', res3.signedUrl) print('actualSignedRequestHeaders:', res3.actualSignedRequestHeaders) # 生成下载对象的带授权信息的URL res4 = obsClient.createSignedUrl(method='GET', bucketName='bucketname', objectKey='objectkey', expires=3600) print('signedUrl:', res4.signedUrl) print('actualSignedRequestHeaders:', res4.actualSignedRequestHeaders) # 生成删除对象的带授权信息的URL res5 = obsClient.createSignedUrl(method='DELETE', bucketName='bucketname', objectKey='objectkey', expires=3600) print('signedUrl:', res5.signedUrl) print('actualSignedRequestHeaders:', res5.actualSignedRequestHeaders) # 生成删除桶的带授权信息的URL res6 = obsClient.createSignedUrl(method='DELETE', bucketName='bucketname', expires=3600) print('signedUrl:', res6.signedUrl) print('actualSignedRequestHeaders:', res6.actualSignedRequestHeaders) # 生成设置初始化分段任务的带授权信息的URL res7 = obsClient.createSignedUrl(method='POST', bucketName='bucketname', objectKey='objectkey', specialParam='uploads', expires=3600) print('signedUrl:', res7.signedUrl) print('actualSignedRequestHeaders:', res7.actualSignedRequestHeaders) # 生成上传段的带授权信息的URL, res8 = obsClient.createSignedUrl(method='PUT', bucketName='bucketname', objectKey='objectkey', expires=3600, queryParams={'partNumber': '1', 'uploadId': '00000*****'}) print('signedUrl:', res8.signedUrl) print('actualSignedRequestHeaders:', res8.actualSignedRequestHeaders) # 生成合并段的带授权信息的URL res9 = obsClient.createSignedUrl(method='POST', bucketName='bucketname', objectKey='objectkey', expires=3600, queryParams={'uploadId': '00000*****'}) print('signedUrl:', res9.signedUrl) print('actualSignedRequestHeaders:', res9.actualSignedRequestHeaders) # 生成图片持久化处理的带授权信息的URL # 源对象所在的桶名 bucketName = 'originBucketName'; # 处理前的源对象名 objectKey = 'test.png'; # 处理后的对象名 targetObjectName ="save.png" # 处理后保存的桶名, 可选参数 targetBucketName ="saveBucketName" queryParams={} queryParams["x-image-process"]="image/resize,w_100" queryParams["x-image-save-object"]=base64.b64encode(targetObjectName .encode("utf-8")).decode() # 可选参数 queryParams["x-image-save-bucket"]=base64.b64encode(targetBucketName .encode("utf-8")).decode() res10 = obsClient.createSignedUrl(method='GET', bucketName=bucketName, objectKey=objectKey, queryParams=queryParams, expires=3600) print('signedUrl:', res10.signedUrl) print('actualSignedRequestHeaders:', res10.actualSignedRequestHeaders) except: print(traceback.format_exc())
  • 接口约束 OBS支持的Region与Endpoint的对应关系,详细信息请参见地区与终端节点。 如果遇到跨域报错、签名不匹配问题,请参考以下步骤排查问题: 未配置跨域,需要在控制台配置CORS规则,请参考配置桶允许跨域请求。 签名计算问题,请参考URL中携带签名排查签名参数是否正确;比如上传对象功能,后端将Content-Type参与计算签名生成授权URL,但是前端使用授权URL时没有设置Content-Type字段或者传入错误的值,此时会出现跨域错误。解决方案为:Content-Type字段前后端保持一致。
  • 请求参数 表1 请求参数列表 参数名称 参数类型 是否必选 描述 method str 必选 参数解释: HTTP方法类型 取值范围: GET POST PUT DELETE HEAD 默认取值: 无 bucketName str 可选 参数解释: 桶名。 约束限制: 桶的名字需全局唯一,不能与已有的任何桶名称重复,包括其他用户创建的桶。 桶命名规则如下: 3~63个字符,数字或字母开头,支持小写字母、数字、“-”、“.”。 禁止使用IP地址。 禁止以“-”或“.”开头及结尾。 禁止两个“.”相邻(如:“my..bucket”)。 禁止“.”和“-”相邻(如:“my-.bucket”和“my.-bucket”)。 同一用户在同一个区域多次创建同名桶不会报错,创建的桶属性以第一次请求为准。 默认取值: 无 objectKey str 可选 参数解释: 对象名。对象名是对象在存储桶中的唯一标识。对象名是对象在桶中的完整路径,路径中不包含桶名。 例如,您对象的访问地址为examplebucket.obs.cn-north-4.myhuaweicloud.com/folder/test.txt 中,对象名为folder/test.txt。 取值范围: 长度大于0且不超过1024的字符串。 默认取值: 无 specialParam str 可选 参数解释: 特殊操作符,代表要操作的子资源, 取值范围: versions uploads location storageinfo quota storagePolicy acl append logging policy lifecycle website versioning cors notification tagging delete restore 默认取值: 无 expires int 可选 参数解释: 带授权信息的URL的过期时间。 取值范围: 临时密钥取值范围为0~86400秒。 永久密钥取值范围为0~630720000秒。 默认取值: 300秒 headers dict 可选 参数解释: 请求中携带的头域。 默认取值: 无 queryParams dict 可选 参数解释: 请求中携带的查询参数。 默认取值: 无 如果遇到跨域报错、签名不匹配问题,请参考以下步骤排查问题: 未配置跨域,需要在控制台配置CORS规则,请参考配置桶允许跨域请求。 签名计算问题,请参考URL中携带签名排查签名参数是否正确;比如上传对象功能,后端将Content-Type参与计算签名生成授权URL,但是前端使用授权URL时没有设置Content-Type字段或者传入错误的值,此时会出现跨域错误。解决方案为:Content-Type字段前后端保持一致。
  • 方案概述 应用场景 在以下场景,使用MirrorMaker进行不同集群间的数据同步,可以确保Kafka集群的可用性和可靠性。 备份和容灾:企业存在多个数据中心,为了防止其中一个数据中心出现问题,导致业务不可用,会将集群数据同步备份在多个不同的数据中心。 集群迁移:当今很多企业将业务迁移上云,迁移过程中需要确保线下集群和云上集群的数据同步,保证业务的连续性。 方案架构 使用MirrorMaker可以实现将源集群中的数据镜像复制到目标集群中。其原理如图1所示,MirrorMaker本质上也是生产消费消息,首先从源集群中消费数据,然后将消费的数据生产到目标集群。如果您需要了解更多关于MirrorMaker的信息,请参见Mirroring data between clusters。 图1 MirrorMaker原理图
  • 解释说明 用于指定需要通过VPN连接访问云上业务VPC的用户侧子网。 若存在多个对端子网,请用半角逗号(,)隔开。 对端子网可以和本端子网重叠,但不能重合。 对端子网不能被VPN网关关联的VPC内已有子网所包含;不能作为被VPN网关关联的VPC自定义路由表的目的地址。 对端子网不能是VPC的预留网段,例如100.64.0.0/10、214.0.0.0/8。 如果互联子网关联了ACL规则,则需要确保ACL规则中已放通所有本端子网到对端子网的业务所需的协议和端口。
  • 配置VPN连接的本端子网和对端子网时需要注意什么? 子网数量满足规格限制,数量超出规格限制请进行聚合汇总。 每个VPN网关配置的本地子网数量:50 每个VPN连接支持配置的对端子网个数:50 本端子网不可以包含对端子网,对端子网可以包含本端子网。 推荐配置的本端子网在VPC内有路由可达。 同一个VPN网关创建两条连接:若这两条连接的对端子网存在包含关系,在访问的目的网络处于交集网段部分时,按照创建连接的先后顺序匹配VPN连接,且与连接状态无关(策略模式不能按照掩码长度进行匹配)。
  • 解释说明 接口地址为VPN网关和对端网关通信的tunnel隧道IP地址。 如果对端网关的tunnel接口地址固定不可更改,请使用“手动分配”模式,并根据对端网关的tunnel接口地址设置VPN网关的tunnel接口地址。 手动分配 本地隧道接口地址:VPN网关上的tunnel接口地址。 对端隧道接口地址:对端网关上的tunnel接口地址,该接口地址需要和对端网关实际配置的tunnel接口地址保持一致。 仅支持在169.254.x.x/30网段(除169.254.195.x/30)范围内,配置VPN网关本端接口地址的tunnel接口地址;对端网关对端接口地址的tunnel接口地址会根据本端接口地址自动生成。 当“连接模式”采用“BGP路由模式”的场景下,选择“手动分配”的方式配置隧道接口地址时,对端设备VPN连接的隧道接口地址需要与本端隧道地址配置成镜像地址。 自动分配 VPN网关默认使用169.254.x.x/30网段(除169.254.195.x/30)对tunnel接口分配地址。 自动分配的本端接口地址/对端接口地址,可以在VPN连接页面,单击“修改连接信息”进行查看。 当“连接模式”采用“BGP路由模式”的场景下,选择“自动分配”的方式,在创建连接后,可查看分配的本端隧道接口地址和对端隧道接口地址,对端设备VPN连接的隧道接口地址需要与本端隧道地址配置成镜像地址。 必须是主机地址,不能是广播地址或网段地址。
  • 自定义监控指标上报到 AOM 除了ModelArts控制台可以直接查看的训练作业相关指标外,还支持自定义监控指标上报到AOM控制台查看。配置步骤如下。 准备训练代码,在训练代码中增加指标监控的代码。具体代码示例如下。准备训练代码的其它要求请参见准备模型训练代码。 代码中倒数第2行的region = "cn-southwest-2"参数值请替换成实际region值,region取值可以参考终端节点。 代码中增加监控指标数据,具体参数解释参考AOM文档。 # coding: utf-8 import os from huaweicloudsdkaom.v2 import * from huaweicloudsdkaom.v2.region.aom_region import AomRegion from huaweicloudsdkcore.auth.credentials import BasicCredentials from huaweicloudsdkcore.exceptions import exceptions from moxing.framework import cloud_utils def report2Aom(request,region): auth = cloud_utils.get_auth() #AK、SK和临时TOKEN值,系统会自动获取无需在代码中填写。 ak = auth.AK sk = auth.SK securityToken = auth.TOKEN projectId = os.environ.get("MA_IAM_PROJECT_ID") credentials = BasicCredentials(ak, sk, projectId).with_security_token(securityToken) client = AomClient.new_builder() \ .with_credentials(credentials) \ .with_region(AomRegion.value_of(region)) \ .build() try: response = client.add_metric_data(request) print(response) except Exception as e: print(e) if __name__ == "__main__": request = AddMetricDataRequest() listValuesBody = [ #下面填上对应的指标名称、类型、单位、数值,比如step_time、loss值等 ValueData( metric_name="step_time", #监控指标名称,例如step_time type="float", #指标的数据类型,取值范围只能是"int"或"float"。 unit="ms", #数据的单位。长度不超过32个字符,此处举例为ms value=135.572 #指标数据的值。取值范围有效的数值类型。最小值0 ), ValueData( metric_name="loss", type="float", value=0.6932 ) ] listDimensionsMetric = [ #下面填上想查看的指标维度,比如线程、host等等 Dimension2( name="cluster_name",#此处仅为举例示意,请替换为实际需要查看的指标维度 value="fab2c5cf438b4f0c851fdcdf"# 此处仅为举例示意,请替换为实际参数值 ), Dimension2( name="user_name", value="modelarts_02" # 此处仅为举例示意,请替换为实际参数值 ), Dimension2( name="user_id", value="04f258c8fb00d42a1f6xxx" # 此处仅为举例示意,请替换为实际参数值 ) ] metricBody = MetricItemInfo( dimensions=listDimensionsMetric, namespace="NOPAAS.ESC" #保持默认值即可,无需修改 ) listBodybody = [ MetricDataItem( collect_time=int(round(time.time()*1000)), #监控指标数据收集时间,为最新的时间戳,ms为单位 metric=metricBody, values=listValuesBody ) ] request.body = listBodybody region = "cn-southwest-2" #请根据实际region替换 response = report2Aom(request,region) 在训练代码中加入命令,用于加载对应的依赖包。如果使用的是自定义镜像,也可以在制作镜像时安装以下依赖,具体参见开发用于自定义镜像训练的代码。 pip install huaweicloudsdkaom pip install huaweicloudsdkcore 创建训练作业并运行,具体参考创建生产训练作业章节。 登录AOM控制台,在“指标浏览”页面,通过指定“指标”查看上报的指标数据。 图1 AOM上查看指标数据 参考告警上报配置方法章节设置AOM告警和通知机制。
  • 修订记录 表1 修订记录 发布日期 修订记录 2025-04-01 下线OBS对接知识库一键部署入口 2025-03-19 单机版上线联网搜索 2025-03-12 支持CCE容器高可用部署 2025-03-05 支持Dify知识库对接华为云OBS 2025-03-04 升级云服务器默认规格 2025-02-25 开始使用增加MAAS/一键部署DeepSeek对接指导 2025-02-17 更新Dify 0.15.3版本。 2024-11-07 第一次正式发布。
    AI
  • 计费说明 云审计 服务本身免费,包括开通追踪器、事件跟踪以及7天内事件的存储和检索。同时云审计服务与华为云其他云服务可以组合使用(可能会产生部分由其他服务收取的费用),为您提供事件文件转储、事件文件加密等增值服务,这些增值服务可能产生额外费用,通常情况下,云审计服务产生的增值服务费用很低,因此建议您根据实际需要搭配使用。 增值服务列表如下: 事件转储:需要使用 对象存储服务 (OBS),管理类追踪器配置的转储事件文件将永久保存,数据类追踪器配置的转储事件按照转储的时间保存。OBS的计费详情请参考计费概述。 事件文件加密存储:在开通事件转储的基础上,需要使用 数据加密 服务(DEW)对存储在OBS桶中的事件文件进行加密。DEW的计费详情请参考计费概述。 日志转储: CTS 提供将审计日志转储至LTS的功能,但依赖 云日志 服务(LTS)的日志存储功能收费。LTS的计费详情请参考计费概述。 关键操作通知:CTS提供关键操作通知功能,可在发生特定操作时向用户手机、邮箱发送消息,但发送消息需要使用 消息通知 服务( SMN )订阅主题。
  • 什么是云审计服务 日志审计模块是信息安全审计功能的核心必备组件,是企事业单位信息系统安全风险管控的重要组成部分。 云审计服务(Cloud Trace Service,以下简称CTS),是华为 云安全 解决方案中专业的日志审计服务,提供对各种云资源操作记录的收集、存储和查询功能,可用于支撑安全分析、合规审计、资源跟踪、问题回溯和问题定位等常见应用场景。 图1 云审计服务介绍 云审计服务的功能主要包括: 记录审计日志:支持记录用户通过管理控制台或API接口发起的操作,以及各服务内部自触发的操作。 审计日志查询:支持在管理控制台对7天内操作记录按照事件类型、事件来源、资源类型、筛选类型、操作用户和事件级别等多个维度进行组合查询。 审计日志转储:支持将审计日志周期性的转储至对象存储服务(Object Storage Service,简称OBS)下的OBS桶,转储时会按照服务维度压缩审计日志为事件文件,还支持将审计日志转储至云日志服务(Log Tank Service,简称LTS)下的LTS日志流。 事件文件加密:支持在转储过程中使用数据加密服务(Data Encryption Workshop,简称DEW)中的密钥对事件文件进行加密。 关键操作通知:支持在发生特定操作时使用消息通知服务(Simple Message Notification,简称SMN)向用户手机、邮箱发送消息。 云审计服务记录的操作有以下三种: 用户登录管理控制台的操作。 用户通过云服务支持的API执行的操作。 系统内各服务内部触发的操作。
  • 约束与限制 云审计服务中的追踪器数量和关键操作通知有限定的配额,均不支持修改,云审计服务的具体限制如下。 表1 CTS约束与限制 限制项 使用限制 一个华为云账号允许创建的追踪器数目 管理追踪器:1个 数据追踪器:100个 一个华为云账号允许配置的关键操作通知数目 100个 一个追踪器允许配置的OBS桶数目 1个 用户操作后多久才能通过控制台查询数据 管理类事件:1分钟 数据类事件:5分钟 组织成员退出组织或被移除组织后,组织追踪器的收回时间 5分钟 用户通过云审计控制台能查询多久的操作事件 云审计默认为每个华为云账号记录最近7天的操作事件,如果不配置转储,您将无法追溯7天以前的操作事件。 云审计控制台对用户的操作事件日志保留7天,过期自动删除,不支持人工删除。 如果您已经配置追踪器转储事件至OBS/LTS,则保存周期以您在OBS/LTS控制台的配置为准。配置追踪器转储至OBS/LTS的详情请参考配置追踪器。 7天 组织追踪器 CTS支持组织追踪器能力,依赖组织服务某些接口,涉及企业项目权限管理的用户如需升级此能力,需要单独配置IAM权限,否则原有仅对CTS:*授权的用户将无法使用组织服务的多账号关系管理能力。 全局级服务需要在中心region(北京四)的云审计控制台配置追踪器和关键操作通知,才能使用审计事件上报至CTS功能、审计事件转储至OBS/LTS功能、关键操作消息通知功能。 全局级服务在其他region的云审计控制台配置时,上述功能不会生效。 目前全局级服务包括:IAM、TMS、CDN、DNS、EPS、 SMS 、SES、SC、cloudsite、CBC、CC、AAD、APIExplorer、DevStarServer、PCA、PSDM、IoTDP、APIErrorCenterService、BSG、ROMAIOC、 RMS 、IEC、Compass、ExpertCMSService、 CS R、ARS、BSS、ExpertCMS、Domains、OSC、Trademark、UCS、IES、CMDB、OSM、SupportPlan、CNAD、GA、TestMind、 RAM 、Organizations、HMSA、PrivateNumber、VoiceCall、RPM、ICA、EC、OA、marketplacebtm、FunctionFlow、HChatEngineService、HSearchEngineService、 APM 、MgC、CMN、IdentityCenter、Marketplace、ESM、edgesec、pEDACloud、koopage、OLCS、COST、BILLING、ENTERPRISE、VIAS、CORS、ModernBI、ORGID-MGR、Config、COC、GlobalSIMLink、APIhub、KooPhone、VSS、ACCOUNT、CodeArtsLink、AppStage、H CSS
  • 事件文件完整性校验 在安全和事故调查中,通常由于事件文件被删除或者被私下篡改,而导致操作记录的真实性受到影响,无法对调查提供有效真实的依据。因此云审计服务适时推出了事件文件完整性校验功能,旨在帮助您确保事件文件的真实性。 事件文件完整性校验功能使用业界标准算法构建,对事件文件生成原始哈希值,当事件文件被修改或者删除时,该哈希值就会发生改变,通过对哈希值进行追踪查看就能确定事件文件是否被修改;同时采用RSA算法对摘要文件进行签名,保证摘要文件不被修改。这样任何对事件文件进行修改或者删除的蛛丝马迹都会被云审计服务完整记录下来。 启用事件文件完整性校验功能后,云审计服务会在每个小时将上一个小时内所有事件文件的哈希值生成一个摘要文件,并将该摘要文件同步存储至当前追踪器配置的OBS桶中。 云审计使用公有和私有密钥对每个摘要文件进行签名,摘要文件转储到OBS桶后,您可以使用公有密钥校验摘要文件。
  • 工作原理 云审计服务直接对接华为云平台上的其他服务,记录用户的云服务资源的操作信息,实现用户操作云服务资源动作和结果的实时记录功能。 使用云审计服务创建追踪器可以跟踪记录事件文件。如已配置事件转储至OBS服务和LTS服务,事件文件将保存在OBS桶和LTS日志组中。 用户可以对事件文件执行以下两种操作: 事件文件的创建和保存: 当用户在弹性云服务器、云硬盘服务、 镜像服务 等其它与云审计服务完成对接的服务中,进行了增加、删除、修改类型的操作时,被操作的服务会自动记录操作动作及操作结果,并按照指定的格式发送事件到云审计服务完成事件归档。 云审计服务管理控制台会保存最近7天的操作记录,如已配置OBS服务或LTS服务,云审计服务会定期将操作记录同步保存到用户定义的OBS桶或LTS日志组中进行长期保存。 云审计控制台对用户的操作事件日志保留7天,过期自动删除,不支持人工删除。 事件文件查询: 在“事件列表”页面,用户可以按照通过系统自带的条件和时间过滤功能,查询最近7天的操作记录。 若要查询7天前的操作记录且已配置OBS服务或LTS服务,可以在对应的OBS桶中下载事件文件进行查看,或在对应的LTS日志组中查看日志。 在云审计服务页面的追踪器界面,用户可以对追踪器进行启用、停用、删除、配置等操作。 以用户创建镜像为例,在用户使用镜像服务执行创建镜像的操作过程中,镜像服务会将用户操作事件上报至云审计服务,如已配置OBS服务,云审计服务将事件转存至OBS桶中。用户也可以通过云审计服务的事件列表查看事件文件。云审计服务工作原理示意如图1所示。 图1 云审计服务工作原理示意图
  • 细粒度权限说明 使用自定义细粒度策略,请使用管理员用户进入 统一身份认证 (IAM)服务,按需选择CTS的细粒度权限进行授权操作。CTS细粒度权限说明请参见表3。 表3 CTS细粒度权限说明 权限名称 权限描述 权限依赖 应用场景 cts:quota:get 查询租户追踪器配额信息 - 查询租户追踪器配额信息 cts:trace:list 查询审计事件 - 查出系统记录的7天内资源操作记录 cts:trace:listResource - cts:trace:listTraceUser - cts:notification:create 创建关键操作通知 smn:topic:listTopic iam:agencies:listAgencies iam:agencies:createAgency iam:permissions:grantRoleToAgencyOnProject iam:permissions:listRolesForAgencyOnProject iam:projects:listProjects iam:groups:listGroups iam:users:listUsers iam:users:listUsersForGroup 创建关键操作通知 cts:notification:update 修改关键操作通知 修改关键操作通知 cts:notification:delete 删除关键操作通知 - 删除关键操作通知 cts:notification:list 查询所有关键操作通知 - 查询所有关键操作通知 cts:tracker:delete 删除追踪器 - 删除已创建的追踪器 cts:tracker:update 更新追踪器 iam:agencies:listAgencies iam:agencies:createAgency iam:permissions:grantRoleToAgencyOnProject iam:permissions:listRolesForAgencyOnProject iam:projects:listProjects iam:groups:listGroups iam:users:listUsersForGroup lts:topics:list lts:topics:create lts:topics:get lts:logstreams:list lts:groups:get lts:groups:list lts:groups:create obs:bucket:CreateBucket obs:bucket:HeadBucket obs:bucket:GetLifecycleConfiguration obs:bucket:PutLifecycleConfiguration obs:bucket:GetBucketAcl obs:bucket:PutBucketAcl obs:bucket:ListAllMyBuckets kms:cmk:list kms:cmk:get eps:enterpriseProjects:list organizations:trustedServices:list organizations:organizations:get organizations:deletgatedAdministrators:list organizations:accounts:list organizations:deletgatedServices:list 修改已创建追踪器的配置项 cts:tracker:create 创建追踪器 创建一个追踪器用来关联系统记录的所有操作 cts:tracker:list 查询所有追踪器 obs:bucket:GetBucketAcl obs:bucket:ListAllMyBuckets 查看追踪器的详细信息 cts:tag:create 批量添加资源标签 - 批量添加资源标签 cts:tag:delete 批量删除资源标签 - 批量删除资源标签
  • CTS权限 默认情况下,新建的IAM用户没有任何权限,您需要将其加入用户组,并给用户组授予策略或角色,才能使得用户组中的用户获得对应的权限,这一过程称为授权。授权后,用户就可以基于被授予的权限对云服务进行操作。 CTS部署时通过物理区域划分,为项目级服务。授权时,“作用范围”需要选择“区域级项目”,然后在指定区域(如华北-北京4)对应的项目(cn-north-4)中设置相关权限,并且该权限仅对此项目生效;如果在“所有项目”中设置权限,则该权限在所有区域项目中都生效。访问CTS时,需要先切换至授权区域。 权限根据授权精细程度分为角色和策略,策略是角色的升级版。 角色:IAM最初提供的一种根据用户的工作职能定义权限的粗粒度授权机制。该机制以服务为粒度,提供有限的服务相关角色用于授权。由于华为云各服务之间存在业务依赖关系,因此给用户授予角色时,可能需要一并授予依赖的其他角色,才能正确完成业务。角色并不能满足用户对精细化授权的要求,无法完全达到企业对权限最小化的安全管控要求。 策略:IAM最新提供的一种细粒度授权的能力,可以精确到具体服务的操作、资源以及请求条件等。基于策略的授权是一种更加灵活的授权方式,能够满足企业对权限最小化的安全管控要求。例如:针对ECS服务,CTS管理员能够控制IAM用户仅能对某一类云服务器资源进行指定的管理操作。多数细粒度策略以API接口为粒度进行权限拆分。 如表1所示,包括了CTS的所有系统权限。 表1 CTS系统权限 系统角色/策略名称 描述 类别 依赖关系 CTS FullAccess 云审计服务的所有权限。 系统策略 无 CTS ReadOnlyAccess 云审计服务的只读权限。 系统策略 无 CTS Administrator 云审计服务的管理员权限,拥有CTS的所有权限。 拥有该权限的用户拥有除IAM外,其他所有服务的只读权限。 系统角色 该角色有依赖,需要在同项目中勾选依赖的角色:Tenant Guest、OBS Administrator和Security Administrator。 表2列出了CTS常用操作与系统权限的授权关系,您可以参照该表选择合适的系统权限。 表2 常用操作与系统权限的关系 操作 CTS FullAccess CTS ReadOnlyAccess CTS Administrator 查询事件列表 √ √ √ 查询配额 √ √ √ 创建追踪器 √ × √ 修改追踪器 √ × √ 停用追踪器 √ × √ 启用追踪器 √ × √ 查询追踪器 √ √ √ 删除追踪器 √ × √ 创建关键操作通知 √ × √ 修改关键操作通知 √ × √ 停用关键操作通知 √ × √ 启用关键操作通知 √ × √ 查询关键操作通知 √ √ √ 删除关键操作通知 √ × √ 批量添加标签 √ × √ 批量删除标签 √ × √
  • 操作流程 本文档将按照以下步骤介绍HE2E DevOps实践的操作流程。 图1 HE2E DevOps实践操作流程图 表1 HE2E DevOps实践操作流程说明 步骤 说明 实践准备 完成实践开始前的准备工作,包括创建项目、添加项目成员等操作。 管理项目规划 完成项目的整体规划,包括项目需求规划、迭代需求规划等。 管理项目配置 根据项目需求,对工作项变更的通知方式、工作项状态的流转方式等进行自定义设置。 开发代码 通过分支来进行代码的编写,包括创建分支、代码提交、合并分支等操作。 检查代码 对代码进行静态扫描,根据修复建议优化代码,提高代码质量。 构建应用 构建环境镜像、将代码编译打包成软件包。 部署应用 将构建好的环境镜像及软件包安装并运行在环境中,本文档提供两种环境的部署方法:CCE与ECS。 管理项目测试 为迭代创建测试计划、设计测试用例,并按照计划执行测试用例。 配置流水线 将代码检查、构建、部署等任务串联成流水线。当代码有更新时,可自动触发流水线,实现持续交付。 释放资源 实践完成,释放CodeArts、CCE等资源。 父主题: 使用CodeArts管理电子商城项目开发流程
  • 问题现象 构建失败,报错信息为“制作Docker镜像失败”,报错日志例如: too many requests: toomanyrequests: You have reached your pull rate limit. You may increase the limit by authenticating and upgrading: https://www.docker.com/increase-rate-limit request canceled while wating for connection Get https://registry-1.docker.io/v2/: net/http: request canceled while wating for connection (Client.Timeout exceeded while awating headers)
  • 预置流水线简介 示例项目中预置以下5个流水线任务,可根据需要查看并使用。 表1 预置流水线任务 预置流水线任务 任务说明 phoenix-workflow 基本的流水线任务。 phoenix-workflow-test 测试环境对应的流水线任务。 phoenix-workflow-work Worker功能对应的流水线任务。 phoenix-workflow-result Result功能对应的流水线任务。 phoenix-workflow-vote Vote功能对应的流水线任务。
  • 配置准出条件 为了控制代码的质量,代码必须经过扫描,并且错误数量控制在合理范围内,才允许发布。通过添加质量门禁可以有效地自动化控制流程。 在流水线任务“phoenix-workflow”详情页,单击“编辑”。 在阶段“代码检查”中,单击“准出条件”。 在“准出条件”窗口中,单击“标准策略准出条件”插件后的“添加”。 选择“系统策略”,单击“确定”。 单击“保存并执行”,启动流水线任务。 如果代码检查问题数未达到准出条件,流水线任务将执行失败。
  • 背景信息 CodeArts结合多年研发经验与业界先进的实践提出了一套可操作可落地的敏捷开发方法论:HE2E DevOps实施框架。 图1 HE2E DevOps实施框架 规划和设计 步骤①和②是业务(或者是客户)与技术之间进行产品规划,梳理产品整体脉络,以及进行产品规划实施设计,并控制需求粒度与拆分的过程。 软件开发的本质是为了解决问题,提供用户价值的,而不仅是为了提供功能。影响地图就是用来鉴别用户需求是什么,深层的根因是什么。 用户故事就是目标和需求的载体,以用户的场景来讲故事,便于在客户、业务与开发之间进行信息的传递。在这个过程中,独立的需求条目的堆积,很容易导致只能看到各个需求条目,不能从整个解决方案思考需求。用户故事以用户使用的场景为主线,将大的阶段点,及其细分的活动,以树状的结构进行梳理和展现,既可以看到独立的需求条目,又能够看到整体需求场景。 计划和跟踪、迭代开发 步骤③~⑩是Scrum框架过程,是主要的管理实践。 Scrum定义了一个相对完整的敏捷过程管理的框架。在CodeArts中,将Scrum的框架与团队日常的开发活动,很好的融合起来。主要的过程产物包括产品故事列表、迭代故事列表、潜在可交付的产品增量、以及过程中产生的问题列表;核心的团队活动包括Sprint计划会议、团队每日站会、Sprint演示会议、Sprint回顾会议等会议、以及团队的日常更新。 同时,将Kanban方法与Scrum框架进行了结合,团队借鉴Kanban方法中的精益思想,可视化价值流,发现并解决阻塞与瓶颈,加速价值流交付,并加快反馈回路,持续进行改进。 持续交付 从步骤⑪开始,进入到工程实践,也就是通常说的CI/CD过程。 持续交付以代码配置管理为基础,除了传统意义的代码资产安全与管控、多人并行开发、版本与基线管理外,也体现了团队的协作与沟通。 代码检查(即静态扫描)、自动化的构建、各阶段的自动化测试、以及相应的自动化部署过程,都被有机的串联在流水线上。 除了代码检查、构建、测试、部署等动态的阶段与活动,还有制品管理,以及各级的环境管理,包括开发环境、测试环境、准生产环境,以及生产环境。 持续交付流水线就是将整个持续交付中,都有哪些阶段,分别运行在什么环境,每个阶段执行什么活动,准入与准出的质量门禁,以及每个阶段的输入与输出的制品进行管理。
  • 方案架构 “凤凰商城”示例程序架构 “凤凰商城”示例程序的架构图如图2所示。 图2 凤凰商城技术架构图 示例程序由表1中的5个可以独立开发、测试和部署的微服务组件构成。 表1 凤凰商城微服务组件表 微服务组件 说明 Web用户端服务器(对应样例代码中的“Vote”功能) 业务逻辑:用户可以通过浏览器访问此服务的WebUI。当用户在特定商品上单击“Like”时,服务将用户所选择物品的记录保存在Redis缓存中。 技术栈:Python、Flask框架。 应用服务器:Gunicorn。 Web管理端服务器(对应样例代码中的“Result”功能) 业务逻辑:用户可以通过浏览器访问此服务的WebUI,会动态显示用户端UI上用户单击“Like”的统计数据,此数据来自PostgreSQL数据库。 技术栈:Node.js、express框架。 应用服务器:server.js。 后台订单批处理程序(对应样例代码中的“Worker”功能) 业务逻辑:此服务为后台进程,会监控Redis缓存中物品记录,并将新纪录取出并保存在PostgreSQL数据库中,以便管理端UI可以抽取数据进行统计显示。 技术栈:.net core或者Java(此服务提供两种技术栈实现了同样的功能,可根据需要修改配置选择其中一个作为运行时进程)。 订单缓存 业务逻辑:此服务作为用户端UI服务的数据持久化服务存在。 技术栈:Redis。 订单数据库 业务逻辑:此服务作为管理端UI服务的数据源。 技术栈:PostgreSQL。 “DevOps全流程样例项目”构成 “DevOps全流程样例项目”是一个Scrum类型的模板项目,项目中预置了部分服务的使用模板。项目实践过程中涉及到的产品及服务如下表。 表2 实践涉及产品/服务列表 服务 说明 软件开发生产线 需求管理 预置3个已规划并已完成的迭代、项目的模块设置、以及若干统计报表。 代码托管 预置代码仓库“phoenix-sample”,存放项目示例代码。 代码检查 预置4个任务,任务详情介绍请参见步骤四:检查代码。 编译构建 预置5个任务,任务详情介绍请参见步骤五:构建应用并推送镜像至SWR。 制品仓库 用于存储通过构建任务生成的软件包。 部署 预置3个应用,应用详情介绍请参见步骤六:部署应用至CCE。 测试计划 功能测试用例库,预置十余个测试用例。 流水线 预置5条流水线,流水线详情介绍请参见步骤八:配置流水线,实现持续交付。 其它组件和服务 统一身份认证服务 用于管理账号。 容器镜像服务 用于存放构建任务生成的Docker镜像。 云容器引擎 用于软件包部署,与ECS部署属于两种不同的部署方式。 弹性云服务器 用于软件包部署,与CCE部署属于两种不同的部署方式。
共100000条
提示

您即将访问非华为云网站,请注意账号财产安全