Как преодолеть проблему холодного старта в aws? - PullRequest
0 голосов
/ 18 апреля 2019

Я установил api (приложение Django) в AWS, используя zappa. Я столкнулся с проблемой холодного старта. Запуск приложения занимает около 7-8 секунд (код около 25 МБ). Как решить эту проблему?

В zappa settings.json я сохранил keep_warm = true , но бесполезно. Я написал лямбда-функцию для запуска API с помощью планирования события cloudwatch, оно запускается (я вижу в журналах 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
        }],
    }
}

Ответы [ 2 ]

0 голосов
/ 10 июля 2019

Технически, это не проблема, если мы можем принять тот факт, что это одно из ограничений лямбда-функции AWS.

Основная проблема здесь заключается в том, что мы заставляем себя использовать лямбда, которая явноне соответствуют требованиям из-за этого ограничения (задержки).

Проблема, если мы используем лямбду для этого случая, заключается в следующем:

  • поддержание функции лямбда в течение определенного времени будет дорого!супер дорогой и, очевидно, лямбда (контейнер) не предназначен для работы, как этот чувак!

Вместо того, чтобы пройти путь, как лямбда обычно работает и стоит вам много денег, я хотел бы предложить использоватьEC2 как ваш веб-сервер (API) с автоматическим масштабированием и балансировкой нагрузки поверх него.

При таком подходе ответ от API будет намного быстрее, потому что ваш API не спит и ждет любогозапрос - дешевле, чем у вас на лямбде, потому что лямбда взимает $ 0,00001667 за ГБ-секунду вычислительного времени, которое выполняет ваша лямбда, представьте, что ваша лямбда не спит в течение 10 минут:)

Надеюсь, это поможет!:)

Ура!Обезьяны

0 голосов
/ 18 апреля 2019

Можете ли вы включить конфигурацию 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
    }
}

Удачи!

...