如何找出AWS账号中近X天未被调用的Lambda函数?
筛选AWS Lambda中近X天未被调用的函数
针对1400个Lambda函数的批量筛选需求,以下是几个可行的方案:
方案一:AWS CLI 批量查询
通过CLI结合CloudWatch指标,逐个验证函数的调用情况:
- 先导出所有Lambda函数的名称列表:
aws lambda list-functions --query 'Functions[*].FunctionName' --output text > lambda_functions.txt
- 编写Shell循环脚本,遍历每个函数查询近X天的
Invocations指标总和:
X=7 # 替换为你需要的天数 START_TIME=$(date -u -d "-$X days" +%Y-%m-%dT%H:%M:%SZ) END_TIME=$(date -u +%Y-%m-%dT%H:%M:%SZ) while read -r func_name; do invocations=$(aws cloudwatch get-metric-statistics \ --namespace AWS/Lambda \ --metric-name Invocations \ --dimensions Name=FunctionName,Value="$func_name" \ --start-time "$START_TIME" \ --end-time "$END_TIME" \ --period $((X*86400)) \ --statistics Sum \ --query 'Datapoints[0].Sum' \ --output text) if [ "$invocations" = "None" ]; then echo "$func_name" >> unused_lambdas.txt fi done < lambda_functions.txt
执行完成后,unused_lambdas.txt文件中会列出所有近X天未被调用的函数。
注意:从未被调用过的新函数,CloudWatch不会生成Invocations指标,这类函数也会被归入结果列表。
方案二:Python + Boto3 批量查询(效率更高)
面对大量函数,用Python脚本并行查询能显著节省时间:
import boto3 from datetime import datetime, timedelta def get_unused_lambdas(days): lambda_client = boto3.client('lambda') cloudwatch_client = boto3.client('cloudwatch') # 分页获取所有Lambda函数 functions = [] paginator = lambda_client.get_paginator('list_functions') for page in paginator.paginate(): functions.extend(page['Functions']) start_time = datetime.utcnow() - timedelta(days=days) end_time = datetime.utcnow() unused_functions = [] for func in functions: func_name = func['FunctionName'] try: response = cloudwatch_client.get_metric_statistics( Namespace='AWS/Lambda', MetricName='Invocations', Dimensions=[{'Name': 'FunctionName', 'Value': func_name}], StartTime=start_time, EndTime=end_time, Period=days * 86400, Statistics=['Sum'] ) # 无数据点说明未被调用 if not response['Datapoints']: unused_functions.append(func_name) except Exception as e: print(f"查询函数 {func_name} 出错: {str(e)}") return unused_functions if __name__ == '__main__': X = 7 # 替换为目标天数 unused = get_unused_lambdas(X) print(f"近{X}天未被调用的Lambda函数:") for func in unused: print(func) # 结果写入文件 with open('unused_lambdas.txt', 'w') as f: f.write('\n'.join(unused))
运行前确保已配置AWS凭证(环境变量、~/.aws/credentials文件均可),并安装boto3库。
方案三:AWS Athena 查询CloudWatch Logs
若所有Lambda函数都开启了日志记录,可通过Athena反向筛选未生成日志的函数:
- 在Athena中创建CloudWatch Logs外部表(按AWS指引完成日志组映射配置)
- 执行查询获取近X天有调用日志的函数:
SELECT DISTINCT regexp_extract(log_stream, '/aws/lambda/(.+)', 1) AS function_name FROM your_cloudwatch_logs_table WHERE time >= current_timestamp - interval 'X' day
将查询结果与全量Lambda函数列表对比,不在结果中的即为未被调用的函数。
注意:此方法依赖日志开启状态,从未被调用的函数不会生成对应日志流,也会被纳入结果。
内容的提问来源于stack exchange,提问作者André Ferreira
相关产品推荐
相关产品推荐

