AWS Lambda
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

在 AWS Lambda 中检测 Python 代码

在 Python 中,您可以让 Lambda 向 X-Ray 发送子分段,显示您的函数对其他 AWS 服务进行的下游调用的相关信息。要执行此操作,首先需要在部署程序包中包含适用于 Python 的 AWS X-Ray 开发工具包。此外,您还可以修补 boto3 (或 botocore,如果您使用的是会话),以便您为了访问其他 AWS 服务而创建的任何客户端都将自动被 X-Ray 跟踪。

import boto3 from aws_xray_sdk.core import xray_recorder from aws_xray_sdk.core import patch patch(['boto3'])

您修补用于创建客户端的模块后,便可以使用它来创建您的被跟踪客户端,在下面的情况中 Amazon S3:

s3_client = boto3.client('s3')

适用于 Python 的 X-Ray 开发工具包为调用创建子分段,并记录请求和响应中的信息。您可以使用 aws_xray_sdk_sdk.core.xray_recorder 通过装饰 Lambda 函数自动创建子分段,或通过在函数内调用 xray_recorder.begin_subsegment()xray_recorder.end_subsegment() 手动创建子分段,如以下 Lambda 函数中所示。

import boto3 from aws_xray_sdk.core import xray_recorder from aws_xray_sdk.core import patch patch(['boto3']) s3_client = boto3.client('s3') def lambda_handler(event, context): bucket_name = event['bucket_name'] bucket_key = event['bucket_key'] body = event['body'] put_object_into_s3(bucket_name, bucket_key, body) get_object_from_s3(bucket_name, bucket_key) # Define subsegments manually def put_object_into_s3(bucket_name, bucket_key, body): try: xray_recorder.begin_subsegment('put_object') response = s3_client.put_object(Bucket=bucket_name, Key=bucket_key, Body=body) status_code = response['ResponseMetadata']['HTTPStatusCode'] xray_recorder.current_subsegment().put_annotation('put_response', status_code) finally: xray_recorder.end_subsegment() # Use decorators to automatically set the subsegments @xray_recorder.capture('get_object') def get_object_from_s3(bucket_name, bucket_key): response = s3_client.get_object(Bucket=bucket_name, Key=bucket_key) status_code = response['ResponseMetadata']['HTTPStatusCode'] xray_recorder.current_subsegment().put_annotation('get_response', status_code)

注意

适用于 Python 的 X-Ray 开发工具包能让您修补以下模块:

  • botocore

  • boto3

  • 请求

  • sqlite3

  • mysql

您可以使用 patch_all() 来同时将它们全部修补。

以下是上述代码发送的跟踪的样子 (同步调用):