如何用AWS Lambda将JSON中的Size与fileCreatedAt指标发送至CloudWatch?
解决方案
原代码存在的核心问题
- 未读取并解析S3中的JSON内容,仅调用了
get_object但未提取数据 - 未遍历JSON中的
files数组,无法处理多条文件记录 - 未从JSON数据中提取
size和fileCreatedAt变量,直接引用会报错 fileCreatedAt为字符串类型,无法直接作为CloudWatch指标的数值使用- 缺少错误处理逻辑,无法排查发送失败问题
修正后的完整代码
import json import boto3 from datetime import datetime def lambda_handler(event, context): # 初始化AWS客户端 s3_client = boto3.client('s3') cw_client = boto3.client('cloudwatch') # 读取S3存储桶中的JSON文件 s3_response = s3_client.get_object(Bucket='myawsjsonbucket', Key='sample.json') # 解析JSON内容为Python字典 json_data = json.loads(s3_response['Body'].read().decode('utf-8')) # 批量存储待发送的指标数据 metric_data = [] # 遍历每个文件条目,生成对应指标 for file in json_data['files']: # 文件大小指标:以创建年份、数据源为维度,文件大小为数值 metric_data.append({ 'MetricName': 'FileSize', 'Dimensions': [ {'Name': 'FileCreatedYear', 'Value': file['fileCreatedAt']}, {'Name': 'DataSourceId', 'Value': file['dataSourceId']} ], 'Value': file['size'], 'Timestamp': datetime.now(), 'Unit': 'Bytes' }) # 按年份统计文件数量:以创建年份为维度,每次计数+1 metric_data.append({ 'MetricName': 'FileCountByYear', 'Dimensions': [{'Name': 'FileCreatedYear', 'Value': file['fileCreatedAt']}], 'Value': 1, 'Timestamp': datetime.now(), 'Unit': 'Count', 'StorageResolution': 60 }) # 批量发送指标到CloudWatch try: cw_response = cw_client.put_metric_data( Namespace='JSON/AWS', MetricData=metric_data ) print(f"指标发送成功: {cw_response}") return {'statusCode': 200, 'body': json.dumps('指标已成功发送至CloudWatch')} except Exception as e: print(f"指标发送失败: {str(e)}") return {'statusCode': 500, 'body': json.dumps(f"发送失败: {str(e)}")}
关键修正说明
- JSON解析:通过
read().decode('utf-8')读取S3对象内容,再用json.loads转为Python可操作的字典结构 - 批量处理:遍历所有文件条目,将所有指标收集到列表后一次性发送,减少API调用次数
- 指标规范:
- 针对
size:明确指定单位为Bytes,添加年份、数据源维度,方便后续多维度筛选分析 - 针对
fileCreatedAt:因是字符串年份,转为按年份统计文件数量的指标,通过CloudWatch的聚合功能实现计数
- 针对
- 错误处理:增加异常捕获,便于排查权限、网络等问题
额外注意事项
- 确保Lambda执行角色拥有
s3:GetObject和cloudwatch:PutMetricData权限 - 若
fileCreatedAt是完整时间戳格式(如2021-05-20T10:30:00),可通过datetime.strptime转为时间戳数值后作为指标值 - 本地调试时可直接读取本地JSON文件,替换S3读取逻辑
内容的提问来源于stack exchange,提问作者Meg
相关产品推荐
相关产品推荐

