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

无需登录AWS控制台在Web应用中查看AWS API Gateway CloudWatch日志方案咨询

完全可以通过AWS官方SDK调用CloudWatch Logs API实现自定义日志查询,无需登录AWS控制台即可在自有应用内展示支持多维度筛选的日志列表。

解决方案

前置配置要求

  • 首先确认API Gateway的CloudWatch日志已配置完整的可筛选字段:至少包含请求用户身份(如Cognito用户ID、IAM身份ID或自定义请求头用户标识)、请求时间、HTTP状态码、请求路径、请求方法等你需要的筛选维度。如果当前日志缺少对应字段,可以到API Gateway对应阶段的日志设置中调整日志格式,添加$context.identity.cognitoIdentityId、$context.status、$context.path这类上下文变量即可。
  • 为应用后端服务分配最小必要IAM权限,仅需开通logs:StartQuery、logs:GetQueryResults、logs:DescribeLogGroups三个操作权限,无需分配其他多余CloudWatch操作权限。
  • 提前确认API Gateway对应的CloudWatch日志组名称,默认格式为API-Gateway-Execution-Logs_{rest-api-id}/{stage-name},可在AWS控制台CloudWatch日志组列表中核实。

实现逻辑

使用CloudWatch Logs Insights查询接口,可直接传入用户ID、日期范围、请求状态等筛选条件,异步获取查询结果后即可格式化渲染到前端数据网格,完整流程如下:

  1. 前端将用户选择的筛选条件(用户ID、起止日期、请求状态码、请求路径等)提交到应用后端
  2. 后端将筛选条件拼接为符合CloudWatch Logs Insights语法的查询语句,调用StartQuery接口提交查询任务,获取查询ID
  3. 间隔1-3秒轮询调用GetQueryResults接口,直到查询状态返回完成
  4. 将返回的结构化日志字段格式化后返回给前端,渲染为支持筛选、排序的数据网格

代码示例(Python boto3 SDK,其他语言SDK逻辑完全一致)

首先安装依赖:
pip install boto3

示例代码:

import boto3
import time
from datetime import datetime

# 初始化CloudWatch Logs客户端,AWS凭证建议通过环境变量、EC2/IAM角色等方式配置,禁止硬编码
cw_logs_client = boto3.client('logs', region_name='替换为你的AWS区域编码,如cn-north-1')

def get_apigw_logs(user_id=None, start_dt: datetime = None, end_dt: datetime = None, status_code=None, log_group_name='替换为你的API Gateway对应日志组名称'):
    # 转换日期为CloudWatch要求的毫秒级Unix时间戳
    start_ts = int(start_dt.timestamp() * 1000)
    end_ts = int(end_dt.timestamp() * 1000)

    # 基础查询语句,可根据实际日志字段调整返回字段
    base_query = """
    fields @timestamp, userIdentity, httpMethod, path, status, sourceIp, responseLatency
    | sort @timestamp desc
    """

    # 拼接筛选条件
    filters = []
    if user_id:
        filters.append(f'userIdentity = "{user_id}"')
    if status_code:
        filters.append(f'status = {status_code}')
    
    if filters:
        full_query = f"{base_query} | {' and '.join(filters)}"
    else:
        full_query = base_query

    # 提交查询任务
    query_resp = cw_logs_client.start_query(
        logGroupName=log_group_name,
        startTime=start_ts,
        endTime=end_ts,
        queryString=full_query,
        limit=1000 # 单次查询返回最大日志条数,可按需调整
    )
    query_id = query_resp['queryId']

    # 轮询获取查询结果
    query_result = None
    while not query_result or query_result['status'] == 'Running':
        time.sleep(1)
        query_result = cw_logs_client.get_query_results(queryId=query_id)

    # 格式化结果为前端易处理的字典结构
    formatted_logs = []
    for log_entry in query_result['results']:
        log_item = {}
        for field in log_entry:
            log_item[field['field']] = field['value']
        formatted_logs.append(log_item)
    
    return formatted_logs

注意事项

  • 单日日志量过大的场景,建议缩小查询时间范围,避免查询超时,或实现分页查询逻辑
  • CloudWatch Logs Insights有默认配额限制:单账号每秒最多提交1个查询,最多同时运行30个并发查询,业务量大的场景可提前申请提升配额
  • 所有CloudWatch API调用必须通过应用后端代理,禁止直接在前端调用AWS SDK或暴露AWS凭证,避免安全风险

内容的提问来源于stack exchange,提问作者Robert

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 01:06:04