Python使用阿里云api/sdk教程

对于大部分没有开发经验的运维来说这会很困难,本次教程让大家快速了解阿里云API的整套流程使用方式。

一.说明

使用阿里云API可以完成大部分页面操作,例如定期统计所有资源的清单、统一续费所有产品7天、定期生成资金花费表、定期对RDS做全备份并下载到本地存储、编写自动创建ECS模板做一键资源购买等等。

阿里云API在刚看的时候会很懵,虽然能找到接口文档,但上面的说明是什么意思?参数到底填在哪?返回的是什么?

对于大部分没有开发经验的运维来说这会很困难,本次教程让大家快速了解阿里云API的整套流程使用方式。

二.使用

接口文档

1.阿里云每个服务都有相关的文档,例如阿里云ECS文档中,API参考-》API概览,可以看到相应的接口参数
file

2.API相当于一个窗口接待人员,你想询问ECS的信息,要填写相应的信息,让他知道你想办理什么业务,具体查询哪台
file

3.点击[DescribeInstances],可以看到具体这个方法的参数,接口说明大致看看就行,有涉及到再仔细看
file

[RegionId]要求传入字符串,必须填写,而[VpcId]就不要求必填。可以看不必填的大多是筛选项,用来过滤的。[VpcId]要是填写了,它就只返回这个VPC下的ECS信息了,而不是全部的。具体要不要填写,可以根据需求来,也可以根据返回值慢慢调整。

4.返回的是一个json字符串,里面包含一些信息,可以根据返回的结构来进行使用,后续会有详细例子讲解。
file

5.那这些参数填在哪?怎么使用呢?

一般用阿里云在线调试平台进行在线调试,它会直接生成具体代码脚本,拿过来就可以用。

左侧搜索服务,然后填入方法名称,中间类似填空一样参照接口文档填入相关信息,直接会生成代码了。如果是一些查询的方法,可以直接点击'发起调用'来借用当前账号的权限发起一次api请求,会清晰的返回参数有哪些。
file

像当前例子中的方法,填入必选的地区后,直接调用就可以返回参数了
file

对照这刚才的文档中的返回数据,可以发现都是一一对应的,这样方便调试
file

脚本

1.将生成的脚本给复制下来,是没法执行的,因为要安装相应的模块才可以使用,core的是核心库,其它产品看报错会提示你具体安装哪个包的
pip3 install aliyun-python-sdk-core
pip3 install aliyun-python-sdk-ecs

2.除了安装模块还要填入对应的as和ak才行,线上可以用是因为用的当前账号临时api权限套入的。登陆阿里云,右上角生成ak并记录下来。这里例子增加了指定单个ECS的id号,必须两边加方括号才行。

from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkecs.request.v20140526.DescribeInstancesRequest import DescribeInstancesRequest

client = AcsClient('<xxxxxxxxxx>', '<xxxxxxxxxx>', 'cn-beijing')

request = DescribeInstancesRequest()
request.set_accept_format('json')
request.set_InstanceIds("[\"i-2zexxxxxxxxxxxxxx\"]")

response = client.do_action_with_exception(request)
print(str(response, encoding='utf-8'))

3.执行脚本会返回如下一坨json,比线上的难看很多,所以还是看线上调试比较好
file

线上的如下,其实也可以将这个粘出来,然后放到很多[json在线解析]网站上面。点击左侧那个减号,可以看到是字典->字典->数组->字典这个结构。
file

比如我们要取出这个Memory内存的值,要先用json模块给他变成字典格式,让python可读,然后根据位置来一层层拆开取到值,这期间可以慢慢调试

import json
#上面的所有代码
res_dict = json.loads(response)
print(res_dict["Instances"]["Instance"][0]["Memory"])

最终取的值
file

三.例子

需求说明

需求:
修改某个ECS的实例名称

步骤:
1.验证实例ID变量所在的实例是否存在
2.根据配置的实例变量来查询出现在的实例名称
3.根据配置的实例名称变量来设置实例名称
4.验证实例名称是否是配置好的那个

用到的方法:
DescribeInstances 查询ECS信息
ModifyInstanceAttribute 配置ECS信息

具体步骤

1.这里面有2步都需要验证实例名称,所以可以做成一个函数放便调用,先测试传入一个不存在的ECSid号,会返回空列表,这就可以用if判断了
file

代码:

#!/usr/bin/python3

#权限
aliyun_user_ak = 'xxxxxx'
aliyun_user_sk = 'xxxxxxxxxx'
region_id = 'cn-beijing'

#填写
ecs_id = "i-2zexxxxxxxxxxx"

#传入实例id,不存在返回1,存在则返回实例名称
def Get_EcsName(ecs_id):
    import json
    from aliyunsdkcore.client import AcsClient
    from aliyunsdkcore.acs_exception.exceptions import ClientException
    from aliyunsdkcore.acs_exception.exceptions import ServerException
    from aliyunsdkecs.request.v20140526.DescribeInstancesRequest import DescribeInstancesRequest
    client = AcsClient(ak=aliyun_user_ak, secret=aliyun_user_sk, region_id=region_id, timeout=300)

    request = DescribeInstancesRequest()
    request.set_accept_format('json')
    request.set_InstanceIds("[\"%s\"]" %(ecs_id)) #这块虽然传入是字符串,但要符合结构
    response = client.do_action_with_exception(request)
    res_dict = json.loads(response)
    if res_dict["Instances"]["Instance"]: #空列表返回False
        return res_dict["Instances"]["Instance"][0]["InstanceName"] #先print返回
    else:
        return 1

if __name__ == "__main__":
    Get_EcsName(ecs_id)

2.也是现在调试平台生成代码,执行一下在ECS控制台看看是否改变,成功了就代码复制下来改成函数。因为不管失败和成功都只会返回一个请求id,所以要再次运行查看函数去效验一下

代码:

#!/usr/bin/python3

#权限
aliyun_user_ak = 'xxxxxxxxxx'
aliyun_user_sk = 'xxxxxxxxxxxxxxxx'
region_id = 'cn-beijing'

#填写
ecs_id = "i-2ze8xxxxxxxxxxxxxxx"
ecs_name = "国电测试-支付"

#传入实例id,不存在返回1,存在则返回实例名称
def Get_EcsName(ecs_id):
    import json
    from aliyunsdkcore.client import AcsClient
    from aliyunsdkcore.acs_exception.exceptions import ClientException
    from aliyunsdkcore.acs_exception.exceptions import ServerException
    from aliyunsdkecs.request.v20140526.DescribeInstancesRequest import DescribeInstancesRequest
    client = AcsClient(ak=aliyun_user_ak, secret=aliyun_user_sk, region_id=region_id, timeout=300)

    request = DescribeInstancesRequest()
    request.set_accept_format('json')
    request.set_InstanceIds("[\"%s\"]" %(ecs_id)) 
    response = client.do_action_with_exception(request)
    res_dict = json.loads(response)
    if res_dict["Instances"]["Instance"]:
        return (res_dict["Instances"]["Instance"][0]["InstanceName"])
    else:
        return 1

#修改实例名称
def Modify_EcsName(ecs_name):
    from aliyunsdkcore.client import AcsClient
    from aliyunsdkcore.acs_exception.exceptions import ClientException
    from aliyunsdkcore.acs_exception.exceptions import ServerException
    from aliyunsdkecs.request.v20140526.ModifyInstanceAttributeRequest import ModifyInstanceAttributeRequest
    client = AcsClient(ak=aliyun_user_ak, secret=aliyun_user_sk, region_id=region_id, timeout=300)

    request = ModifyInstanceAttributeRequest()
    request.set_accept_format('json')
    request.set_InstanceId("i-2ze8w32apojmvgunxily")
    request.set_InstanceName(ecs_name) 
    response = client.do_action_with_exception(request)

if __name__ == "__main__":
    if Get_EcsName(ecs_id) == 1:
        print("传入的ECS ID号不正确")
    else:
        Modify_EcsName(ecs_name)
        if Get_EcsName(ecs_id) == ecs_name:
            print("修改成功,实例" + ecs_id + "的最新实例名称为" + ecs_name)
        else:
            print("修改失败,请查看")

效果图:
file

4 条回复 A 作者 M 管理员
  1. python,写不了几行代码就搞定了,这样的一个功能 我在想要是用java 或者DOTNET可能要写一倍多的代码, 好几个问价,而且还要引用一大堆的依赖包

    • 是哒,python挺适合运维或者个人用的

  2. 多谢分享哈!

    • 有帮助就好,也是看到百度没有相关文档,就搞了一篇

欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论