使用Lambda授权器自定义AWS API Gateway日志

作者:API传播员 · 2026-01-13 · 阅读时间:6分钟
本文详细介绍了如何使用Lambda授权器自定义AWS API Gateway日志,重点讲解从JWT令牌中提取用户ID和角色等信息以丰富访问日志,并通过配置自定义日志格式和利用CloudWatch Logs Insights进行分析,提升API监控和审计能力。

使用 Lambda 授权器自定义 AWS API Gateway 日志

亚马逊 API 网关是一项完全托管的服务,能够轻松创建、发布、维护、监控和保护各种规模的 API。API 网关的一个重要功能是生成详细的日志,这使开发人员可以高效地监控和诊断 API。然而,默认日志可能无法涵盖所有必要的信息,尤其是在使用 Lambda 授权器等自定义授权器时。

本文将探讨如何通过 Lambda 授权器自定义 AWS API Gateway 的日志,重点介绍如何从 JWT 令牌中提取信息以丰富访问日志。


什么是 Lambda 授权器?

Lambda 授权器是一种灵活且强大的方法,用于控制 API 网关对 API 的访问。当客户端向 API 发出请求时,API 网关会调用您提供的 Lambda 函数来进行授权。此 Lambda 函数通过自定义逻辑评估请求,并返回一个策略文档,指示请求是被允许还是被拒绝。此外,Lambda 授权器还可以通过上下文信息丰富该策略,这些信息会传递回 API 网关,并可包含在请求上下文中。

在基于令牌的身份验证(如 JWT 令牌)中,这一功能尤为有用。通过将 Lambda 授权器与 JWT 令牌验证集成,您可以从令牌中提取信息并将其包含在授权策略上下文中。这种丰富的上下文信息可以用于定制 API 网关日志,为每个请求提供更有价值的洞察。


从 JWT 令牌提取信息并构建策略上下文

以下示例展示了如何从传入请求中提取 JWT 令牌,并利用其信息构建策略上下文:

def lambda_handler(event, context):

# 从请求中提取 JWT 令牌
    jwt_token = event['authorizationToken']# 解码 JWT 令牌并提取相关信息
    decoded_token = decode_jwt(jwt_token)
    user_id = decoded_token['sub']
    user_role = decoded_token['role']# 构建包含额外信息的授权器策略上下文
    policy_context = {
        'userid': user_id,
        'role': user_role
    }# 返回授权器策略上下文
    return response_policy("Allow", user_id, policy_context)

在上述代码中,policy_context 字典包含了需要传递回 API 网关的额外信息,例如从 JWT 令牌中提取的用户 ID 和角色。


构建授权器响应

Lambda 授权器函数的响应包括以下内容:

  • 主体 ID(通常为用户 ID)
  • 一个策略文档,指示请求是否被允许
  • 包含额外信息的上下文对象

以下是生成响应的示例代码:

def response_policy(action, principal_id, context):
    return {
        'principalId': principal_id,
        'policyDocument': {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Action": "execute-api:Invoke",
                    "Effect": action,
                    "Resource": "*"
                }
            ]
        },
        'context': context
    }

通过将 JWT 令牌中的相关信息丰富到授权器策略上下文中,您可以提升 API 网关日志的细粒度和实用性,为每个请求提供更深入的洞察,并支持更复杂的访问控制策略。


配置自定义日志

启用日志捕获

首先,需要在 Amazon API Gateway 中启用日志捕获。可以通过 AWS 管理控制台或 AWS CLI 完成此操作:

  1. 选择需要配置的 API。
  2. 导航到“日志记录”设置。
  3. 启用日志记录并选择日志的目标位置,例如 Amazon CloudWatch Logs。

自定义日志格式

启用日志捕获后,可以自定义日志格式以包含自定义声明(custom claims)。这些声明通过 $context.authorizer 访问,同时还可以包括其他标准字段,例如请求方法、资源路径和响应状态码。

以下是一个示例日志格式:

{
    "requestId": "$context.requestId",
    "ip": "$context.identity.sourceIp",
    "user": "$context.authorizer.userid",
    "role": "$context.authorizer.role",
    "httpMethod": "$context.httpMethod",
    "resourcePath": "$context.resourcePath",
    "statusCode": "$context.status"
}

分析和利用自定义日志

配置好自定义日志后,您可以使用 Amazon CloudWatch Logs Insights 等工具分析日志,过滤自定义声明,并识别 API 使用中的模式或异常。这些日志不仅有助于监控 API 流量,还能为优化访问控制策略提供支持。


总结

通过 Lambda 授权器自定义 AWS API Gateway 日志,您可以显著提升对 API 访问的监控和审计能力。将 JWT 令牌中的信息集成到日志中,能够提供更详细的请求视图,并帮助您采取主动措施,确保应用的安全性和性能。

希望本文能帮助您更好地理解如何使用 Lambda 授权器自定义 API Gateway 日志,并利用 JWT 令牌信息增强 API 的监控和诊断能力。


参考资料

  1. Amazon API Gateway 概述
  2. API Gateway 的 Lambda 授权器
  3. 自定义 API Gateway 访问日志
原文链接: https://medium.com/@msoares.araujo/customizing-aws-api-gateway-logs-with-lambda-authorizer-dbe5c60c4b97