0

我正在尝试找到一种方法将我们公司的 Django Web 应用程序集成到 Zappa 中,这样我们就可以使用我们的 REST API 完全无服务器。问题是我们的应用程序已经存在了好几年,这使得它比所有这些 Zappa 教程初始化的全新应用程序要重得多。Zappa 是否需要将旧的 Django 应用程序集成到其框架中的格式?我迫不及待地想知道 Zappa 需要进行多少重构才能知道如何将我们的 API 转换为 lambda 函数。当我尝试在我们的根目录中运行 Zappa deploy 时,我收到以下错误,这可能意味着我们的应用程序针对 Zappa 系统的优化很差:

Traceback (most recent call last):
  File "/home/ubuntu/SkalaControl/env/lib/python3.7/site-packages/zappa/cli.py", line 896, in deploy
    function_name=self.lambda_name
  File "/home/ubuntu/SkalaControl/env/lib/python3.7/site-packages/zappa/core.py", line 1520, in get_lambda_function
    response = self.lambda_client.get_function(FunctionName=function_name)
  File "/home/ubuntu/SkalaControl/env/lib/python3.7/site-packages/botocore/client.py", line 386, in _api_call
    return self._make_api_call(operation_name, kwargs)
  File "/home/ubuntu/SkalaControl/env/lib/python3.7/site-packages/botocore/client.py", line 705, in _make_api_call
    raise error_class(parsed_response, operation_name)
botocore.errorfactory.ResourceNotFoundException: An error occurred (ResourceNotFoundException) when calling the GetFunction operation: Function not found: arn:aws:lambda:us-east-1:253119149513:function:src-dev

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ubuntu/SkalaControl/env/lib/python3.7/site-packages/zappa/cli.py", line 3422, in handle
    sys.exit(cli.handle())
  File "/home/ubuntu/SkalaControl/env/lib/python3.7/site-packages/zappa/cli.py", line 588, in handle
    self.dispatch_command(self.command, stage)
  File "/home/ubuntu/SkalaControl/env/lib/python3.7/site-packages/zappa/cli.py", line 630, in dispatch_command
    self.deploy(self.vargs["zip"], self.vargs["docker_image_uri"])
  File "/home/ubuntu/SkalaControl/env/lib/python3.7/site-packages/zappa/cli.py", line 930, in deploy
    self.lambda_arn = self.zappa.create_lambda_function(**kwargs)
  File "/home/ubuntu/SkalaControl/env/lib/python3.7/site-packages/zappa/core.py", line 1225, in create_lambda_function
    response = self.lambda_client.create_function(**kwargs)
  File "/home/ubuntu/SkalaControl/env/lib/python3.7/site-packages/botocore/client.py", line 386, in _api_call
    return self._make_api_call(operation_name, kwargs)
  File "/home/ubuntu/SkalaControl/env/lib/python3.7/site-packages/botocore/client.py", line 705, in _make_api_call
    raise error_class(parsed_response, operation_name)
botocore.errorfactory.InvalidParameterValueException: An error occurred (InvalidParameterValueException) when calling the CreateFunction operation: Unzipped size must be smaller than 262144000 bytes
4

1 回答 1

1

Zappa 的主要用途之一是允许将现有的 Django 项目迁移到 AWS Lambda。因此,将 REST API 转变为无服务器是 Zappa 的一个极好的用例。此外,Zappa 通常与旧版本的 Django 兼容。

您遇到的问题是AWS Lambda 函数必须小于 50MB 压缩和 250MB 未压缩

Zappa 提供了一种解决方法,使用slim_handler允许您的项目接近 512MB 未压缩的选项。

要确定当前项目需要多少未压缩的磁盘空间,您可以运行以下 Zappa 命令:

zappa package <name of your environment>

Zappa 会为你的 Django 项目生成一个 zip 文件。然后您可以解压缩 zip 文件并确定磁盘空间要求。

如果您需要超过 512MB 的磁盘空间,那么您唯一的选择是使用最近引入的AWS Lambda Container Image Support功能(至少在编写此答案时)。Zappa版本 0.53.0支持此功能。Zappa 文档中还没有关于如何利用它的说明,因此现在可以在Ian Whitestone 的博客中找到最好的指南。

关于 AWS Lambda 的性能和现有 Django 应用程序的“重量”主题。将您的 Django 应用程序放在 AWS Lambda 环境中就像在汽车中安装一个更大的引擎。您可能会发现您的 Django 应用程序在 AWS 中的性能更好。

于 2021-06-27T21:01:02.530 回答