在 AWS Lambda 中检测 Python 代码 - AWS Lambda
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

在 AWS Lambda 中检测 Python 代码

Lambda 与 AWS X-Ray 集成使您能够跟踪、调试和优化 Lambda 应用程序。您可以在请求遍历应用程序中的资源(从前端 API 到后端的存储和数据库)时,使用 X-Ray 跟踪请求。只需将 X-Ray 开发工具包库添加到构建配置中,就可以记录您的函数对 AWS 服务进行的任何调用的错误和延迟。

X-Ray 服务地图显示了通过您的应用程序的请求流。来自错误处理器示例应用程序的以下示例显示了具有两个函数的应用程序。主函数处理事件,有时会返回错误。次函数处理主函数的日志组中显示的错误,并使用 AWS 开发工具包来调用 X-Ray、Amazon S3 和 Amazon CloudWatch Logs。


          Service map showing nodes for Lambda functions, X-Ray, Amazon S3 and CloudWatch Logs

要跟踪没有跟踪标头的请求,请在函数的配置中启用活动跟踪。

启用活动跟踪

  1. 打开 Lambda 控制台 函数页面

  2. 选择函数。

  3. AWS X-Ray 下,选择 Active tracing (活动跟踪)

  4. 选择保存

定价

X-Ray 有一款永久免费套餐。超出免费套餐阈值后,X-Ray 会对跟踪存储和检索进行收费。有关详细信息,请参阅 AWS X-Ray 定价

您的函数需要权限才能将跟踪数据上传到 X-Ray。在 Lambda 控制台中启用活动跟踪后,Lambda 会将所需权限添加到函数的执行角色。如果没有,请将 AWSXRayDaemonWriteAccess 策略添加到执行角色。

X-Ray 应用采样算法确保跟踪有效,同时为应用程序所服务的请求提供代表性样本。默认采样规则是每秒 1 个请求和 5% 的其他请求。无法为 Lambda 函数配置此采样率。

启用活动跟踪后, Lambda 会记录对调用子集的跟踪。 Lambda 会记录两个片段,从而在服务地图上创建两个节点。第一个节点表示接收调用请求的 Lambda 服务。第二个节点由函数的运行时记录。


      具有单个函数的 X-Ray 服务地图。

您可以使用处理程序代码来记录元数据并跟踪下游调用。要记录有关您的处理程序对其他资源和服务进行调用的详细信息,请使用适用于 Python 的 X-Ray 开发工具包。要获取开发工具包,请将 aws-xray-sdk 包添加到应用程序的依赖项中。

blank-python/function/requirements.txt

jsonpickle==1.3 aws-xray-sdk==2.4.3

要检测 AWS 开发工具包客户端,请使用 aws_xray_sdk.core 模块修补 boto3 库。

blank-python/function/lambda_function.py – 跟踪 AWS 开发工具包客户端

import boto3 from aws_xray_sdk.core import xray_recorder from aws_xray_sdk.core import patch_all logger = logging.getLogger() logger.setLevel(logging.INFO) patch_all() client = boto3.client('lambda') client.get_account_settings() def lambda_handler(event, context): logger.info('## ENVIRONMENT VARIABLES\r' + jsonpickle.encode(dict(**os.environ))) ...

以下示例显示了一个具有 2 个分段的跟踪。两个分段都被命名为 my-function,但是其中一个为 AWS::Lambda 类型,另一个为 AWS::Lambda::Function 类型。将函数分段展开可显示其子分段。

第一个分段表示由 Lambda 服务处理的调用请求。第二个分段记录由函数完成的工作。函数分段有 3 个子分段。

  • 初始化 – 表示加载函数和运行初始化代码所花费的时间。此子分段仅对于由函数的每个实例处理的第一个事件才显示。

  • 调用 – 表示处理程序代码完成的工作。通过检测您的代码,您可以使用额外的子分段来扩展此子分段。

  • 开销 – 表示 Lambda 运行时为准备处理下一个事件而完成的工作。

您还可以分析 HTTP 客户端、记录 SQL 查询以及使用注释和元数据创建自定义子段。有关更多信息,请参阅 AWS X-Ray 开发人员指南 中的适用于 Python 的 X-Ray 开发工具包

使用 Lambda API 启用主动跟踪

要使用 AWS CLI 或 AWS 开发工具包管理跟踪配置,请使用以下 API 操作:

以下示例 AWS CLI 命令对名为 my-function 的函数启用主动跟踪。

$ aws lambda update-function-configuration --function-name my-function \ --tracing-config Mode=Active

跟踪模式是发布函数版本时锁定的版本特定配置的一部分。您无法更改已发布版本上的跟踪模式。

使用 AWS CloudFormation 启用主动跟踪

要对 AWS CloudFormation 模板中的 AWS::Lambda::Function 资源启用活动跟踪,请使用 TracingConfig 属性。

function-inline.yml – 跟踪配置

Resources: function: Type: AWS::Lambda::Function Properties: TracingConfig: Mode: Active ...

对于 AWS 无服务器应用程序模型 (AWS SAM) AWS::Serverless::Function 资源,请使用 Tracing 属性。

template.yml – 跟踪配置

Resources: function: Type: AWS::Serverless::Function Properties: Tracing: Active ...

在层中存储运行时依赖项

如果您使用 X-Ray 开发工具包来分析 AWS 开发工具包客户端和您的函数代码,则您的部署程序包可能会变得相当大。为了避免每次更新函数代码时上传运行时依赖项,请将它们打包到 Lambda 层中。

以下示例显示存储适用于 Python 的 X-Ray 开发工具包的 AWS::Serverless::LayerVersion 资源。

template.yml – 依赖项层

Resources: function: Type: AWS::Serverless::Function Properties: CodeUri: function/. Tracing: Active Layers: - !Ref libs ... libs: Type: AWS::Serverless::LayerVersion Properties: LayerName: blank-python-lib Description: Dependencies for the blank-python sample app. ContentUri: package/. CompatibleRuntimes: - python3.8

使用此配置,只有在更改运行时依赖项时才会更新库层。函数部署包仅包含您的代码。当您更新函数代码时,上传速度比在部署包中包含依赖项要快得多。

为依赖项创建层需要更改构建才能在部署之前生成层存档。有关工作示例,请参阅 blank-python 示例应用程序。