Вызов функции Django внутри AWS Lambda

#django #amazon-web-services #aws-lambda

#django #amazon-веб-сервисы #aws-lambda

Вопрос:

Я хочу перенести некоторую нагрузку на обработку из моего приложения Django на AWS Lambda.

Я вызываю свой код из лямбды следующим образом:

lambda.py:

 @bc_lambda(level=logging.INFO, service=LAMBDA_SERVICE)
def task_handler(event, context):
    message = event["Records"][0]["body"]
    renderer = get_renderer_for(message)
    result = renderer.render()
    return result
  

get_renderer_for это фабричный метод, который возвращает экземпляр класса Renderer :

 from myproject.apps.engine.documents import (
    DocumentsLoader,
    SourceNotFound,
    source_from_version,
)
from myproject.apps.engine.environment import Environment

class Renderer:
    def __init__(self, message):
        self.message = message

    def render(self):
        ENVIRONMENT = Environment(DocumentsLoader())
        version_id = self.message.get("version_id")

        try:
            source = source_from_version(version_id)
        except SourceNotFound:
            source = None

        template = ENVIRONMENT.from_string(source)

        if template:
            return template.render(self.message)

        return None


def get_renderer_for(message):
    """
    Factory method that returns an instance of the Renderer class
    """
    return Renderer(message)
  

В CloudWatch я вижу, что получаю эту ошибку: module initialization error. Apps aren't loaded yet.

Я понимаю, что Django недоступен для функции Lambda, верно? Как я могу это исправить? Как я могу сделать остальную часть проекта доступной для лямбда-функции?

Ответ №1:

Единственными двумя библиотеками, которые Lambda поддерживает из коробки, являются стандартная библиотека и boto3.

Существует несколько способов установки внешних библиотек Python для использования в Lambda. Я рекомендую загружать их как лямбда-слой. Это хорошее руководство: https://medium.com/@qtangs/creating-new-aws-lambda-layer-for-python-pandas-library-348b126e9f3e