You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用AWS Lambda将JSON中的Size与fileCreatedAt指标发送至CloudWatch?

解决方案

原代码存在的核心问题

  1. 未读取并解析S3中的JSON内容,仅调用了get_object但未提取数据
  2. 未遍历JSON中的files数组,无法处理多条文件记录
  3. 未从JSON数据中提取size和fileCreatedAt变量,直接引用会报错
  4. fileCreatedAt为字符串类型,无法直接作为CloudWatch指标的数值使用
  5. 缺少错误处理逻辑,无法排查发送失败问题

修正后的完整代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 22:40:16