由于阿里云的机器太多,而且账户也多,需要一个账户登录续费巡检不方便,
脚本内容如下

# -*- coding: utf-8 -*-
# yx  www.g6k.cn
# 遍历出ecs rds mongdb redis 等续费信息,并打印成文件
"""
pip install aliyun-python-sdk-dds==3.7.3
pip install aliyun-python-sdk-ecs==4.24.26
pip install aliyun-python-sdk-rds==2.7.2
pip install aliyun-python-sdk-r-kvstore==2.20.7
"""

from aliyunsdkcore.client import AcsClient
from aliyunsdkrds.request.v20140815.DescribeDBInstancesRequest import DescribeDBInstancesRequest as Rdsgetinfoall
from aliyunsdkr_kvstore.request.v20150101.DescribeInstancesOverviewRequest import DescribeInstancesOverviewRequest
from aliyunsdkdds.request.v20151201.DescribeDBInstancesRequest import DescribeDBInstancesRequest as MongoDBgetinfoall
from aliyunsdkcore import client
from aliyunsdkecs.request.v20140526 import DescribeInstancesRequest
import json
from datetime import datetime
from xlsxwriter import workbook

def NowDatetime(ExpiredTime, strptime_time):
    news_date = datetime.strptime(ExpiredTime, strptime_time)
    long_data = (news_date - datetime.now()).days
    return long_data

#多个ak,只需要授权子账户ecs读取权限即可,避免出现乱调用出现问题!
ak = {'access_key_id': 'access_key_secret',
      "access_key_id": "access_key_secret",
      "access_key_id": "access_key_secret",
      }
# 区域id,根据实际情况补充列表
region_id = ['cn-beijing', 'cn-hangzhou', 'cn-shanghai', 'cn-shenzhen', 'cn-guangzhou', 'cn-hongkong']

expiration_ecs_xf_dict = []

#######获取到期小于7天的ecs#####
def get_ecs_data(access_key_id, access_key_secret, region_id):
    title_id = (
        '实例 ID',
        '主机名称',
        '所在区域',
        '系统类型',
        'CPU核心',
        '内存大小',
        '运行状态',
        '过期时间',
        '剩余天数',
    )
    ecs_filename = "./aliyun_xf_ecs_Excel.xlsx"

    cli = client.AcsClient(access_key_id, access_key_secret, region_id)
    res = DescribeInstancesRequest.DescribeInstancesRequest()
    res.set_accept_format('json')
    res.set_PageSize(100)  ##  单页条数

    for i in range(1, 5):  ##  遍历500条数据,根据阿里云ecs实例实际情况调整
        res.set_PageNumber(i)  ## 遍历每页
        result = json.loads(cli.do_action_with_exception(res))
        ecs_info = result.get('Instances').get('Instance')
        # 遍历获取到的结果
        for info in ecs_info:
            Status = info.get('Status')  ## 实例状态
            InstanceId = info.get('InstanceId')  ## 实例id
            InstanceName = info.get('InstanceName')  ## 实例名称
            ExpiredTime = info.get('ExpiredTime')  ## 实例到期时间
            RegionId = info.get('RegionId')  ## 所在区域
            OSType = info.get('OSType')
            Cpu = str(info.get('Cpu'))  ## cpu核心数
            Memory = str(int(info.get('Memory')) / 1024)  ## 内存,单位G
            strptime_time = "%Y-%m-%dT%M:%Sz"  #需要对时间格式处理
            xf = NowDatetime(ExpiredTime,strptime_time)+1
            news_date = datetime.strptime(info.get('ExpiredTime'), strptime_time)
            if int(xf) < 6:
                expiration_dict = (InstanceId,
                                   InstanceName,
                                   RegionId,
                                   OSType,
                                   Cpu,
                                   Memory,
                                   Status,
                                   news_date.date(),
                                   xf
                )
                expiration_ecs_xf_dict.append(expiration_dict)
            else:
                continue

    write_excel(ecs_filename, expiration_ecs_xf_dict, title_id)

def write_excel(file, data, title_id):
    '''
    1、设置 Excel 样式
    2、将数据写入到 Excel 中
    '''
    # 生成 Excel 文件
    work = workbook.Workbook(file)
    # 建立工作表,表名默认
    worksheet = work.add_worksheet("ecs续费")
    # 设置字体加粗、字体大小
    format_title = work.add_format({'bold': True, 'font_size': 16})
    # 设置水平对齐、垂直对齐
    format_title.set_align('center')
    format_title.set_align('vcenter')

    format_body = work.add_format({'font_size': 14})
    # 设置样式,行高、列宽
    worksheet.set_row(0, 25)
    worksheet.set_column(0, 0, 35)
    worksheet.set_column(1, 1, 40)
    worksheet.set_column(2, 2, 20)
    worksheet.set_column(3, 5, 15)
    worksheet.set_column(6, 6, 20)
    worksheet.set_column(7, 7, 25)
    # 定义表头
    title = (
        title_id
    )
    row = 0
    col = 0


    # 表头写入文件,引用样式
    for item in title:
        worksheet.write(row, col, item, format_title)
        col += 1
    # 内容写入文件,引用样式
    for line in data:
        row += 1
        col = 0
        for key in line:
            worksheet.write(row, col, str(key), format_body)
            col += 1

    work.close()

#循环出ak并在每个ak下遍历出不同区域的ecs信息  
for k,v in ak.items():
    for i in region_id:
         get_ecs_data(access_key_id=k, access_key_secret=v, region_id=i)

效果如下
2022-12-27T09:23:20.png

Last modification:December 27, 2022
如果觉得我的文章对你有用,请随意赞赏