Рубрики
Uncategorized

Deploy AWS Lambda функции с AWS-SAM-CLI и Travis-Ci

Развертывание AWS Lambda с AWS-SAM-CLI и Travis-Ci. Tagged с DevOps, ShowDev, AWS, Serverless.

(Эта статья первоначально появилась на моем сайте: 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-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»