您的位置:首页 > 编程语言 > Python开发

如何使用 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程序员 ,现学现用,不足之处甚多,欢迎心平气和地指正。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: