如何用Boto3借助AWS Config Service获取EC2实例指定时段状态变更列表
用Boto3结合AWS Config获取EC2实例状态变更历史
确实,AWS Config是抓取已终止EC2实例状态历史的最佳选择——毕竟EC2原生的DescribeInstances API只能返回当前存活的实例信息。我来一步步教你用Boto3实现这个需求:
前提条件
- 确认你的AWS账户已经启用了AWS Config,并且配置了记录
AWS::EC2::Instance类型资源(这是默认配置项,但最好检查一下)。 - 你的IAM身份(用户/角色)拥有
configservice:GetResourceConfigHistory或configservice:SelectResourceConfig权限。
方法一:使用get_resource_config_history API
这个方法直接拉取指定资源类型的全部配置历史,你可以从中筛选出状态变更的条目。
代码示例
import boto3 from datetime import datetime, timedelta import json # 初始化AWS Config客户端 config_client = boto3.client('configservice') # 定义时间范围(示例:过去7天到当前UTC时间) start_time = datetime.utcnow() - timedelta(days=7) end_time = datetime.utcnow() def fetch_ec2_state_changes(start_time, end_time): all_history_entries = [] next_token = None # 处理分页结果 while True: request_params = { 'resourceType': 'AWS::EC2::Instance', 'startTime': start_time, 'endTime': end_time } if next_token: request_params['nextToken'] = next_token response = config_client.get_resource_config_history(**request_params) all_history_entries.extend(response['configurationItems']) next_token = response.get('nextToken') if not next_token: break # 解析状态变更记录 state_changes = [] for item in all_history_entries: config_data = json.loads(item['configuration']) instance_state = config_data['instanceState']['name'] capture_time = item['configurationItemCaptureTime'] state_changes.append({ 'instance_id': config_data['instanceId'], 'state': instance_state, 'change_time': capture_time, 'instance_type': config_data.get('instanceType'), 'launch_time': config_data.get('launchTime') }) return state_changes # 调用函数并输出结果 state_history = fetch_ec2_state_changes(start_time, end_time) for change in state_history: print(f"实例ID: {change['instance_id']} | 状态: {change['state']} | 变更时间: {change['change_time']}")
方法二:使用select_resource_config(更灵活的查询方式)
如果需要精准筛选(比如只看特定实例ID、特定状态的变更),可以用SQL风格的查询语句:
代码示例
import boto3 import json config_client = boto3.client('configservice') # 定义查询语句,替换时间范围为你需要的UTC时间段 query = """ SELECT configuration.instanceId, configuration.instanceState.name, configurationItemCaptureTime, configuration.instanceType WHERE resourceType = 'AWS::EC2::Instance' AND configurationItemCaptureTime BETWEEN '2024-01-01T00:00:00Z' AND '2024-01-07T23:59:59Z' """ response = config_client.select_resource_config(Expression=query) results = response['Results'] # 解析并输出结果 for result in results: data = json.loads(result) print(f"实例ID: {data['configuration.instanceId']} | 状态: {data['configuration.instanceState.name']} | 变更时间: {data['configurationItemCaptureTime']}")
关键注意事项
- 时间格式:AWS Config统一使用UTC时间,所以你的时间范围要确保是UTC格式(代码中用
datetime.utcnow()即可自动适配)。 - 状态字段:EC2实例的状态存储在
configuration.instanceState.name中,包含你提到的pending、running、shutting-down、terminated等所有状态值。 - 已终止实例支持:AWS Config会永久保留已终止实例的配置历史,所以即使实例已经被删除,你依然能抓取到它的全生命周期状态变更。
- 分页处理:如果历史记录较多,
get_resource_config_history会返回nextToken,示例代码已经处理了循环拉取所有结果的逻辑。
内容的提问来源于stack exchange,提问作者Backwardation25
相关产品推荐
相关产品推荐

