概述
概述
欢迎使用百度智能云产品,百度智能云容器镜像服务 CCR。CCR 目前已具备的产品功能包括:
- 命名空间的管理与主子用户授权,实现多用户的细粒度权限管理。
- 容器镜像的上传、下载、版本管理,支持 Docker Registry API,满足通用的镜像使用场景。
- 容器镜像的安全漏洞扫描,满足容器镜像的安全诉求。
- 容器镜像的多地域自动同步,上传和下载镜像时支持地域就近路由,满足边缘计算等场景下的分布式镜像拉取需求。
- 支持 Helm Charts 的管理,满足 Kubernetes 高阶用户的自定义应用模板需求。
您可以使用本文档介绍的 API 对 CCR 服务进行灵活操作。
接口概览
CCR API 提供以下接口类型:
| 接口类型 | 描述 |
|---|---|
| 用户接口 | 用户创建、临时密钥创建相关接口 |
| 命名空间接口 | 命名空间相关接口 |
| 镜像接口 | 镜像创建、删除、列表和扫描等相关接口 |
| Helm 接口 | 管理 Helm Chart 相关接口 |
| 镜像迁移接口 | 管理镜像迁移相关接口 |
产品限制
- 每个主账号包含其子账号最多能拥有 10 个命名空间。如需增加命名空间上限,请提交工单申请。
- 命名空间名称全局唯一,建议在命名中加入服务标识,以避免创建失败。
API 认证机制
所有 API 的安全认证均采用 Access Key 与请求签名机制。Access Key 由 Access Key ID 和 Secret Access Key 组成,均为字符串。对于每个 HTTP 请求,使用下面所描述的算法生成一个认证字符串,并将该字符串放在 Authorization 头域中。服务端根据生成算法验证认证字符串的正确性。
认证字符串格式如下:
bce-auth-v{version}/{accessKeyId}/{timestamp}/{expirationPeriodInSeconds}/{signedHeaders}/{signature}
version是正整数。timestamp是生成签名时的 UTC 时间。expirationPeriodInSeconds表示签名有效期。signedHeaders是签名算法中涉及到的头域列表。头域名之间用分号(;)分隔,如host;x-bce-date。列表按照字典序排列。本 API 签名仅使用host和x-bce-date两个 Header。signature是 256 位签名的十六进制表示,由 64 个小写字母组成。
当百度智能云接收到用户请求后,系统将使用相同的 SK 和相同的认证机制生成认证字符串,并与用户请求中包含的认证字符串进行比对。如果认证字符串相同,系统认为用户拥有指定的操作权限,并执行相关操作;如果认证字符串不同,系统将忽略该操作并返回错误码。
鉴权认证机制的详细内容请参见鉴权认证机制。
通信协议
支持 HTTP 和 HTTPS 两种调用方式。为了提升数据安全性,建议通过 HTTPS 调用。
请求结构说明
数据交换格式为 JSON,所有 Request Body 和 Response Body 内容均采用 UTF-8 编码。
请求参数包括如下 4 种:
| 参数类型 | 说明 |
|---|---|
| URI | 通常用于指明操作实体,如 POST /v{version}/instance/{instanceId} |
| Query 参数 | URL 中携带的请求参数,通常用于指明要对实体执行的动作 |
| Header | 通过 HTTP 头域传入,如 x-bce-date |
| RequestBody | 通过 JSON 格式组织的请求数据体 |
响应结构说明
响应值分为两种形式:
| 响应内容 | 说明 |
|---|---|
| HTTP STATUS CODE | 如 200、400、403、404 等 |
| ResponseBody | JSON 格式组织的响应数据体 |
API 版本号
| 参数 | 类型 | 参数位置 | 描述 | 是否必须 |
|---|---|---|---|---|
| version | String | URI 参数 | API 版本号,当前值为 1 |
必须 |
幂等性
当调用创建资源的接口时,如果遇到请求超时或服务器内部错误,用户可能会尝试重发请求,导致资源超量创建。这时用户可以通过 clientToken 参数避免创建出比预期更多的资源,即保证请求的幂等性。
幂等性基于 clientToken。clientToken 是一个长度不超过 64 位的 ASCII 字符串,通常放在 Query String 中,例如:
http://bcc.bj.baidubce.com/v1/instance?clientToken=be31b98c-5e41-4838-9830-9be700de5a20
如果用户使用同一个 clientToken 值调用创建接口,则服务端会返回相同的请求结果。因此用户在遇到错误进行重试时,可以通过提供相同的 clientToken 值,来确保只创建一个资源;如果用户提供了一个已经使用过的 clientToken,但其他请求参数(包括 Query String 和 Request Body)不同,甚至 URL Path 不同,则会返回 IdempotentParameterMismatch 错误码。
clientToken 的有效期为 24 小时,以服务端最后一次收到该 clientToken 为准。也就是说,如果客户端持续发送同一个 clientToken,那么该 clientToken 将长期有效。
日期与时间规范
日期与时间的表示有多种方式。为统一起见,除非有约定俗成的用法或相应规范,凡需要日期时间表示的地方一律采用 UTC 时间,遵循 ISO 8601,并做以下约束:
- 表示日期一律采用
YYYY-MM-DD方式,例如2014-06-01表示 2014 年 6 月 1 日。 - 表示时间一律采用
hh:mm:ss方式,并在最后加一个大写字母Z表示 UTC 时间。例如23:00:10Z表示 UTC 时间 23 点 0 分 10 秒。 - 凡涉及日期和时间合并表示时,在两者中间加大写字母
T,例如2014-06-01T23:00:10Z表示 UTC 时间 2014 年 6 月 1 日 23 点 0 分 10 秒。
规范化字符串
通常一个字符串中可以包含任何 Unicode 字符。在编程中,这种灵活性会带来不少困扰。因此引入“规范字符串”的概念。一个规范字符串只包含百分号编码字符以及 URI(Uniform Resource Identifier)非保留字符(Unreserved Characters)。RFC 3986 规定,URI 非保留字符包括以下字符:字母(A-Z、a-z)、数字(0-9)、连字号(-)、点号(.)、下划线(_)、波浪线(~)。
将任意一个字符串转换为规范字符串的方式如下:
- 将字符串转换成 UTF-8 编码的字节流。
- 保留所有 URI 非保留字符原样不变。
- 对其余字节做一次 RFC 3986 中规定的百分号编码(Percent-Encoding),即一个
%后面跟着两个表示该字节值的十六进制字母。字母一律采用大写形式。
示例:
原字符串:this is an example for 测试
对应的规范字符串:this%20is%20an%20example%20for%20%E6%B5%8B%E8%AF%95
服务域名
| 区域 | 服务端点 Endpoint | 协议 |
|---|---|---|
| 北京 | ccr.baidubce.com |
HTTP、HTTPS |
公共请求头与公共响应头
公共请求头
| 头域 | 说明 | 是否必须 |
|---|---|---|
| Authorization | 包含 Access Key 与请求签名。具体请参考 鉴权认证。 | 必须 |
| Content-Type | application/json; charset=utf-8 |
必须 |
| x-bce-date | 该请求创建的时间。表示日期一律采用 YYYY-MM-DD 方式,例如 2014-06-01 表示 2014 年 6 月 1 日。如果用户使用了标准的 Date 头域,该头域可以不填。当两者同时存在时,以 x-bce-date 为准。 |
必须 |
公共响应头
| 头域 | 说明 |
|---|---|
| Content-Type | application/json; charset=utf-8 |
| x-bce-request-id | 对应请求的 requestId |
错误码
错误码格式
当用户访问 API 出现错误时,会返回相应的错误码和错误信息,便于定位问题并做出适当处理。请求发生错误时,通过 Response Body 返回详细错误信息,格式如下:
| 参数名 | 类型 | 说明 |
|---|---|---|
| code | String | 表示具体错误类型。 |
| message | String | 有关该错误的详细说明。 |
| requestId | String | 导致该错误的 requestId。 |
例如:
1{
2 "code": "IllegalRequestUrl",
3 "message": "The requested url belongs to domain which is not under acceleration",
4 "requestId": "81d0b05f-5ad4-1f22-8068-d5c9de60a1d7"
5}
公共错误码
| 错误码 | 错误消息 | HTTP状态码 | 描述 |
|---|---|---|---|
| AccessDenied | Access denied. | 403 Forbidden | 无权限访问对应的资源。 |
| InappropriateJSON | The JSON you provided was well-formed and valid, but not appropriate for this operation. | 400 Bad Request | 请求中的JSON格式正确,但语义上不符合要求。如缺少某个必需项,或者值类型不匹配等。出于兼容性考虑,对于所有无法识别的项应直接忽略,不应该返回这个错误。 |
| InternalError | We encountered an internal error. Please try again. | 500 Internal Server Error | 所有未定义的其他错误。在有明确对应的其他类型错误时(包括通用错误和服务自定义错误),不应该使用。 |
| InvalidAccessKeyId | The Access Key ID you provided does not exist in our records. | 403 Forbidden | Access Key ID 不存在。 |
| InvalidHTTPAuthHeader | The HTTP authorization header is invalid. Consult the service documentation for details. | 400 Bad Request | Authorization 头域格式错误。 |
| InvalidHTTPRequest | There was an error in the body of your HTTP request. | 400 Bad Request | HTTP Body 格式错误,例如不符合指定的 Encoding 等。 |
| InvalidURI | Could not parse the specified URI. | 400 Bad Request | URI 形式不正确。例如一些服务定义的关键词不匹配等。对于 ID 不匹配等问题,应定义更加具体的错误码,例如 NoSuchKey。 |
| MalformedJSON | The JSON you provided was not well-formed. | 400 Bad Request | JSON 格式不合法。 |
| InvalidVersion | The API version specified was invalid. | 404 Not Found | URI 的版本号不合法。 |
| OptInRequired | A subscription for the service is required. | 403 Forbidden | 没有开通对应的服务。 |
| PreconditionFailed | The specified If-Match header doesn't match the ETag header. | 412 Precondition Failed | 详见 ETag。 |
| RequestExpired | Request has expired. Timestamp date is XXX. | 400 Bad Request | 请求超时。XXX 需替换为 x-bce-date 的值。如果请求中只有 Date,则需要将 Date 转换为 datetime。 |
| IdempotentParameterMismatch | The request uses the same client token as a previous, but non-identical request. | 403 Forbidden | clientToken 对应的 API 参数不一致。 |
| SignatureDoesNotMatch | The request signature we calculated does not match the signature you provided. Check your Secret Access Key and signing method. Consult the service documentation for details. | 400 Bad Request | Authorization 头域中附带的签名和服务端验证结果不一致。 |
评价此篇文章
