如何用Python的boto3调用AccessAnalyzer list_findings()及理解eq/neq/contains参数
用boto3调用Access Analyzer list_findings() 过滤IAM角色结果的参数说明
核心逻辑先明确
list_findings()的filter参数是字典结构,键是要过滤的字段名(比如resourceType、status、resourceArn),值是包含操作符(eq/neq/contains)的字典,每个操作符对应列表形式的匹配值。
1. eq:精确匹配
用于严格匹配字段的枚举值或固定字符串,是过滤IAM角色结果最常用的方式。比如要只列出IAM角色相关的findings,就匹配resourceType等于AWS::IAM::Role:
import boto3 client = boto3.client('accessanalyzer') response = client.list_findings( analyzerArn='你的分析器ARN', filter={ 'resourceType': { 'eq': ['AWS::IAM::Role'] } } ) # 遍历输出结果 for finding in response.get('findings', []): print(f"角色ARN: {finding['resourceArn']}, 问题描述: {finding['findingDetails']}")
适合用eq的字段:resourceType(固定枚举值)、status(比如ACTIVE/ARCHIVED)、severity等。
2. neq:排除匹配
和eq逻辑相反,用于排除符合指定值的结果。比如要排除已经归档的IAM角色findings,就给status加neq过滤:
response = client.list_findings( analyzerArn='你的分析器ARN', filter={ 'resourceType': { 'eq': ['AWS::IAM::Role'] }, 'status': { 'neq': ['ARCHIVED'] } } )
这样返回的就只有状态为ACTIVE或RESOLVED的IAM角色相关结果。
3. contains:模糊匹配
用于匹配字段值中包含指定子串的结果,适合字符串类型的字段(比如resourceArn、resourceName)。比如要找所有ARN包含my-app-role的IAM角色findings:
response = client.list_findings( analyzerArn='你的分析器ARN', filter={ 'resourceType': { 'eq': ['AWS::IAM::Role'] }, 'resourceArn': { 'contains': ['my-app-role'] } } )
注意:不是所有字段都支持contains,比如resourceType是枚举值,就不支持这个操作符,具体要看字段的类型特性。
额外注意事项
- 每个操作符的值是列表,可以传多个值,比如
eq: ['AWS::IAM::Role', 'AWS::IAM::User']会同时匹配两种资源类型。 - 多个过滤条件是逻辑与的关系,必须同时满足所有条件才会被返回。
- 如果结果数量较多,需要循环调用
list_findings()并传入nextToken参数实现分页获取。
内容的提问来源于stack exchange,提问作者Ashok S
相关产品推荐
相关产品推荐

