You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 03:37:36