Как оптимизировать функции AWS Lambda с помощью обеспеченного параллелизма и автоматического масштабирования
Функции AWS Lambda — это бессерверное решение для запуска кода в облаке без настройки собственных серверов.
Функции AWS Lambda — это бессерверное решение для запуска кода в облаке без настройки собственных серверов. Основным недостатком является то, что время инициализации может быть большим, что приводит к увеличению задержки. С помощью Provisioned Concurrency вы можете решить эту проблему.
Что такое обеспеченный параллелизм?
Лямбда-функции выполняются в собственной «среде выполнения», которая обычно запускается автоматически при выполнении запроса. После вызова функции среда будет оставаться «теплой» в течение примерно 5–15 минут, и код инициализации не придется запускать повторно.
Однако по истечении этого периода или если необходимо одновременно обслуживать несколько запросов, необходимо развернуть новую среду выполнения, что приводит к увеличению времени запуска, называемому «холодным запуском». Это особенно заметно в языках, которым при запуске требуется выполнять большой объем JIT-компиляции, таких как Java и .NET.
Чтобы решить эту проблему, в AWS есть функция Provisioned Concurrency, с помощью которой вы можете зарезервировать определенное количество сред выполнения, чтобы они были постоянно теплыми в течение дня. Это означает, что весь код инициализации выполняется заранее, и вам не придется испытывать холодный запуск.
Если вы полагаетесь на Lambda для обслуживания запросов пользователей, возможно, вам стоит рассмотреть возможность обеспечения параллелизма, даже если в конечном итоге это будет стоить немного дороже. Несмотря на то, что на холодный запуск обычно приходится только 1% запросов, эти 1% могут составлять секунды, потраченные на ожидание загрузки приложения, хотя это будет зависеть от времени выполнения и размера вашего кода.
Сколько стоит обеспеченный параллелизм?
В отличие от зарезервированных инстансов EC2, подготовленный параллелизм по-прежнему в основном представляет собой цену «плата за то, что вы используете», как и остальная часть Lambda. Вы платите небольшую плату за каждый час подготовки каждой среды, а затем платите за запросы Lambda, как обычно.
Однако, поскольку трафик на стороне AWS более предсказуем и дешевле не запускать код инициализации постоянно, стоимость вычислений для каждой функции для запросов, сделанных с обеспеченным параллелизмом, на самом деле ниже. Превышение лимита также не является недостатком — с вас просто будет взиматься стандартная плата за параллелизм.
В целом, обеспечение параллелизма может быть немного дешевле (около 5–10%), если у вас очень предсказуемый трафик и резервируется именно такая емкость. Однако в некоторых случаях это может быть немного дороже. Вам нужно будет проверить свою аналитику и подключить ее к калькулятору цен AWS Lambda, чтобы узнать больше.
Включение обеспеченного параллелизма
Включить подготовленный параллелизм довольно просто, но у него есть один недостаток: он не может указывать на версию $LATEST по умолчанию. Этот тег представляет собой псевдоним, который может меняться и не указывает на конкретную версию, а для обеспечения параллелизма необходимо зарезервировать конкретную версию. Итак, вам нужно опубликовать новую версию Lambda, если у вас ее еще нет:
Затем настройте псевдоним, указывающий на эту версию. Этот псевдоним можно обновить, что приведет к обновлению подготовленных сред.
После настройки псевдонима вы можете добавить новую конфигурацию параллелизма в настройках Lambda в разделе Конфигурация > Параллелизм. Вы также можете настроить это непосредственно в настройках псевдонима.
Настройки для обеспечения параллелизма просты: выберите псевдоним и введите сумму для предоставления.
Вы также можете установить и обновить это значение с помощью AWS API или CLI, который можно использовать для автоматизации в течение дня:
aws lambda put-provisioned-concurrency-config --function-name MyFunction \
--qualifier LatestProvisioned --provisioned-concurrent-executions 10
Автомасштабирование с обеспеченным параллелизмом
Поскольку предоставляемый параллелизм можно регулировать в течение дня, его также можно подключить к автоматическому масштабированию приложений AWS, чтобы корректировать его в зависимости от использования. Подключить это просто и требует всего лишь нескольких команд из интерфейса командной строки или API AWS, поскольку для этого пока нет консоли управления.
Сначала вам нужно зарегистрировать функцию Lambda в качестве цели масштабирования. Здесь вам нужно будет отредактировать имя функции (MyFunction) и псевдоним (LatestProvisioned), а также настроить минимальный и максимальный диапазоны емкости.
aws application-autoscaling register-scalable-target --service-namespace lambda \
--resource-id function:MyFunction:LatestProvisioned --min-capacity 2 --max-capacity 10 \
--scalable-dimension lambda:function:ProvisionedConcurrency
Затем вы можете включить политику автоматического масштабирования, используя имя функции и псевдоним в качестве идентификатора ресурса, и настроить ее с помощью политики масштабирования JSON. В этом примере задается масштабирование вверх и вниз, когда значение LambdaProvisionedConcurrencyUtilization
выше или ниже 70 %.
aws application-autoscaling put-scaling-policy --service-namespace lambda \
--scalable-dimension lambda:function:ProvisionedConcurrency --resource-id function:MyFunction:LatestProvisioned \
--policy-name my-policy --policy-type TargetTrackingScaling \
--target-tracking-scaling-policy-configuration '{ "TargetValue": 0.7, "PredefinedMetricSpecification": { "PredefinedMetricType": "LambdaProvisionedConcurrencyUtilization" }}'
Это не учитывает все случаи, например быстрые всплески использования, которые не длятся долго, но это хорошо работает для постоянного трафика и сэкономит вам деньги вечером, когда трафик низкий.