TencentBlueKing / blueking-apigateway

蓝鲸 API 网关(API Gateway),是一种高性能、高可用的 API 托管服务
Other
30 stars 20 forks source link

bk-apigateway FAQ #74

Open wklken opened 1 year ago

wklken commented 1 year ago

Description

[toc]

网关错误响应说明

499

无response body

504

{
  "code_name": "REQUEST_BACKEND_TIMEOUT",
  "data": null,
  "code": 1650401,
  "message": "Request backend service timeout [upstream_error=\"cannot read header from upstream\"]",
  "result": false
}

后台错误响应说明

调用方式

认证

概念

认证 Header 头

X-Bkapi-Authorization: {}

示例:

# 调用目标 API 开启: 应用认证+用户认证
X-Bkapi-Authorization: {"bk_app_code": "x", "bk_app_secret": "y", "bk_token": "z"}

# 调用目标 API 开启: 应用认证
X-Bkapi-Authorization: {"bk_app_code": "x", "bk_app_secret": "y"}

# 调用目标 API 开启: 用户认证
X-Bkapi-Authorization: {"bk_token": "z"}

# 使用access_token
X-Bkapi-Authorization: {"access_token": "z"}

curl 请求示例:

curl 'http://bkapi.example.com/prod/users/'
    -H 'X-Bkapi-Authorization: {"bk_app_code": "x", "bk_app_secret": "y", "bk_token": "z"}'

认证报错信息

message: app code cannot be empty

status: 400

{
  "code": 1640001,
  "data": null,
  "code_name": "INVALID_ARGS",
  "message": "Parameters error [reason=\"app code cannot be empty\"]",
  "result": false
}

message: please provide bk_app_secret or bk_signature to verify app

status: 400

{
  "code": 1640001,
  "data": null,
  "code_name": "INVALID_ARGS",
  "message": "Parameters error [reason=\"please provide bk_app_secret or bk_signature to verify app\"]",
  "result": false
}

message: bk_app_code or bk_app_secret is incorrect

status: 400

{
  "code": 1640001,
  "data": null,
  "code_name": "INVALID_ARGS",
  "message": "Parameters error [reason=\"bk_app_code or bk_app_secret is incorrect\"]",
  "result": false
}

message: user authentication failed, please provide a valid user identity, such as bk_username, bk_token, access_token

status: 400

{
  "code": 1640001,
  "data": null,
  "code_name": "INVALID_ARGS",
  "message": "Parameters error [reason=\"user authentication failed, please provide a valid user identity, such as bk_username, bk_token, access_token\"]",
  "result": false
}

message: user authentication failed, the user indicated by bk_username is not verified

status: 400

{
    "code":1640001,
    "data":null,
    "code_name":"INVALID_ARGS",
    "message":"Parameters error [reason=\"user authentication failed, the user indicated by bk_username is not verified\"]",
    "result":false
}

message: App has no permission to the resource

status: 403

{
  "code": 1640301,
  "data": null,
  "code_name": "APP_NO_PERMISSION",
  "message": "App has no permission to the resource",
  "result": false
}

权限

wklken commented 11 months ago

pending

APIGW网关地址拼接

容器化及二进制部署中, 会渲染环境变量BK_API_URL_TMPL (SaaS app 由paas平台部署时渲染, 非 SaaS 由运维部署脚本负责渲染)

BK_API_URL_TMPL=http://bkapi.xxxxx.com/api/{api_name}

使用示例:

# 访问 bk-iam
bk_iam_url_prefix = BK_API_URL_TMPL.render(api_name="bk-iam")

# 访问 bk-iam prod
policy_query_url = bk_iam_url_prefix + "/prod" + "/api/v1/policy/query"
alex-smile commented 11 months ago

使用 apigw-manager<=1.1.7 同步网关资源到 API 网关时,报错:版本 xxx 已存在

错误消息样例如下:

File "/usr/local/lib/python3.6/site-packages/apigw_manager/apigw/management/commands/create_version_and_release_apigw.py", line 86, in create_resource_version
...
apigw_manager.core.exceptions.ApiRequestError: status_code: 400, code: 40002, 校验失败: 版本 1.0.2 已存在。

错误原因: 发布版本后,回退到一个低版本号版本,然后,再次发布版本,此时,因版本号检查逻辑存在问题,导致出现错误。例如发布版本 1.0.2 后,将版本回退到 1.0.1,网关会创建一个新版本 1.0.1+20230720205646,此时,再发布新版本 1.0.2 时,则可能出现上面的错误。

查看资源版本地址:http://apigw.\_\_bk_domain\_\_/{gateway_id}/version

解决方案: 方案一:手动生成一个资源版本,版本号设置为:新版本号 + 一个时间字符串,例如:1.0.2+20230820205646 方案二:升级 apigw-manager >= 2.0.0

方案一可用于临时修复问题,建议按方案二升级 SDK 版本。

alex-smile commented 10 months ago

[apigw-manager] 调用 bk-apigateway 网关的 API,出现 ”应用无操作网关权限“错误

错误示例:

{"result": false, "code": "40403", "message": "应用无操作网关权限", "data": null}

错误原因: 应用调用网关 bk-apigateway 的接口,去操作网关数据时,该应用需要有操作该网关数据的权限(而非调用 bk-apigateway 网关 API 的权限)。比如,应用 app1 操作网关 bk-demo 时,app1 应该有操作网关 bk-demo 数据的权限,以防止误修改其他网关的数据。

导致该错误的原因

修复方案:

wklken commented 7 months ago

部署配置

apisix 同步 etcd, 如果 etcd 发生了 compact, 此时apisix watch 的revision 小于 etcd compact revision, apisix watch 到事件变更会直接触发全量同步, 具体机制参考文档

带来的问题:

解决方案: 默认etcd的配置 --auto-compaction-mode=periodic --auto-compaction-retention=5m, 如果apisix实例很多, 无论怎么配置, apisix 全量同步的概率还是很大;

建议将配置改成 --auto-compaction-mode=revision --auto-compaction-retention=1000, 默认会保留 1000 个有效的revision

注意, 如果网关的路由过多, 发布短时间内可能产生超过 1000 次更新, 也可能会导致有问题, 此时需要调整阈值