(Эта статья первоначально появилась на моем сайте: mikevanbuskirk.io )
Поскольку неверные вычисления попадают в набор инструментов для большего количества инженеров и разработчиков, необходимость оптимизированной разработки и вариантов развертывания растет в важности. Эта серия из 2 частей поделится основным рабочим процессом, который я разработал для разработки и развертывания функций без серверов в AWS.
В этом рабочем процессе будут использоваться в значительной степени повсеместные, свободные платформы, предлагаемые GitHub и Travis-Ci для контроля версий и CI, соответственно, но он может быть адаптирован к более широкому разнообразию венчурных и CI/CD-платформ.
Это будет статья из 2 частей. Первая часть закончится тем, что у нас есть местная среда разработки с инструментом AWS-Sam-Cli, а также основной, работающий пример функции AWS Lambda.
Во -первых, давайте посмотрим на необходимые предпосылки.
Предварительные условия
Эта серия будет принять некоторые базовые знания по таким темам, как AWS, и без серверных функций. В идеале у читателя уже есть несколько функций AWS Lambda под их поясом, и он ищет более оптимизированный и автоматизированный способ их развертывания.
Также предполагается, что существует некоторое базовое знакомство и опыт работы с системами управления версиями, в частности, GIT/GitHub.
Этот рабочий процесс был выполнен на MacBook Pro, работающем OSX 10.12 (Sierra). Установка инструментов для различных платформ, таких как Linux или Windows, может немного различаться.
Инструменты и услуги, которые вам нужны, следующие:
- А AWS У вас есть разрешение на программное развертывание ресурсов к
- Учетная запись на GitHub.com
- Учетная запись на Travis-Ci.org
- Последний Python 2.7
- Docker CE
- Современная установка Инструмент AWS-SAM-CLI
Обратите внимание, что инструмент AWS-SAM-CLI, ключевая часть рабочего процесса, требует локальных, достоверных учетных данных пользователя AWS. Они обычно развернуты на рабочей станции как часть установки инструмента AWS CLI. Идите вперед и следуйте этим инструкциям, если у вас еще нет этой настройки:
Если у вас возникли проблемы с установкой каких -либо упомянутых инструментов, проверьте проблемы с документацией или GitHub для данного проекта. Не стесняйтесь публиковать в комментариях, и я сделаю все возможное, чтобы помочь.
Отказ от ответственности : Любые ресурсы AWS, которые вы предоставляете в ходе этого учебника, могут привести к оплате сборов на ваш счет. Автор не несет никакой ответственности, законной или иной, за понесенные обвинения.
Что мы делаем? Почему?
Я кратко затронул это во введении в статью: Без серверные вычисления процветают. Легко увидеть привлекательность, представленную платформой. Больше нет управления серверами, обновлениями ОС и правил брандмауэра. Дискретные, эфемерные, конечные куски вычислительных ресурсов, которые могут быть активированы по требованию. Зачем платить за экземпляр сервера, чтобы сидеть и запускать сценарий каждые 24 часа, когда функция без сервера может делать то же самое для доли затрат и накладных расходов на обслуживание?
Однако с новыми моделями использования возникают новые проблемы. Как вы разрабатываете и тестируете локально? Как сделать разработку без сервера частью вашего рабочего процесса CI/CD?
Первый вопрос прост: инженеры в AWS разработали великий Инструмент с AWS-SAM-CLI Анкет Он предлагает невероятно оптимизированные и простые в способе разработки, тестирования и предоставления функций AWS Lambda. Обеспечение живых ресурсов происходит через SAM и AWS CloudFormation.
А как насчет второй части? Что если вы хотите пойти еще дальше и автоматизировать тестирование и развертывание ваших функций? Введите Travis-Ci Анкет Если вы не знакомы, Travis-Ci предоставляет бесплатный инструмент непрерывной интеграции и тестирования, который является мощным и простым в использовании.
Как я уже упоминал ранее, это будет довольно упрощенный рабочий процесс, но основные концепции, продемонстрированные здесь, могут быть перенесены в различные инструменты VCS и CI/CD по мере необходимости.
Для функции без сервера мы будем развертывать какой -то базовый код Python, который генерирует список активных экземпляров EC2. Я предоставлю ссылку на полный исходный код через GitHub, если вы хотите использовать это в качестве примера, но не стесняйтесь переносить свой собственный код функции в этот урок.
Давайте перейдем к созданию нашей среды разработки и нашей функции.
Создайте репозиторий GitHub
Первое первое место: нам нужно создать репозиторий GitHub для хранения кода нашего проекта, а также для интеграции с Travis-Ci. Я создал свой репо Здесь Анкет
Если у вас уже есть учетная запись GitHub и Travis-Ci, отлично! Если нет, то еще не беспокойтесь о том, чтобы настроить его, мы коснемся этого чуть позже.
Создать функцию лямбды
Если вы хотите использовать пример Function Function, которую я создал, загрузите эта папка в ваш рабочий каталог.
Вы можете просмотреть встроенный код ниже. __init__.py
Файл пуст и используется для указания на Python, что каталог содержит пакеты.
import boto3 import json import datetime client = boto3.client('ec2') response = client.describe_instances( Filters=[ { 'Name': 'instance-state-name', 'Values': [ 'running' ] } ], MaxResults=100 ) def get_id(instances): """ returns a list of EC2 instances that are in the 'running' state, return object is a list of dicts """ running_instances = [] for instance in instances["Reservations"][0]["Instances"]: running_instances.append({'Instance ID': instance['InstanceId']}) if not running_instances: print("No running instances detected!") else: return running_instances def dt_converter(d): """ converts datetime objects to string objects """ if isinstance(d, datetime.datetime): return d.__str__() def encoder(j): """ dumps json objects to strings so any datetime objects can be converted to compatible strings before reloading as json again """ return json.loads(json.dumps(j, default = dt_converter)) def my_handler(event, context): """ lambda event handler that returns the list of instances """ return encoder(get_id(response))
Это очень упрощенная функция, без обработки ошибок. Основная цель здесь состоит в том, чтобы продемонстрировать потенциал использования инструментов CI/CD для оптимизации без серверной разработки.
Создайте шаблон SAM
Локальный инструментарий SAM требует определения шаблона SAM. Шаблон — это файл YAML, который используется для определения определенных аспектов того, как будет функционировать вашу инфраструктуру без сервера.
Дополнительная документация об использовании доступна на AWS-Sam-Cli Repo Анкет
Файл доступен для загрузки в репо, упомянутом выше. Код также предоставлен встроенный ниже:
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: Lists active EC2 instances Resources: GetInstances: Type: AWS::Serverless::Function Properties: Handler: getinstances.getinstances.my_handler Timeout: 300 Runtime: python3.6
AWS предоставляет хорошую документацию по различным компонентам шаблона SAM Здесь Анкет Я расскажу о соответствующих частях шаблона ниже:
Ресурсы:
— Обозначение «ресурсов» на высшем уровне, которые мы хотим обеспечить с шаблоном. В этом случае это просто лямбда -функция.GetInstances:
— имя функции. Это ссылается при использованииСэм
Инструмент, чтобы вызвать функцию.Тип:
— тип ресурса. В этом случаеAws:: serverless:: function
.Свойства:
— обозначает последующие значения свойства для текущего уровня ресурсов.Обработчик:
— Вот где происходит магия. Свойство «обработчика» указывает на фактический модуль, содержащий код вашей функции. Работая справа налево:my_handler
— Имя обработчика событий в самом коде.GetInstances
— относится к модулю/файлуGetInstances.py
АнкетGetInstances
— Самый левый индекс, он относится к папке, в которой содержится код модуля.
Тайм -аут:
— Целостное значение, в считанные секунды, которое определяет, как долго функция может ждать, прежде чем произойдет тайм -аут.Время выполнения:
— Определяет среду выполнения кода функции. В этом случае я выбралPython3.6
Анкет
Затем мы создадим образец полезной нагрузки события, чтобы вызвать функцию Lambda.
Генерировать образец полезной нагрузки
В случае AWS функции Lambda часто запускаются через какой -то тип «события». Различные сервисы AWS генерируют события, которые действительны для запуска функции. Полезные нагрузки на события — это структуры данных JSON, которые предоставляют конкретную информацию об их происхождении и цели.
Инструмент AWS-Sam-Cli предоставляет Потрясающая функция Это позволяет пользователям генерировать Mock Event Mailyles для локальной разработки и тестирования.
Для целей этой статьи мы создадим фиктивное событие от запланированных событий CloudWatch. Эти события функционируют аналогично системе Linux Cron, и стреляют по предварительно определенным значениям графика.
Запустите следующую команду в рабочем каталоге вашего репо:
SAM Local Generate-Event Grade> Event.json
Вывод сохраняется в Event.json
Файл, чтобы его можно было повторно использовать для вызова функции по мере необходимости.
На этом этапе выглядит структура папок моего проекта репо:
get-active-ec2-instances |-- README.md |-- event.json |-- getinstances | |-- __init__.py | `-- getinstances.py `-- template.yaml
Имена ваших файлов или папок могут немного отличаться, но, по крайней мере, у вас должен быть код модуля, файл шаблона и фиктивное событие. Если все выглядит хорошо, давайте перейдем к тестированию функции Lambda.
Проверьте функцию Lambda
Моя любимая особенность инструмента SAM — это возможность вызывать функции локально. Больше не нужно загружать функции в AWS и тестирование их вживую, чтобы увидеть, работают ли они правильно.
Запустите следующую команду в рабочем каталоге вашего репо:
SAM Local вызывал «GetInStances» -e Event.json
Если это ваш первый вызов с этим конкретным временем выполнения, инструмент потребуется некоторое время, чтобы загрузить изображение Docker из удаленного репо. После того, как инструмент сообщает об идентификаторе запроса и данных вызовов, вывод вашей функции будет предоставлен (если он генерирует читаемый вывод).
В этом случае образец кода генерирует список активных экземпляров EC2, что будет показано так:
[{«ID экземпляра»: «I-0123456789ABCDEF»}, {«ID экземпляра»: «I-1011121314GHIJKLM»} …]
Если код не обнаружит никаких запущенных экземпляров, вы получите этот вывод вместо этого:
Не обнаружены экземпляры!
Если вы столкнетесь с какие -либо ошибки, проверьте документацию AWS для общих случаев неудачи. Я склонен обнаружить, что большинство моих ошибок связаны с аутентификацией/проблемами учетных данных. Не стесняйтесь публиковать в комментариях, если вы боретесь.
Что дальше
Теперь у нас есть отличная местная среда разработки, созданная для разработки и развертывания функций без серверов для AWS. Но мы не закончили.
Во второй части мы собираемся использовать инструмент Travis-Ci для создания интегрированного тестирования и развертывания, настроенных для нашей функции Lambda.
Быть в курсе!
Оригинал: «https://dev.to/codevbus/deploy-aws-lambda-functions-with-aws-sam-cli-and-travis-ci-3m9m»