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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:53:24