简介
欢迎使用京东云开发者Python工具套件(Python SDK)。使用京东云Python SDK,您无需复杂编程就可以访问京东云提供的各种服务。
为了方便您理解SDK中的一些概念和参数的含义,使用SDK前建议您先查看OpenAPI使用入门。要了解每个API的具体参数和含义,请参考程序注释或参考OpenAPI&SDK下具体产品线的API文档。
环境准备
京东云Python SDK适用于Python 2.7.* 和 3.* 版本。
在开始调用京东云Open API之前,需提前在京东云用户中心账户管理下的AccessKey管理页面申请accesskey和secretKey密钥对(简称AK/SK)。AK/SK信息请妥善保管,如果遗失可能会造成非法用户使用此信息操作您在云上的资源,给你造成数据和财产损失。
SDK使用方法
建议使用pip安装京东云Python SDK,如下所示:
pip install -U jdcloud_sdk
您还可以下载SDK源代码自行使用。
使用源码安装您可以如下方式执行:
python setup.py install
SDK使用中的任何问题,欢迎您在SDK使用问题反馈页面交流。
注意:京东云并没有提供其他下载方式,请务必使用上述官方下载方式!
调用SDK
Python SDK的调用主要分为4步:
设置accessKey和secretKey
创建Client(每支云产品都有自己的Client,当调用该产品API时,需使用该产品的Client。例如:使用云主机的
VmClient
只能调用云主机(Vm)的接口;使用高可用组的AgClient
只能调用高可用组(Ag)的接口。)设置请求参数
执行请求得到响应
以下是查询云主机实例类型的调用示例
# coding=utf-8
from jdcloud_sdk.core.credential import Credential
from jdcloud_sdk.services.vm.client.VmClient import VmClient
from jdcloud_sdk.services.vm.apis.DescribeInstanceTypesRequest \
import DescribeInstanceTypesParameters, DescribeInstanceTypesRequest
access_key = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
secret_key = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
credential = Credential(access_key, secret_key)
client = VmClient(credential)
try:
parameters = DescribeInstanceTypesParameters('cn-north-1')
request = DescribeInstanceTypesRequest(parameters)
resp = client.send(request)
if resp.error is not None:
print(resp.error.code, resp.error.message)
print(resp.result)
except Exception as e:
print(e)
# 错误处理
如果需要设置额外的header,例如要调用开启了MFA操作保护的接口,需要传递x-jdcloud-security-token
,则按照如下方式:
parameters = DeleteInstanceParameters('cn-north-1', 'i-xxx')
header = {'x-jdcloud-security-token': 'xxx'}
request = DeleteInstanceRequest(parameters, header)
如果需要设置访问点,配置超时等,请参考如下更复杂的例子:
from jdcloud_sdk.core.credential import Credential
from jdcloud_sdk.core.const import SCHEME_HTTP
from jdcloud_sdk.core.config import Config
from jdcloud_sdk.core.logger import Logger
from jdcloud_sdk.services.vm.client.VmClient import VmClient
credential = Credential(access_key, secret_key)
# 指定使用http方式访问vpc专用域名,超时为20s
config = Config('vm.internal.cn-north-1.jdcloud-api.com', SCHEME_HTTP, 20)
logger = Logger(3) # FATAL = 0 ERROR = 1 WARN = 2 INFO = 3;如果不想输出日志,可将日志级别设置为0(FATAL);不设置logger,则默认为INFO
client = VmClient(credential, config, logger)
更多调用示例参考 SDK使用Demo
生成文档
pip3 install -U sphinx
cd docs && make apidoc && make html
一般错误代码故障处理
1、ak, sk不正确错误代码,出现如下响应一般是ak, sk传入不正确导致,需核对ak, sk是否正确:
{
"error":{
"message":"secret key is null [gw]",
"status":"HTTP_FORBIDDEN","code":403
},
"requestId":"xxxxxxxxxxxxx"
}
2、子账户没有授予响应权限导致出现错误,需检查子账户是否有对应产品权限(如下响应是以VPC产品为例)。
{
"error":{
"details":[{
"param1":"vpc:createVpc",
"param0":"*"
}],
"message":"You are not authorized to perform (vpc:createVpc) on resource (*) [IAM] [gw]",
"status":"HTTP_FORBIDDEN","code":403
},
"requestId":"xxxxxxxxxxxxx"
}
3、使用SDK创建对象传参错误处理方法(以VPC产品为例)
错误示例:
from jdcloud_sdk.core.credential import Credential
from jdcloud_sdk.services.vpc.client.VpcClient import VpcClient
from jdcloud_sdk.services.vpc.apis.CreateVpcRequest import *
if __name__ == "__main__":
Access_Key = 'ak' # Access_Key
Secret_Key = 'sk' # Secret_Key
credential = Credential(Access_Key, Secret_Key) # 传入ak, sk获取令牌
client = VpcClient(credential) # 传入令牌创建Vpc API客户端
param = CreateVpcParameters('cn-south-1', 'test2', addressPrefix='192.168.1.0/24') # 创建VPC所需参数
req = CreateVpcRequest(param) # 创建请求体
client.send(req) # 发送请求
在此示例中创建Vpc参数对象时,参数传入了addressPrefix
,但在官方提供的SDK源代码中并没有声明此参数,导致Python报TypeError:CreateVpcParameters.__init__() takes 3 positional arguments but 4 were given
,如下图:贴官方SDK源代码:
class CreateVpcParameters(object):
def __init__(self,regionId, vpcName, ):
"""
:param regionId: Region ID
:param vpcName: 私有网络名称,只允许输入中文、数字、大小写字母、英文下划线“_”及中划线“-”,不允许为空且不超过32字符。
"""
self.regionId = regionId
self.vpcName = vpcName
self.addressPrefix = None
self.description = None
self.enableMulticast = None
self.azType = None
self.az = None
def setAddressPrefix(self, addressPrefix):
"""
:param addressPrefix: (Optional) 如果为空,则不限制网段,如果不为空,10.0.0.0/8、172.16.0.0/12和192.168.0.0/16及它们包含的子网,且子网掩码长度为16-28之间
"""
self.addressPrefix = addressPrefix
从上述代码中可以看到,构造函数中并没有声明addressPrefix
这个参数,那么如何解决这个问题呢?请看下面的示例:
from jdcloud_sdk.core.credential import Credential
from jdcloud_sdk.services.vpc.client.VpcClient import VpcClient
from jdcloud_sdk.services.vpc.apis.CreateVpcRequest import *
if __name__ == "__main__":
Access_Key = 'ak' # Access_Key
Secret_Key = 'sk' # Secret_Key
credential = Credential(Access_Key, Secret_Key) # 传入ak, sk获取令牌
client = VpcClient(credential) # 传入令牌创建Vpc API客户端
param = CreateVpcParameters('cn-south-1', 'test2') # 创建VPC所需参数
param.setAddressPrefix('192.168.1.0/24') # 使用setter方法设置addressPrefix参数
req = CreateVpcRequest(param) # 创建请求体
client.send(req) # 发送请求
查看SDK中的源代码,发现其中声明了setter方法,故需要使用setter方法来设置addressPrefix
参数。
4、未安装或SDK包名写错导致Python报错:ModuleNotFoundError: No module named 'jcloud_sdk'
如下图所示,仔细观察,我们可以发现jdcloud_sdk
写成了jcloud_sdk
,故导致出现了报错的情况。那么我们改回jdcloud_sdk
即可。
如改回jdcloud_sdk
后,依旧出现ModuleNotFoundError
如何处理呢?首先,我们需要确认是否已经安装了jdcloud_sdk
,使用以下代码检查:
# Linux系统:
pip list | grep "jdcloud_sdk"
# Windows系统
pip list | findstr "jdcloud_sdk"
# 如何执行上述命令后,没有任何信息展示,则表示没有安装SDK
pip install jdcloud_sdk # 仅在当前项目安装
# 需要执行上述命令安装SDK
如安装完成后,依旧提示ModuleNotFoundError
,此时应该检查下编写的代码是否正确。
5、创建VPC有同地域并同名称的报错
{
"requestId":"cppethir1wr7mkn3pp5qse3pjrpm2e13",
"error":{
"code":409,
"status":"CONFLICT",
"message":"vpcName test2 conflict",
"details":[]
}
}
此报错表示在同地域已经有test2这个示例了,一般更换名称后即可创建成功。
6、配额上限导致报错
{
"requestId":"cppf1drkpios2t49iemeoctamefg57jd",
"error":{
"code":429,
"status":"QUOTA_EXCEEDED",
"message":"vpc quota exceeded.",
"details":[]
}
}
此报错为创建的资源已达配额上限,需要提升配额。
未完待续...
评论区