如何使用 python(boto3) 编写脚本控制AWS实例的自起停
2019-02-13 22:02
741 查看
版权声明:欢迎转载,请注明出处 https://blog.csdn.net/u010009744/article/details/81028805
如何使用 python(boto3) 编写脚本控制AWS实例的自起停
为AWS宁夏区开张送上迟到地祝福,上半年项目开发中用到了AWS云服务器,按时计费,为节省经费计划在上班期间开启,下班之后关闭。通过查看boto3文档,最终实现了这一小脚本。半年前的脚本,不知道在现在会不会过时,权当做个记录,如果能帮到网友自然更好
前置工作
- 目的
实现定时远程控制AWS中EC2和RDS实例的自启停 - 运行必要环境
python 3.6
boto 3
(通过aws命令行也可以进行远程控制,为了适应性,还是决定用python开发脚本,安装方法请通过网络检索。) - 参考文档
https://pypi.org/project/boto3/ - 访问信息
以管理员的身份登录AWS,生成远程访问的必要信息,access_id,secret_access_key,region
实现
- 思路
EC2, 在boto3的文档中现成的EC2示范代码,照葫芦画瓢即可
RDS,没有直接示范代码,参考session的示范代码,也捣鼓成功了 - 文件结构
根据boto3的推荐,分成python程序文件和配置文件
配置文件如下,不再重复贴
[config] aws_access_key_id = ABCDEFG aws_secret_access_key = 123456789/*-+ region = cn-northwest-1
- python代码
EC2 实例控制代码,可以自动获取所有已存在的实例
#!/usr/bin/env python # coding = utf-8 import sys import boto3 from boto3.session import Session import configparser DEBUG = False def get_config_info(configFile): cf = configparser.ConfigParser() cf.read(configFile) return cf['config']['aws_access_key_id'], \ cf['config']['aws_secret_access_key'], \ cf['config']['region'] def get_instances_info(resource, id_list, state): instances = resource.instances.filter( Filters=[{'Name': 'instance-state-name', 'Values': [state]}]) if any(instances): for instance in instances: id_list.append(instance.id) print(instance.id, instance.instance_type, instance.state) else : print('instances none in ' + state) return def main(): cmd = ['START', 'STOP', 'CHECK'] status = ['stopped', 'running'] ids = [] info = get_config_info(str(sys.argv[1])) session = boto3.session.Session(aws_access_key_id = info[0], aws_secret_access_key = info[1], region_name = info[2]) ec2 = session.resource('ec2') action = sys.argv[2].upper() if cmd[2] == action : for sta in status: get_instances_info(ec2, ids, sta) elif cmd[0] == action : get_instances_info(ec2, ids, status[0]) ec2.instances.filter(InstanceIds = ids).start() elif cmd[1] == action : get_instances_info(ec2, ids, status[1]) ec2.instances.filter(InstanceIds = ids).stop() if __name__ == '__main__': main()
RDS,当时不能自动获取RDS上的所有实例,需要用从配置文件中读取要操作的实例名称,不免为一大遗憾
# !/usr/bin/env python # coding = utf-8 import sys import boto3 from boto3.session import Session from botocore.exceptions import ClientError import configparser def get_config_info(configFile): cf = configparser.ConfigParser() cf.read(configFile) return cf['config']['aws_access_key_id'], \ cf['config']['aws_secret_access_key'], \ cf['config']['region'] def get_rds_instances(instancesFile): instances = [] with open(instancesFile, 'r') as f: for line in f.readlines(): print(line) instances.append(line.strip()) f.close() if any(instances): return instances else: print('instances file is empty.') def main(): cmd = ['START', 'STOP', 'CHECK'] info = get_config_info(str(sys.argv[1])) session = boto3.session.Session(aws_access_key_id = info[0], aws_secret_access_key = info[1], region_name = info[2]) rds_client = session.client('rds') instances = get_rds_instances(str(sys.argv[2])) action = sys.argv[3].upper() if cmd[2] == action: for instance in instances: response = rds_client.\ describe_db_instances(DBInstanceIdentifier = instance) print(instance, response) elif cmd[0] == action: for instance in instances: response = rds_client.\ start_db_instance(DBInstanceIdentifier = instance) print(instance, response) elif cmd[1] == action: for instance in instances: response = rds_client.\ stop_db_instance(DBInstanceIdentifier = instance) print(instance, response) return if __name__ == '__main__': main()
rds_instances
testRds1 testRds2
- 加入到系统任务中,设置为周一到周五早上9点执行启动命令,下午5点执行关闭命令,目标达成
踩过的坑
- 找不到实例、 拒绝访问、没有访问权限
确认一下本地PC的时区,AWS是按照时区进行分片,当请求发起后,通过发起请求PC的时区进行判断该查找哪一片区的实例,国内的PC不乱改时区,都能访问北京或宁夏的AWS上的实例,在确认了访问信息无误之后如仍不能访问,可以把PC时区调整为东八区试试。
PS: 洒家非python程序员 ,现学现用,不足之处甚多,欢迎心平气和地指正。
- 不想手动copy的网友请自取 https://download.csdn.net/download/u010009744/10836288
相关文章推荐
- 使用python语言编写脚本控制freeswitch总结
- 使用Bash编写Linux Shell脚本-8.调试和版本控制
- Shell 编程--本文结合大量实例阐述如何编写一个shell脚本
- 如何创建和使用Python CGI脚本
- Viz Artist脚本如何控制切换逻辑的播放(GOTO_TRIO的使用)
- Shell 编程--结合大量实例阐述如何编写一个shell脚本
- Java零基础:一步步教你如何使用eclipse创建项目及编写小程序实例
- 变量-数据类型-对象-如何编写python脚本
- 【转】如何编写Python脚本替换文件中的多行字符
- python脚本初探---新手如何直接编写一个hello world模块即可执行的.py文件
- 使用python编写脚本获取手机当前应用apk的信息
- 如何使用C/C++为Python编写DLL/SO
- 使用Python编写简单的端口扫描器的实例分享
- 使用python编写数据检索脚本
- 使用Python3编写抓取网页和只抓网页图片的脚本
- 如何使用Python为Hadoop编写一个简单的MapReduce程序
- PYTHON(DJANGO)使用日记之如何改变admin控制下的页面风格
- 如何使用Python为Hadoop编写一个简单的MapReduce程序
- SMS脚本节选六:如何使用站点控制文件
- 使用python编写批量卸载android应用的脚本