首页 > 解决方案 > 使用 pytest 设置的 Lambda 处理程序上下文 aws_request_id

问题描述

我可以在 pytest 中模拟事件测试lambda_handler(event, context) 但无法测试上下文,并且仅从上下文中使用 aws_request_id。我正在尝试跟随。

context = {
            'aws_request_id': 'abcdef',
            'log_stream_name': '1f73402ad',
            'invoked_function_arn': 'arn:aws:lambda:region:1000:function:TestCFStackNam-TestLambdaFunctionResourceName-ABC-1234F',
            'client_context': None,
            'log_group_name': '/aws/lambda/TestCFStackName-TestLambdaFunctionResourceName-ABC-1234F',
            'function_name': 'TestCloudFormationStackName-TestLambdaFunctionResourceName--ABC-1234F',
            'function_version': '$LATEST',
            'identity': '<__main__.CognitoIdentity object at 0x1fb81abc00>',
            'memory_limit_in_mb': '128'
}


lambda_handler(event, context)
aws_request_id = context.aws_request_id

Error - 

  AttributeError: 'dict' object has no attribute 'aws_request_id'

标签: pythonamazon-web-servicesaws-lambdapytestboto3

解决方案


AWS Lambda 上下文对象不是字典。aws_request_id不是字典键,它是上下文对象的属性。将您的模拟修改为字典将导致您的代码在作为实际 Lambda 函数运行时中断。解决此问题的正确方法是确保您的模拟对象是实际 Lambda 上下文对象的真实再现。

您可以编写一个简单的类并aws_request_id在其上设置属性,如下所示:

class LambdaContext:
  aws_request_id = 'abcdef'

# ...

context = LambdaContext()

aws_request_id = context.aws_request_id

推荐阅读