设置includeDeletedResources=False后,boto3的list_discovered_resources仍返回已删除资源
问题分析与解决
为什么includeDeletedResources=False仍返回已删除栈?
AWS Config的list_discovered_resources接口中,includeDeletedResources=False的作用是排除已被AWS Config标记为DELETED状态的资源,但CloudFormation栈被删除后,AWS Config的资源状态可能不会立刻同步更新,或者部分已删除的栈在Config中仍保留着非DELETED的状态(比如栈删除操作还未被Config完全捕获)。另外,控制台“已删除”标签下的栈,只是CloudFormation自身保留的删除记录,和AWS Config的资源发现状态不同步。
可行的解决办法
1. 过滤AWS Config返回结果的resourceStatus字段
调用接口后手动筛选resourceStatus为ACTIVE的资源,示例代码:
member_session = boto3.session.Session( aws_access_key_id=credentials["Credentials"]["AccessKeyId"], aws_secret_access_key=credentials["Credentials"]["SecretAccessKey"], aws_session_token=credentials["Credentials"]["SessionToken"], ) config_client = member_session.client('config') response = config_client.list_discovered_resources( resourceType="AWS::CloudFormation::Stack", includeDeletedResources=False ) # 筛选活跃资源 active_stacks = [res for res in response['resourceIdentifiers'] if res['resourceStatus'] == 'ACTIVE']
2. 直接调用CloudFormation的describe_stacks接口
如果目标只是获取活跃的CloudFormation栈,直接用CloudFormation客户端的接口更准确——它直接查询CloudFormation服务的活跃栈列表,不会包含已删除的栈:
cf_client = member_session.client('cloudformation') response = cf_client.describe_stacks() active_stacks = response['Stacks']
补充说明
AWS Config主要用于配置合规审计,其资源发现的状态同步可能存在延迟;而CloudFormation自身的接口是获取栈状态的最直接方式。如果必须用AWS Config,建议结合resourceStatus过滤,或者等待Config完成状态同步(通常几分钟到几十分钟不等,取决于资源类型和AWS内部处理速度)。
内容的提问来源于stack exchange,提问作者sparkstar
相关产品推荐
相关产品推荐

