簡體   English   中英

如何使用 Zappa 解決 AWS Lambda 中的冷啟動問題?

[英]How to overcome cold start issue in AWS Lambda with Zappa?

我已經使用 zappa 在 AWS 中部署了 api(Django 應用程序)。 我面臨冷啟動問題。 啟動應用程序需要將近 7-8 秒(代碼將近 25 MB)。如何克服這個問題??

在 zappa settings.json 中,我保留了 keep_warm=true但沒有用。 我已經編寫了 lambda 函數來使用調度 cloudwatch 事件觸發 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
        }],
    }
}

如果您需要為 Django 應用程序保暖,那么您一開始就以錯誤的方式使用了 AWS Lambda 函數。 (相信我,個人經驗)

AWS Lambda 函數的創建是為了將輕量級函數部署到世界上。 你的 Django 應用程序是有史以來最重的(最)功能。

AWS Lambda 專為生命周期為幾分之一秒的應用程序而設計。 25 MB 本身對 Lambda 函數來說是一個巨大的負載。

考慮改用 Flask 這樣的輕量級框架。 不要克服 Lambda 函數。 他們不是為了那個。

請改用 AWS ECS。

你能包括你的 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
    }
}

祝你好運!

從技術上講,如果我們可以接受這是 AWS lambda 函數限制之一這一事實,這就不是問題。

這里的主要問題是,由於該限制(延遲),我們強迫自己使用顯然不符合要求的 lambda。

如果我們在這種情況下使用 lambda 的問題是,

  • 讓 lambda 函數在一定時間內保持活動狀態會很昂貴! 超級昂貴,顯然 lambda(容器)不是設計成像那個家伙那樣工作的!

與其通過 lambda 通常的工作方式並花費你很多錢,我想建議使用 EC2 作為你的 web serer (API),在它之上自動縮放和負載平衡。

在這種方法中,來自 API 的響應會更快,因為你的 api 處於喚醒狀態並等待任何請求 - 比你在 lambda 上使用它更便宜,因為 lambda 對你的 Lambda 執行的計算時間每 GB-秒收取 0.00001667 美元,想象你的 lambda 醒了 10 分鍾:)

希望這可以幫助: :)

干杯! 猴子

周期性點擊是簡單的技術,但它對同時請求的情況沒有幫助。 一個 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-重用.pdf

當然你可以加倍內存。 它不會加倍計費,因為請求會得到更快的處理。

我也有點幻想在 zappa 中添加奇特的策略,比如默認運行 1M 的 cheep 實例,但檢測冷啟動並重定向到 3M 的實例或 bean,但檢查點似乎更適合像 django 這樣的超大型框架。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM