-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathAutostopRDS.py
87 lines (77 loc) · 3.63 KB
/
AutostopRDS.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import boto3
import os
target_db = None
region = os.environ['AWS_REGION']
rds = boto3.client('rds', region_name=region)
def get_tags_for_db(db):
instance_arn = db['DBInstanceArn']
instance_tags = rds.list_tags_for_resource(ResourceName=instance_arn)
return instance_tags['TagList']
def get_tags_for_db_cluster(db):
instance_arn = db['DBClusterArn']
instance_tags = rds.list_tags_for_resource(ResourceName=instance_arn)
return instance_tags['TagList']
def lambda_handler(event, context):
dbs = rds.describe_db_instances()
readReplica = []
for db in dbs['DBInstances']:
readReplicaDB = db['ReadReplicaDBInstanceIdentifiers']
readReplica.extend(readReplicaDB)
print("readReplica : " + str(readReplica))
for db in dbs['DBInstances']:
db_id = db['DBInstanceIdentifier']
db_engine = db['Engine']
print('DB ID : ' + str(db_id))
db_tags = get_tags_for_db(db)
print("All Tags : " + str(db_tags))
tag = next(iter(filter(lambda tag: tag['Key'] == 'AutoStop' and tag['Value'].lower() == 'true', db_tags)), None)
print("AutoStop Tag : " + str(tag))
if db_engine not in ['aurora-mysql','aurora-postgresql']:
if db_id not in readReplica and len(readReplica) == 0:
if tag:
target_db = db
print("DB Details : " + str(target_db))
db_id = target_db['DBInstanceIdentifier']
db_status = target_db['DBInstanceStatus']
print("DB ID : " + str(db_id))
print("DB Status : " + str(db_status))
if db_status == "available":
AutoStopping = rds.stop_db_instance(DBInstanceIdentifier=db_id)
print("Stopping DB : " + str(db_id))
else:
print("Database already stopped : " + str(db_id))
else:
print("AutoStop Tag Key not set for Database to Stop...")
else:
print("Cannot stop or start a Read-Replica Database...")
dbs = rds.describe_db_clusters()
readReplica = []
for db in dbs['DBClusters']:
readReplicaDB = db['ReadReplicaIdentifiers']
readReplica.extend(readReplicaDB)
print("readReplica : " + str(readReplica))
for db in dbs['DBClusters']:
db_id = db['DBClusterIdentifier']
db_engine = db['Engine']
print('DB ID : ' + str(db_id))
db_tags = get_tags_for_db_cluster(db)
print("All Tags : " + str(db_tags))
tag = next(iter(filter(lambda tag: tag['Key'] == 'AutoStop' and tag['Value'].lower() == 'true', db_tags)), None)
print("AutoStop Tag : " + str(tag))
if db_engine in ['aurora-mysql','aurora-postgresql']:
if db_id not in readReplica and len(readReplica) == 0:
if tag:
target_db = db
db_id = target_db['DBClusterIdentifier']
db_status = target_db['Status']
print("Cluster DB ID : " + str(db_id))
print("Cluster DB Status : " + str(db_status))
if db_status == "available":
AutoStopping = rds.stop_db_cluster(DBClusterIdentifier=db_id)
print("Stopping Cluster DB : " + str(db_id))
else:
print("Cluster Database already stopped : " + str(db_id))
else:
print("AutoStop Tag Key not set for Cluster Database to Stop...")
else:
print("Cannot stop or start a Read-Replica Cluster Database...")