如何克服AWS的冷启动问题?

时间:2019-04-18 09:09:04

标签: python django amazon-web-services zappa cold-start

我使用zappa在AWS中对api(Django应用程序)感到沮丧。我面临冷启动问题。启动应用程序大约需要7-8秒(代码接近25 MB)。如何克服此问题?

在zappa settings.json中,我保留了 keep_warm = true ,但没有用。 我已经编写了lambda函数来使用计划cloudwatch event触发api,它正在触发(我可以在zappa日志中看到),但问题尚未解决。

我的处理程序的示例代码是:

import json
def lambda_handler(event, context):
# TODO implement
return {
    'statusCode': 200,
    'body': json.dumps('Hello from Lambda!')
}

我的zappa配置是:

{
    "dev": {
        "aws_region": "ap-south-1",
        "django_settings": "api.settings",
        "profile_name": "default",
        "project_name": "api-public",
        "runtime": "python3.6",
        "s3_bucket": "api-public",
        "slim_handler": true,
        "vpc_config" : {
            "SubnetIds": [ "subnet-052347e86b94b75d3" ], // use the private subnet
            "SecurityGroupIds": [ "sg-0ba3a644d413a2b00","sg-0db0b6de5b14cda33"]
        },
        "xray_tracing": true,// Optional, enable AWS X-Ray tracing on your lambda function.
        "memory_size": 1024, // Lambda function memory in MB. Default 512.
        "log_level": "DEBUG", // Set the Zappa log level. Can be one of CRITICAL, ERROR, WARNING, INFO and DEBUG. Default: DEBUG
        "keep_warm": true, // Create CloudWatch events to keep the server warm. Default true. To remove, set to false and then `unschedule`.
        "timeout_seconds": 300,
        "keep_warm_expression": "rate(3 minutes)", // How often to execute the keep-warm, in cron and rate format. Default 4 minutes.
        "exclude": [
            ".git/*",
            ".gitignore",
            "boto3*",
            "*botocore*",
            "django-debug-toolbar*",
            "sqlparse*",
            "zappa_settings.json",
            "README.md"
        ],
        "lambda_description": "zappa deployment public", // However you want to describe your project for the AWS console. Default "Zappa Deployment".
        "extra_permissions": [{ // Attach any extra permissions to this policy. Default None
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction", 
            "Resource": ["arn:aws:lambda:ap-east-1:940180048916:function:api-public-dev"],// AWS Service ARN
        }],
    }
}

4 个答案:

答案 0 :(得分:0)

可以包含您的Zappa配置吗?这是一个在设置文件的上下文中应如何使用keep_warm的示例,其中包括更多设置:

{
    "production": {
        "aws_region": "us-east-1",
        "django_settings": "config.zappa",
        "profile_name": "zappa",
        "project_name": "mydomain",
        "runtime": "python3.6",
        "s3_bucket": "zappa-mydomain",
        "certificate_arn": "arn:aws:acm:us-east-1:272727272727:certificate/eeeeeeee-dddd-cccc-bbbb-aaaaaaaaaaaa",
        "domain": "mydomain.com",
        "exclude": [
                ".git/*",
                ".gitignore",
            "boto3*",
            "*botocore*",
            "django-debug-toolbar*",
            "sqlparse*",
            "zappa_settings.json",
            "README.md"
        ],
        "keep_warm": true,
        "timeout_seconds": 300
    }
}

祝你好运!

答案 1 :(得分:0)

定期匹配是一种简单的技术,但是对于同时请求却无济于事。一个lamdba实例一次只能处理一个请求。我不确定如何使用zappa精确地执行此操作。但是有希望的解决方案是使用docker检查点

https://www.imperial.ac.uk/media/imperial-college/faculty-of-engineering/computing/public/1819-ug-projects/StenbomO-Refunction-Eliminating-Serverless-Cold-Starts-Through-Container-Reuse.pdf

当然ou可以使内存翻倍。它不会使费用增加一倍,因为请求会更快地处理。

我还幻想添加zappa奇特的策略,例如默认运行便宜的1M实例,但是检测冷启动并重定向到3M实例或bean,但是对于django之类的超大型框架,检查点似乎更有希望。

答案 2 :(得分:0)

如果您需要保持Django应用程序的温暖,请使用错误的方式使用AWS Lambda函数进行启动。 (请相信我,亲身经历)

AWS Lambda函数的创建是为了向世界部署轻量级函数。您的Django应用是有史以来最重的功能。

AWS Lambda专为寿命只有几分之一秒的应用程序而设计。 25 MB本身本身就是Lambda函数的巨大负担。

请考虑使用轻量级框架作为Flask。不要克服Lambda函数。他们不是为了那个。

改为使用AWS ECS。

答案 3 :(得分:-1)

从技术上讲,如果我们可以接受这是AWS lambda函数限制之一的事实,那么这不是问题。

这里的主要问题是,由于这种限制(延迟),我们强迫自己使用lambda显然不符合要求。

在这种情况下,如果我们使用lambda的话,就是这个问题

  • 将lambda函数保持一定时间会很昂贵!超级昂贵且显然lambda(容器)的设计工作不像那个家伙!

我建议不要使用lambda正常工作的方式并要花很多钱,我建议您使用EC2作为您的Web服务器(API),并在其之上进行自动扩展和负载平衡。

在这种方法中,响应从API返回 -会更快,因为您的api处于唤醒状态并正在等待任何请求 -比在lambda上便宜,因为lambda会为您的Lambda执行的每GB计算时间收取$ 0.00001667美元,想象一下您的lambda醒着10分钟:)

希望这会有所帮助! :)

干杯! 猴子