【问题标题】:Using aws-lambda-powertools-python with python class lambda将 aws-lambda-powertools-python 与 python 类 lambda 一起使用
【发布时间】:2021-04-13 02:51:38
【问题描述】:

我正在尝试为我们团队编写的未来 lambdas 提出一个很好的模式。

其中一个目标是尝试向一些团队成员教授面向对象的开发,所以我想在这里使用这种模式。我在其他真正的 lambda 上运行良好,但尝试添加有用的库 'aws-lambda-powertools-python' 我遇到了一些问题。

Lambda 代码:

from aws_lambda_powertools import Logger

logger = Logger()


class LambdaExample:
    @classmethod
    def get_handler(cls, *args, **kwargs):
        """Get handler"""
        def handler(event, context):
            return cls(*args, **kwargs).handle(event, context)

        return handler

    @logger.inject_lambda_context(log_event=True)
    def handle(self, event, context):
        logger.info("Hello World")


lambda_handler = LambdaExample.get_handler()

The docs for powertools 有一个 pytest 的代码示例。他们的代码示例虽然不是一个完整的文件,但似乎假定 lambda 处理程序是一个独立的函数而不是一个类方法。我试图适应它:

from collections import namedtuple
import pytest
from lambda_example import LambdaExample

@pytest.fixture
def lambda_context():
    lambda_context = {
        "function_name": "test",
        "memory_limit_in_mb": 128,
        "invoked_function_arn": "arn:aws:lambda:eu-west-1:809313241:function:test",
        "aws_request_id": "52fdfc07-2182-154f-163f-5f0f9a621d72",
    }

    return namedtuple("LambdaContext", lambda_context.keys())(*lambda_context.values())

class TestLambdaHandler:

    def test_handle_will_pass_when_env_setup(self, lambda_context):
        # Given
        test_event = {'test': 'event'}
        lambda_handler = LambdaExample()
        # When
        lambda_handler.handle(test_event, lambda_context)

我得到的结果是:

>       lambda_handler.handle(test_event, lambda_context)
E       TypeError: decorate() takes 2 positional arguments but 3 were given

如果我从处理程序方法中删除这一行,一切正常: "@logger.inject_lambda_context(log_event=True)"

问题似乎是装饰器不适用于方法上的 'self' 参数。

关于如何进行的任何想法?

【问题讨论】:

  • 为什么要使用面向对象的包装器来混淆非 OO Lambda 函数调用?
  • 在这个简单的例子中没有显示,但在一个完整的例子中,lambda 对象正在实例化依赖项并将它们连接在一起。基本上是依赖注入的简单实现。由于依赖类不需要解决它们自己的依赖关系,因此测试它们更容易。我也更喜欢这种模式,而不是使用全局变量在多个 lambda 调用中重用资源

标签: python amazon-web-services aws-lambda


【解决方案1】:

想通了。这是一个像这样移动注释的简单案例:

from aws_lambda_powertools import Logger

logger = Logger()


class LambdaExample:
    @classmethod
    def get_handler(cls, *args, **kwargs):
        """Get handler"""
        @logger.inject_lambda_context(log_event=True)
        def handler(event, context):
            return cls(*args, **kwargs).handle(event, context)

        return handler

    def handle(self, event, context):
        logger.info("Hello World")


lambda_handler = LambdaExample.get_handler()

然后在测试类中调用它的方式与 lambda 相同:

    lambda_handler = LambdaExample.get_handler()
    response = lambda_handler(test_event, lambda_context)

【讨论】:

    猜你喜欢
    • 2016-07-08
    • 2023-04-08
    • 2017-07-07
    • 1970-01-01
    • 1970-01-01
    • 2016-02-14
    • 2016-10-10
    • 2022-12-14
    • 1970-01-01
    相关资源
    最近更新 更多