Рубрики
Без рубрики

Моя боль с сервезой и aws лямбда

Я хочу поделиться своей историей с неправильным развитием в AWS Lambda и Python. Tagged с серверусным, AWS, Lambda, Python.

Совсем недавно я должен работать с безмерно на aws lambda. Это отличная технология, и я люблю идею не управлять и обеспечивать базовые серверы. Я делаю много программирования в Python, и, к счастью, aws lambda поставляется с промежуточным временем Python. Serverless Framework – отличный способ начать; это то, о чем я думал… Вот моя история с неверным развитием в AWS Lambda и Python и некоторые из моих болей.

Возможно, вы слышали термин Смертный Какая технология, в которой вам не волнуются управляющие серверами и ее базовой инфраструктурой. Тем не менее, они там, но вы заботитесь о сервер меньше Отказ У меня недавно была задача, где мне нужно было развернуть функцию глубокой обучения с Tensorflow и Керас Отказ Наши данные ученые передали мне его прогнозировать – Функция, и мне нужно было изготовить ее. Так хорошо до сих пор. Я думал об использовании Смертная рамка Развернуть эту функцию на AWS. Во время настройки с помощью Виртуальский Я столкнулся с моей первой проблемой. После гугула я узнал, что библиотека поддерживает в настоящее время Python3.7 И у меня установлен Python3.8. Хм… Хорошо, нет проблем, я буду использовать Докер вместо.

cd /path/to/my/project
docker run -it --name tensorflow -v $(pwd):/root/home imagehash bash

Docker-image поставляется с Пип из коробки.

# Installing Tensorflow
pip install tensorflow==1.15

# Installing Keras
pip install Keras==2.2.5

Обратите внимание, что я не бегу Виртуальский Здесь, потому что я сейчас в новом контейнере для свежего докера с нулевыми пакетами. Итак, я удалил его. Я также знаю, что есть решение Для использования Tensorflow с Python 3.8, но положите это в требования .txt 😉 Мы должны придерживаться Стабильная версия Отказ

Сейчас было время, чтобы развернуть его на AWS. Это означает, что нам нужно создать обработчик. К счастью, Смертная рамка поставляется с шаблоном Python

# Python
sls create --template aws-python3 --name name-of-service --path path/to/store
# Note: sls is short for serverless, both are possible

Эта команда генерирует Handler.py Для вашей функции и Serverless.yml Для Serverless Setup. После удаления всех комментариев и изменив время выполнения Python, он выглядит следующим образом

service: aws-python

    provider:
      name: aws
      runtime: python3.8

    functions:
      hello:                    # 1st hello function name for AWS
        handler: handler.hello  # 1st handler tells sls where to look for a handler         
                                # 2nd handler is the Python file
                                # 2nd hello is the function inside the Python file

У меня все еще есть проблемы с пониманием части функций и его ключей и как вызывать функцию. Я надеюсь, что получил это правильно, как описано выше. Когда я запустил бессвесовую рамку, у меня было что-то вроде

functions:
      handler:
        handler: handler.handler # Brainf*ck 🤪

Во всяком случае, теперь я готов развернуть, запустив команду

# Requirement: AWS Cli must be installed
sls deploy

и выполнить его со своим ведомством

sls invoke -f handler --log
# Output
[ERROR] Runtime.ImportModuleError: Unable to import module 'tensorflow'

Хм, похоже, AWS не работает PIP Установка -R. требования .txt Отказ Что странно, потому что этот файл также развернут. Это раздражает, но есть плагин для этого.

sls plugin install -n serverless-python-requirements

Это создает package.json и а Node_Modules Поскольку Servelless Framework записана в JavaScript и Node. Хорошо, теперь мы должны быть готовы к работе 💪

sls deploy
# Error
An error occurred: UploadLambdaFunction - Unzipped size must be smaller than 262144000 bytes (Service: AWSLambdaInternal; Status Code: 400; Error Code: InvalidParameterValueException; Request ID: c3b94dc7-6a06-11e9-8823-bb373647997a).

Что?? 😱 262144000 BYTES, Ага Это ошибка, которую вы получаете. Теоретически, вы могли бы загрузить 0 байтов (я не знаю, как это возможно 😅), я думаю, вот почему сообщение в байтах. В других условиях функция должна быть не более 262 МБ. Ну, мой Handler.py IS 4 KB и проект всего с Serverless Framework и его плагином 5 МБ.

Это должно быть зависимыми причинами требования .txt Отказ Этот плагин должен что-то делать, и он устанавливает весь Tensorflow и Keras Library! И угадайте, какой Tensorflow уже ~ 500 МБ большой 😱.

Хорошо, Безсекретный питон-требования может иметь дело с ограничениями размеров лямбда.

custom:
  pythonRequirements:
    zip: true

И до Handler.py. Я должен был вставить следующий фрагмент кода, чтобы расстегнуть требования:

try:
  import unzip_requirements
except ImportError:
  pass

Это создает unzip_requirorements.py также. Тем не менее, лямбда становится еще больше …

custom:
  pythonRequirements:
    zip: true
    slim: true # This had been added.

И угадайте, что, это все еще не удается Это все еще слишком большой … После гугула я нашел отличный всеобъемлющий Блог пост и я применил изменения (без докеризепип хотя)

custom:
  pythonRequirements:
    dockerizePip: non-linux
    zip: true
    slim: true
    noDeploy:
      - boto3
      - botocore
      - docutils
      - jmespath
      - pip
      - python-dateutil
      - s3transfer
      - setuptools
      - six
      - tensorboard
package:
  exclude:
    - node_modules/**
    - model/**
    - .vscode/**

ET VOILA, у нас внезапно появится ZIP-файл с 150 МБ. Всякий раз, когда мы устанавливаем пакет из пипс Мы также устанавливаем свои зависимости. И часто мы устанавливаем неосознанно тяжелые пакеты, такие как Numpy или Scipy Отказ С уныние Мы опускаем конкретные пакеты из развертывания. Список выше является стандартным списком, который уже встроен в Lambda, а также Tensorboard.

Чтобы вызвать функцию, нам нужно запустить

sls invoke --function name-of-function

И, конечно, это не удается 😭

{
  "errorMessage": "[Errno 28] No space left on device",
  "errorType": "OSError",
    ..
}

Локально я запускал его на моем Mac с 8-ядром Intel Core I9 и 16 ГБ ОЗУ. На AWS я использовал максимальную память о 3008 МБ. Ну, лямбда не смогла запустить свою функцию науки о данных. В конце концов, я положил это в контейнер докеров и отправил эту функцию для AWS.

AWS разработал вычислительный процесс и разработка приложений с лямбдасом. Безвенно родился. Тем не менее, он не идеален для каждого случая использования. Вы заимствуете некоторую вычислительную силу, где у вас нет никакого влияния на мощность или ресурсы. То есть во многих случаях достаточно, но когда речь идет о обработке изображения или использования обширной библиотеки, вы можете перевернуть ваше использование серверу.

AWS разработал вычислительный процесс и разработка приложений с лямбдасом. Безвенно родился. Тем не менее, он не идеален для каждого случая использования. Вы заимствуете некоторую вычислительную силу, где у вас нет никакого влияния на мощность или ресурсы. То есть во многих случаях достаточно, но когда речь идет о обработке изображения или использования обширной библиотеки, вы можете перевернуть ваше использование серверу.

Я не говорю, что не буду использовать это. На самом деле, у меня есть много успешных историй, чтобы сказать, и я люблю серверусны 💓 Это просто не так просто, как все хвалят. Вам все еще нужно знать, что за обработчик , размер лямбда и вычислительная мощность вам нужна. Вам нужно настроить во многих таких местах, как Ямл – файлы (ы), AWS регион, потому что не каждый регион одинаково, и зависимости ваших зависимостей. Может быть, это действительно зависит от языка. У меня была меньше боли с узлом, чем с Python. Независимо от того, что начало, это много попыток и ошибок, которая также является трудоемким и может быть расстраивающим.

Тем не менее, Смертный Является ли мой первый выбор при разработке сервиса, и я думаю, что после многих ИБП и Даунс у вас будет лучшее чувство, когда его использовать и когда нет.

Оригинал: “https://dev.to/jolo/my-pain-with-serverless-and-aws-lambda-4hko”