云服务器内容精选

  • 问题定位方法(Java SDK) 开发过程中,您有任何问题可以在github上提交issue,或者在华为云 对象存储服务 论坛中发帖求助。 使用OBS Java SDK对接OBS服务可能会遇到许多问题,您可以通过下面介绍的步骤进行问题分析和定位: 确保使用的是OBS Java SDK的最新版本, 您可以从这里下载最新版本; 确保开启了OBS Java SDK日志功能,开启方式参见 日志分析 章节,通常建议的日志级别为WARN; 确保使用OBS Java SDK的程序代码遵照OBS客户端通用示例编写,所有ObsClient的接口调用都进行了异常处理,例如上传对象的示例如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ObsClient obsClient = null; try { String endPoint = "https://your-endpoint"; // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量AC CES S_KEY_ID和SECRET_ACCESS_KEY_ID。 // 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html String ak = System.getenv("ACCESS_KEY_ID"); String sk = System.getenv("SECRET_ACCESS_KEY_ID"); obsClient = new ObsClient(ak, sk, endPoint); HeaderResponse response = obsClient.putObject("bucketname", "objectname", new ByteArrayInputStream("Hello OBS".getBytes())); // 可选:调用成功后,记录调用成功的HTTP状态码和服务端请求ID System.out.println(response.getStatusCode()); System.out.println(response.getRequestId()); } catch (ObsException e) { // 推荐:发生异常后,记录失败的HTTP状态码、服务端错误码、服务端请求ID等 System.out.println("HTTP Code: " + e.getResponseCode()); System.out.println("Error Code:" + e.getErrorCode()); System.out.println("Request ID:" + e.getErrorRequestId()); // 推荐:发生异常后,记录异常堆栈信息 e.printStackTrace(System.out); } 您可以从这里查看关于ObsException的详细说明。 当调用ObsClient的接口发生异常时,从ObsException异常或日志文件中获取HTTP状态码、OBS服务端错误码后进行对照,排查异常原因; 如果通过步骤4未能排查到异常原因,可从ObsException异常或日志文件中获取OBS服务端请求ID后联系OBS服务端运维团队定位异常原因; 如果从ObsException异常或日志文件中无法获取OBS服务端请求ID,请收集ObsException的异常堆栈信息并联系OBS客户端运维团队定位异常原因。 父主题: 问题定位(Java SDK)
  • 跨域请求被拦截 Access to XMLHttpRequest at 'xxx' from origin 'xxx' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
  • 请求成功但返回结果缺少某些字段 此类错误一般有两种原因: 在桶的CORS配置中ExposeHeader配置不完整,例如未配置ETag(导致上传对象成功后无法获取ETag值)、未配置x-obs-request-id(导致请求完成后无法获取OBS服务端请求ID)等,解决方法:请参考配置桶的CORS章节重新配置桶的CORS; 使用了旧版本的SDK,解决方法:升级到最新版本的SDK,可以从这里下载最新版本。
  • 无法获取上传后的ETag值 使用ObsClient.putObject和ObsClient.uploadPart上传文件成功后返回结果中无ETag值,此类错误一般有两种原因: 桶的CORS配置中ExposeHeader不包含ETag头域,解决方法:按照文档配置桶的CORS为桶配置完整的CORS配置; 桶的CORS配置中ExposeHeader包含ETag头域,但浏览器的返回结果屏蔽了ETag头域(一般发生在低版本的浏览器),解决方法:升级到高版本且完全支持HTML5的浏览器。
  • 返回码 通过进程等方式调用obsutil时,无法实时查看回显信息。obsutil支持在进程运行结束后,根据不同的运行结果生成不同的返回码,具体的返回码及其含义如表1所示。您可以通过以下方式获取最近一次运行结果的返回码,然后根据返回码分析并处理问题。 macOS/Linux操作系统,执行以下命令获取最近一次运行结果的返回码: echo $? Windows操作系统,执行以下命令获取最近一次运行结果的返回码: echo %errorlevel% 表1 返回码 返回码 含义 常见场景举例 0 执行成功 上传对象成功。 1 文件不存在 执行cp上传文件,输入的文件路径不存在。 2 任务不存在 执行cp恢复失败的上传任务,指定的Task Id不存在。 3 参数错误 执行cp上传文件,输入不支持的附加选项; 执行cp下载文件,输入的cloud_url不合法。 说明: cloud_url为桶路径或对象路径,当下载桶中的所有对象时,cloud_url的格式必须为obs://bucketname;当下载指定对象时,cloud_url的格式必须为obs://bucketname/key。 4 检查桶状态错误 执行cp上传文件夹,待上传的桶不存在。 5 命令初始化错误 加载配置文件出错; 执行cp上传文件夹,并指定了-o参数,但无法成功创建保存结果清单文件的文件夹。 6 执行错误 执行ls查询桶列表,因为网络超时而失败。 7 操作不支持 执行chattri修改对象属性,但桶不是3.0版本的桶。 8 批量任务执行不完全成功 执行cp批量下载对象,部分对象下载失败。 9 中断错误 执行命令过程中用户手动Ctrl+C中断任务执行。 -1 其他未知错误 - 父主题: 问题定位
  • 认证不通过 认证不通过的请求会被API网关拒绝,得到类似如下的返回,返回以APIGW开头的错误码。 比如使用Token认证请求没有带Token,返回如下。 { "error_msg": "Incorrect IAM authentication information: x-auth-token not found", "error_code": "APIGW.0301", "request_id": "7775eaa6b4bbe5934e565349bd27c298"} 使用了错误的Token,返回如下。 { "error_msg": "Incorrect IAM authentication information: decrypt token fail", "error_code": "APIGW.0301", "request_id": "0e812a89eee650de8e1f55cdae28b2c9"} 使用了错误的AK,会返回如下错误。 Traceback (most recent call last): File "/home/user/.local/lib/python3.7/site-packages/huaweicloudsdkcore/http/http_client.py", line 119, in response_hook resp.raise_for_status() File "/home/user/.local/lib/python3.7/site-packages/requests/models.py", line 953, in raise_for_status raise HTTPError(http_error_msg, response=self)requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://iam.myhuaweicloud.com/v3/projects?name=cn-north-4During handling of the above exception, another exception occurred:Traceback (most recent call last): File "/home/user/.local/lib/python3.7/site-packages/huaweicloudsdkcore/auth/credentials.py", line 93, in process_auth_params self.project_id = keystone_list_projects(http_client, request) File "/home/user/.local/lib/python3.7/site-packages/huaweicloudsdkcore/auth/iam_service.py", line 49, in keystone_list_projects raise e File "/home/user/.local/lib/python3.7/site-packages/huaweicloudsdkcore/auth/iam_service.py", line 47, in keystone_list_projects http_response = http_client.do_request_sync(request) File "/home/user/.local/lib/python3.7/site-packages/huaweicloudsdkcore/http/http_client.py", line 93, in do_request_sync self.response_error_hook_factory()(response) File "/home/user/.local/lib/python3.7/site-packages/huaweicloudsdkcore/http/http_client.py", line 130, in response_hook raise exceptions.ClientRequestException(response_status_code, sdk_error)huaweicloudsdkcore.exceptions.exceptions.ClientRequestException: ClientRequestException - {status_code:401,request_id:3f979354fbec41b3cc0bd28ce7865e20,error_code:APIGW.0301,error_msg:Incorrect IAM authentication information: ak xxxxxx not exist } 使用了错误的SK,返回如下。 huaweicloudsdkcore.exceptions.exceptions.ApiValueError: Failed to get project id, Incorrect IAM authentication information: verify aksk signature fail, canonicalRequest:GET|/v3/projects/|name=cn-north-4|host:iam.myhuaweicloud.com|x-sdk-date:20210902T011700Z||host;x-sdk-date|e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
  • Token的权限范围问题 在使用Token认证时,需要先申请Token,申请Token时需要填写Token是全局级别的还是项目级别的,如下申请Token接口的请求Body体中scope所示。 { "auth": { "identity": { "methods": [ "password" ], "password": { "user": { "name": "username", "password": "********", "domain": { "name": "domainname" } } } }, "scope": { "project": { "name": "xxxxxxxx" } } }} 区域级服务需要获取项目级别的Token(区域默认对应一个项目,这个项目由系统预置),此时请求body中auth.scope的取值为project。 全局级服务需要获取全局级别的Token,此时请求body中auth.scope的取值为domain。 对于区域级服务,如果获取全局级别的Token,虽能使用该Token通过认证,但无法在后端通过鉴权,会导致请求失败。 例如获取一个全局Token,如下所示。 { "auth": { "identity": { "methods": [ "password" ], "password": { "user": { "domain": { "name": "domainname" }, "name": "username", "password": "********" } } }, "scope": { "domain": { "id": "0503dda878000fed0f75c0096d70a960" } } }} 然后调用E CS 服务的查询ECS服务器列表的API,则会得到如下响应。表示Token与URL中项目不匹配,返回错误。 { "error": { "message": "tenantId in token is not the same with in URL.", "code": "Common.0018" }} 此种情况下,如果调用全局级服务的API,如TMS的API,则会正确调用。
  • Token与project不匹配 在使用Token认证时,经常会出现申请了Token,但是申请Token时的权限范围是区域A,但是请求时却请求调用区域B的资源,这是往往会得到类似如下的返回。表示Token与请求不匹配。 { "error": { "message": "tenantId in token is not the same with in URL.", "code": "Common.0018" }} 解决该问题的方法通常有两种: 使用正确权限范围的Token做请求认证,例如要请求区域B的资源,申请Token时填写 使用AK/SK认证鉴权。
  • 认证鉴权示例 下面通过举例为您介绍调用API的认证鉴权的关系。 调用API需要认证,如果没有认证,调用会遭到API网关的拒绝。会得到如下回显。 { "error_msg": "Incorrect IAM authentication information: x-auth-token not found", "error_code": "APIGW.0301", "request_id": "7775eaa6b4bbe5934e565349bd27c298"} 此处会返回APIGW.0301的错误码,错误信息意思是缺少x-auth-token,这是API网关返回的内容,表示认证不通过,不能访问。 假设新创建一个IAM用户,未加入任何用户组,这时这个IAM用户没有任何创建华为云资源的权限,如果此时先获取token,然后调用API,可以通过API网关的认证,但是后端云服务会鉴权说没有权限。 例如调用ECS服务的查询ECS服务器列表的API。 GET https://ecs.cn-north-4.myhuaweicloud.com/v1/05041fffa40025702f6dc009cc6f8f33/cloudservers/detail 会得到如下响应,这次返回的不是APIGW的错误码,而是ECS的错误码,表示没有权限,禁止执行该操作。 { "error": { "message": "do not have the required roles, forbidden to perform this action.", "code": "Ecs.0110" }} 如果将上面的用户加入到一个用户组,并给这个用户组授予查询ECS服务器列表的权限。重新 获取Token (注意这里需要重新获取Token,否则Token还是上一次的授权权限),然后调用ECS服务的查询ECS服务器列表的API,则会得到如下响应。 这是正确 { "count": 8, "servers": [ { "fault": null, "id": "78ccc986-016f-4405-94f9-c4d58421eca7", "name": "cce-612884-06913", "addresses": { "377a7782-72e4-4db2-96b7-841d5d6f18a8": [ {...
  • 认证、鉴权和授权 认证:由APIG来做(通过Token或AK/SK),判断调用者的身份,是否是合法用户,是否能否访问华为云。 鉴权:由云服务实现,判断调用者是否具有操作某项资源的权限。 授权:在IAM中操作,对某个用户/角色授权,让这个角色具有某种权限。 华为云支持Token和AK/SK两种认证方式。 Token的有效期为24小时,需要使用一个Token鉴权时,可以先缓存起来,避免频繁调用。 AK/SK长期有效。AK/SK加密调用请求。 推荐使用AK/SK认证,其安全性比Token认证要高。且华为云SDK默认使用AK/SK,优先推荐使用SDK调用API,相对REST API,SDK使用更为便利。
  • 终端节点Endpoint 在调用API时,需要通过Endpoint确定访问哪个服务,如下图所示。 对于全局级服务,只有一个Endpoint,例如TMS的Endpoint为tms.myhuaweicloud.com 对于区域级服务,每个region的Endpoint都不同,例如ECS在北京四的Endpoint为ecs.cn-north-4.myhuaweicloud.com。 所有服务的Endpoint详细信息都可以在https://developer.huaweicloud.com/endpoint查询。