使用AWS SDK for Python(boto3)列出Lambda函数及标签过滤问题
问题解答
一、为什么返回空的Functions列表?
你错误使用了MasterRegion参数:
- 这个参数仅用于查询从指定区域复制到当前区域的Lambda函数,仅适配跨区域复制的场景。
- 如果你要获取当前区域(us-west-2)原生创建的函数,添加该参数后,只会查找从us-west-2复制过来的函数(你的函数都是原生创建),因此返回空列表。
修复方法:直接去掉MasterRegion参数即可正常获取当前区域的Lambda函数。
二、修复后的基础获取代码
import boto3 # 初始化Lambda客户端(CloudWatch客户端当前暂时不需要,可后续获取指标时使用) lambda_client = boto3.client('lambda', region_name='us-west-2') # 获取当前区域所有Lambda函数(支持分页,避免MaxItems限制) all_functions = [] paginator = lambda_client.get_paginator('list_functions') for page in paginator.paginate(FunctionVersion='ALL'): all_functions.extend(page['Functions']) print(all_functions)
注:
FunctionVersion='ALL'会返回函数的所有版本(包括$LATEST和发布的版本),如果只需要最新版本,可去掉该参数使用默认值。
三、实现标签过滤(mygroup:env=dev)
Lambda的list_functions接口本身不支持直接按标签过滤,有两种实现方式:
方式1:先获取所有函数,再逐个校验标签
适合函数数量较少的场景:
import boto3 lambda_client = boto3.client('lambda', region_name='us-west-2') # 获取所有函数 all_functions = [] paginator = lambda_client.get_paginator('list_functions') for page in paginator.paginate(FunctionVersion='ALL'): all_functions.extend(page['Functions']) # 过滤带有指定标签的函数 filtered_functions = [] target_tag_key = 'mygroup:env' target_tag_value = 'dev' for func in all_functions: # 获取当前函数的标签 tags = lambda_client.list_tags(Resource=func['FunctionArn'])['Tags'] if tags.get(target_tag_key) == target_tag_value: filtered_functions.append(func) print(f"符合条件的函数数量:{len(filtered_functions)}") print(filtered_functions)
方式2:用资源标签API直接过滤(更高效)
通过resourcegroupstaggingapi直接按标签筛选Lambda函数,无需遍历所有函数,适合函数数量多的场景:
import boto3 # 初始化标签API客户端和Lambda客户端 tagging_client = boto3.client('resourcegroupstaggingapi', region_name='us-west-2') lambda_client = boto3.client('lambda', region_name='us-west-2') # 按标签筛选Lambda资源 tag_filter_response = tagging_client.get_resources( ResourceTypeFilters=['lambda:function'], TagFilters=[ { 'Key': 'mygroup:env', 'Values': ['dev'] } ] ) # 提取符合条件的函数ARN,再获取详细信息 filtered_function_arns = [item['ResourceARN'] for item in tag_filter_response['ResourceTagMappingList']] filtered_functions = [] for arn in filtered_function_arns: func_detail = lambda_client.get_function(FunctionName=arn) filtered_functions.append(func_detail) print(f"符合条件的函数数量:{len(filtered_functions)}") print(filtered_functions)
内容的提问来源于stack exchange,提问作者gwydion93
相关产品推荐
相关产品推荐

