Python 调用阿里云 OpenAPI 巡检到期云资源

文若12个月前技术文章377

前言

本篇文章介绍我写的一个程序,通过调用阿里云 OpenAPI 巡检即将到期的云资源。

https://github.com/COOH-791/cloud_instance_sentry

1. 用途

说到云资源续费,公认不移,是一件几乎不可能出错的事情,根据 “墨菲定律” 如果事情有变坏的可能,不管概率多小,总会发生。

实际工作中还是遇到不少因为云资源到期未续费造成的服务中断情况,所以编写该程序,通过定期巡检避免此类问题发生。

  • 支持对称加密用户填写到配置文件中的 AK 信息。

  • 支持多个 AK 账号巡检。

  • 支持云账号额度巡检。

  • 支持全局配置。

  • 支持将巡检报告发送到钉钉 & 飞书(研发中)。

2. 项目状态

正常维护,应用于公司部分线上环境。

  • 已测试环境

    • Python 3.7

    • CentOS Linux release 7.9.2009 (Core)

3. 环境准备

3.1 Python 安装

程序基于 Python3 研发,如果系统中没有 Python3 可使用下面方式安装:

# 下载 Python 源码
wget "https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tar.xz"
# 解压
tar -xvJf Python-3.7.3.tar.xz
# 编译
cd Python-3.7.3
./configure prefix=/usr/local/python3
make && make install
ln -fs /usr/local/python3/bin/python3 /usr/bin/python3
ln -fs /usr/local/python3/bin/pip3 /usr/bin/pip3

测试:

python3 --version
pip3 --version

3.2 代码依赖安装

下载源代码:

# 下载源码
wget https://github.com/COOH-791/cloud_instance_sentry/archive/refs/heads/main.zip
# 解压
unzip cloud_instance_sentry-main.zip
# 进入代码
cd cloud_instance_sentry-main/

在项目路径中,创建虚拟环境:

# 创建虚拟环境文件夹
mkdir venv
cd venv
# 创建虚拟环境
python3 -m venv .
# bin  include  lib  lib64  pyvenv.cf
# 激活环境
source ./bin/activate

安装依赖模块:

# 更新 pip
pip3 install --upgrade pip
# 进入代码 requirements.txt 文件目录,执行依赖模块安装
pip3 install -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com -r requirements.txt
# 该模块需要单独安装
pip3 install -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com alibabacloud_cas20200407==1.0.13

退出当前虚拟环境:

deactivate

4. 使用案例

本小节,会介绍代码如何配置以及执行流程。

4.1 配置文件介绍

以下是脱敏的测试配置文件,通过它向大家介绍各项配置的含义。

[global-config]
# 实例过期天数阈值
global_overdue_day = 15
# 费用阈值
global_amount_threshold = 1000000
# webhook
global_webhook = https://oapi.dingtalk.com/robot/send?access_token=39c437db9d6f217b1cedad7012c8f
# 最大显示多少个实例
max_list_length = 10
# 心跳检测
ping = on
# 是否隐藏余额,on 隐藏 off 不隐藏
global_amount_invisible = off

[test01]
username = 测试用户1
access_key = B_c31f34addb5f08f365b322dd199f92092b34142e64e
access_key_secret = B_2344bfd8236ea936d38c7e3474841f033fa9
amount_threshold = 10000
overdue_day = 10

[test02]
username = 测试用户2
access_key = B_c31f34addb5f08f365b322dd199f92092b34142e64e
access_key_secret = B_2344bfd8236ea936d38c7e3474841f033fa9

该程序支持巡检多个 AK 账号,配置文件由两部分组成,分别是 全局配置用户配置,其中全局配置是必需要配置的,用户配置是指每个 AK 的信息配置,有多个 AK 就有多少个用户配置。

全局配置 [global-config]:

  • global_overdue_day:全局实例过期天数阈值,如果用户配置中,没有设置 overdue_day 过期天数阈值,那么会以全局配置中该值为准。

  • global_amount_threshold:全局费用阈值,如果用户配置中,没有设置 amount_threshold 余额阈值,那么会以全局配置中该值为准。

  • global_webhook:通知群的 webhook ,如果用户配置中,没有设置 webhook 群通知 token,那么会以全局配置中该值为准。

  • max_list_length:如果过期实例非常多的话,发送出来的卡片会非常长,而且超出限制消息会发送失败,该参数用来配置,过期实例列表的最大长度。

  • ping:设置为 off 的话,如果当天巡检没有发现即将过期的实例,那么不会发送任何消息,设置为 on 的话,既使没有巡检出过期实例,也会向用户发送一个通知,相当于一个心跳检测,告诉用户程序正常运行。

  • global_amount_invisible:程序会采集余额,但是有些用户对余额比较敏感,不想让余额展示出来,可通过设置该参数。如果用户配置中,没有设置 amount_invisible 参数,那么会以全局配置中该值为准。

用户配置 [用户名]:

如上面的演示,[test01] 和 [test02] 这两部分为用户配置,其中 section name 由用户自由设置(支持英文和下划线)有多少个 AK 配置多少个 section 即可。

因为有全局配置的存在,用户配置中,只有 3 个配置项是必需要设置的:

  • username:用户名。

  • access_key:AK。

  • access_key_secret:AK 密钥。

可选配置,如果配置了,将优先以用户配置为准:

  • webhook:通知的群 webhook。

  • amount_threshold:费用阈值。

  • overdue_day:过期天数阈值。

  • amount_invisible:是否隐藏余额,on 隐藏 off 不隐藏。

4.2 启动巡检

编写完配置文件后,使用刚才创建的虚拟环境 Python3 启动程序:

/code/cloud_instance_sentry-main/venv/bin/python3 patrol_cloud_sentry.py

正常情况下,配置的群里,将会收到如下信息:

994dbeefb0d541ad807db458f4e8ec7c994dbeefb0d541ad807db458f4e8ec7c.png

测试无异常后,可配置定时任务,例如每天 09:30 进行过期实例巡检:

30 09 * * * /code/cloud_instance_sentry-main/venv/bin/python3 /code/cloud_instance_sentry-main/cloud_instance_sentry/patrol_cloud_sentry.py

4.3 程序流程

程序的执行流程如下:

  1. 读取配置文件,会进行判断用户配置中的 AK 信息是否已经加密,如果没有加密将使用对称加密针对 AK 信息加密。

  2. 使用 AK 调用阿里云 OpenAPI 拉取实例列表。

  3. 根据列表和用户提供的阈值,组织消息列表。

  4. 调用消息通知模块,发送巡检结果。

5. 后记

有任何问题,请与我联系。邮箱:huabing8023@126.com

欢迎提问题提需求,欢迎 Pull Requests!

相关文章

nginx分发算法

nginx分发算法

一、分发算法介绍如何将用户请求按照一定的规律分发给业务服务器。主要分为Nginx集群默认算法和基于请求头分发算法。二、nginx集群默认算法nginx的upstream 目前支持4种方式的分配轮询(默...

根目录扩容

根目录扩容

1、创建一个空分区创建分区:查看创建的新分区:2、开始扩容(1)创建物理卷[root@web03 ~]# lvm lvm> pvcreate /dev/vdb1   Physical vol...

MySQL运维实战(4.4) SQL_MODE之STRICT_TRANS_TABLES和STRICT_ALL_TABLES

如果设置STRICT模式,则如果数据写入时,如果数据不符合字段定义(字符串超出长度、数值类型数据超出范围、违反not null约束等),SQL会报错。如果不设置STRICT模式,会对异常数据进行截断处...

企业级大数据安全架构(八)

企业级大数据安全架构(八)

前面第七章详细介绍了部署FreeIPA来做kerberos认证,这节接着介绍FreeIPA高可用部署1.FreeIPA高可用配置说明:在安装完一台ipa-server之后,在另一个备份节点部署ipa-...

Python 实现 Prometheus 自定义指标暴露

Python 实现 Prometheus 自定义指标暴露

虽然 Prometheus 已经拥有可直接使用的 exporter 可供使用,以满足收集不同的监控指标的需要。然而,如果我们需要收集一些自定义指标项,还是需要我们编写程序去暴露相关接口(/metric...

PromQL查询解析

一. 概述Prometheus除了存储数据外,还提供了一种强大的功能表达式语言 PromQL,允许用户实时选择和汇聚时间序列数据。表达式的结果可以在浏览器中显示为图形,也可以显示为表格数据,或者由外部...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。