如何批量获取100+ AWS Lambda函数的最后执行时间?
批量获取AWS Lambda函数最后执行时间的解决思路
方法一:通过CloudWatch Metrics批量查询(推荐)
Lambda的Invocations指标会记录每次调用的时间,无需依赖日志流,直接通过CloudWatch Metrics即可获取最近一次调用的时间戳。
实现步骤:
- 调用Lambda API获取所有函数列表
- 对每个函数,构造CloudWatch Metrics查询,筛选
AWS/Lambda命名空间下的Invocations指标,按FunctionName维度过滤,取最新的数据点时间 - 对没有调用记录的函数,标记为「从未执行」
示例boto3脚本:
import boto3 from datetime import datetime def get_lambda_last_invoked(): 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']) results = [] for func in functions: func_name = func['FunctionName'] try: # 查询最近365天的Invocations指标最新数据点 response = cloudwatch_client.get_metric_data( MetricDataQueries=[ { 'Id': 'invocations', 'MetricStat': { 'Metric': { 'Namespace': 'AWS/Lambda', 'MetricName': 'Invocations', 'Dimensions': [ { 'Name': 'FunctionName', 'Value': func_name } ] }, 'Period': 86400, 'Stat': 'Sum' }, 'ReturnData': True } ], StartTime=datetime.now() - datetime.timedelta(days=365), EndTime=datetime.now(), ScanBy='TimestampDescending' ) last_invoked = response['MetricDataResults'][0]['Timestamps'][0].strftime('%Y-%m-%d %H:%M:%S') if response['MetricDataResults'][0]['Timestamps'] else '从未执行' except Exception as e: last_invoked = f'查询失败: {str(e)}' results.append({ 'FunctionName': func_name, 'LastInvokedTime': last_invoked }) # 输出结果 for res in results: print(f"函数名: {res['FunctionName']}, 最后执行时间: {res['LastInvokedTime']}") if __name__ == '__main__': get_lambda_last_invoked()
方法二:通过CloudTrail事件查询
如果你的AWS账号开启了CloudTrail,可以查询lambda.Invoke事件的最新记录,获取函数最后被调用的时间。注意CloudTrail日志默认保留90天,且可能存在一定延迟。
示例boto3脚本片段:
def get_last_invoke_from_cloudtrail(func_name): cloudtrail_client = boto3.client('cloudtrail') response = cloudtrail_client.lookup_events( LookupAttributes=[ { 'AttributeKey': 'EventName', 'AttributeValue': 'Invoke' }, { 'AttributeKey': 'ResourceName', 'AttributeValue': func_name } ], MaxResults=1, StartTime=datetime.now() - datetime.timedelta(days=90) ) return response['Events'][0]['EventTime'].strftime('%Y-%m-%d %H:%M:%S') if response['Events'] else '90天内无调用记录或未开启CloudTrail'
注意事项
- 确保执行脚本的IAM角色拥有对应权限:方法一需要
lambda:ListFunctions、cloudwatch:GetMetricData;方法二需要cloudtrail:LookupEvents - 若函数调用频率极低,可将CloudWatch Metrics的
Period值调小(比如60秒),避免遗漏最新调用 - 从未执行过的函数,两种方法都会返回「无记录」标记
内容的提问来源于stack exchange,提问作者Naxxio
相关产品推荐
相关产品推荐

