如何使用Boto3 Python获取RDS上次连接至今的天数信息
解决RDS闲置实例检测问题
你提到的「上次连接至今天数」属于Trusted Advisor的专属检测结果,无法通过rds.describe_db_instances()直接获取,以下是几种可行的解决方法:
方法一:调用Trusted Advisor API获取闲置实例数据
AWS Support API提供了访问Trusted Advisor检查结果的能力,你可以通过以下步骤获取目标数据:
- 确保你的IAM角色拥有
support:DescribeTrustedAdvisorChecks和support:GetTrustedAdvisorCheckResult权限 - 使用boto3的
support客户端查询对应的检查项,RDS闲置实例对应的检查ID是Pfx0RwqBli(「低利用率的Amazon RDS数据库实例」)
示例代码:
#!/usr/bin/env python3 import boto3 def get_idle_rds_instances(): try: support_client = boto3.client('support', region_name='us-east-1') # Trusted Advisor仅支持us-east-1 # 获取检查结果 check_result = support_client.get_trusted_advisor_check_result( checkId='Pfx0RwqBli', language='zh' ) # 提取闲置超过14天的实例 idle_instances = [] for item in check_result['result']['flaggedResources']: # 解析上次连接天数(Trusted Advisor返回的metadata格式为["上次连接至今天数: X"]) last_connect_days = int(item['metadata'][3].split(': ')[1]) if last_connect_days >=14: idle_instances.append({ 'DBInstanceIdentifier': item['metadata'][0], 'LastConnectDays': last_connect_days, 'Region': item['metadata'][1] }) return idle_instances except Exception as error: print(f"获取Trusted Advisor数据失败: {error}") return [] if __name__ == "__main__": idle_rds = get_idle_rds_instances() for instance in idle_rds: print(f"闲置实例: {instance['DBInstanceIdentifier']}, 上次连接距今: {instance['LastConnectDays']}天, 区域: {instance['Region']}")
方法二:通过CloudWatch指标判断实例闲置
如果无法使用Support API,可以通过CloudWatch的连接数指标间接判断:
- MySQL/MariaDB:
DatabaseConnections指标 - PostgreSQL:
Connections指标 - SQL Server:
DatabaseConnections指标
当连续14天该指标持续为0时,可判定为闲置实例。示例代码:
#!/usr/bin/env python3 import boto3 from datetime import datetime, timedelta def check_rds_idle_via_cloudwatch(instance_id, region): cloudwatch = boto3.client('cloudwatch', region_name=region) end_time = datetime.now() start_time = end_time - timedelta(days=14) # 根据数据库引擎选择对应指标 engine = get_rds_engine(instance_id, region) metric_name = 'DatabaseConnections' if engine in ['mysql', 'mariadb', 'sqlserver'] else 'Connections' response = cloudwatch.get_metric_statistics( Namespace='AWS/RDS', MetricName=metric_name, Dimensions=[{'Name': 'DBInstanceIdentifier', 'Value': instance_id}], StartTime=start_time, EndTime=end_time, Period=86400, # 按天聚合 Statistics=['Sum'] ) # 检查14天内是否有连接记录 for datapoint in response['Datapoints']: if datapoint['Sum'] > 0: return False return True def get_rds_engine(instance_id, region): rds = boto3.client('rds', region_name=region) response = rds.describe_db_instances(DBInstanceIdentifier=instance_id) return response['DBInstances'][0]['Engine'] # 使用示例 # print(check_rds_idle_via_cloudwatch('your-db-instance', 'us-west-2'))
方法三:直接查询数据库连接状态
对于有权限直接访问数据库的场景,可以通过查询数据库内部的连接表来判断:
- MySQL:
SELECT COUNT(*) FROM information_schema.processlist WHERE USER != 'system user'; - PostgreSQL:
SELECT COUNT(*) FROM pg_stat_activity WHERE state != 'idle'; - SQL Server:
SELECT COUNT(*) FROM sys.dm_exec_sessions WHERE is_user_process = 1;
如果多次查询结果均为0,可判定为闲置。
内容的提问来源于stack exchange,提问作者Joel Divekar
相关产品推荐
相关产品推荐

