AWS Lambda это бессерверная вычислительная платформа от Amazon, часть Amazon Web Services (AWS). Суть такая: сервис выполняет код в ответ на события, при этом полностью управляет масштабированием ресурсов. Событиями могут быть запросы, cron-расписание и многое другое. С помощью AWS Lambda делают, наверное, все, что должно крутиться в облаке и что-то делать. По возрастанию сложности:
ETL-процессы
И даже тяжелые микросервисы
Для начинающих разработчиков или просто желающих попробовать бессерверный подход приятной неожиданностью станет довольно высокий уровень бесплатного доступа, который не ограничивается по времени. Каждый месяц 1 миллион запросов в AWS Lambda доступно бесплатно. Если вспомнить, что AWS также предоставляет до 25 ГБ бесплатного хранения данных в супер быстрой NoSQL базе данных DynamoDB, то предложение становится супер привлекательным для pet project’а или экспериментов.

Сегодня я расскажу, как без лишних усилий настроить CI/CD pipeline из GitHub в AWS Lambda с помощью GitHub Actions. Логика такая — когда мы пушим изменения в master-ветку репозитория на GitHub они прорастают в AWS и обновляет продовую версию функции.
Регистрация на AWS.
Очевидно, первое, что необходимо сделать это зарегистрировать аккаунт AWS. Здесь подробно описано, как это сделать и ничего при этом не заплатить.
Создание функции.
Сделали аккаунт AWS, переходим к созданию функции.
Набираем в строке поиска ‘lambda’ и переходим в соответствующий раздел:

Нажимаем ‘Create function’.
Function name = ‘habr_function’
Runtime = ‘Python 3.9’ или более поздняя версия.

Готово, функция создана. На экране вы сможете видеть дефолтный код для функции. Его можно поменять прямо в браузере, но это очень неудобно. Гораздо лучше, чтобы этот код обновлялся автоматически при коммите в репозиторий. Это мы и сделаем.

Создание репозитория.
Создадим для этих нужд репозиторий на github.com:

Чтобы протестировать GitHub Actions создадим файл с помощью браузера. В дальнейшем вы сможете использовать любую удобную вам IDE, чтобы коммитить файлы в репозиторий.

Создадим новый файл lambda_function.py
, так как именно файл с таким названием по умолчанию выполняется в AWS Lambda:

Немного модифицируем код из дефолтного значения AWS Lambda, чтобы понять, когда он обновится:
import json
def lambda_handler(event, context):
# comment passed from GitHub Actions
return {
'statusCode': 200,
'body': json.dumps('Hello from GitHub Actions!')
}
Получаем ключи AWS.
Чтобы обновлять код в AWS нам нужно дать GitHub доступ к нашему аккаунту. Для этого используются специальные ключи. Получим ключи AWS. Для этого перейдем в Security credentials
с любой страницы AWS, открыв боковое меню справа:

Откроем раздел Access keys (access key ID and secret access key)
и нажмем Create New Access Key
:

При нажатии на кнопку Download Key File
мы получаем .csv-файл с ключами. Его можно открыть с помощью любого текстового редактора или Microsoft Excel.

В файле будут два ключа Access key ID
и Secret access key
. Их нужно сохранить, они понадобятся нам в следующем этапе. Кроме того, нужно помнить, что ключи дают неограниченный доступ к части функционала вашего аккаунта AWS, в т. ч. к платным функциям. По этой причине их не стоит разглашать. Также не нужно хранить ключи в репозиториях на GitHub. (это распространенная ошибка)
Задаем 'секреты' в GitHub.
Возвращаемся на GitHub. Переходим в раздел Settings
нашего репозитория. Далее Secrets
-> Actions
-> New repository secret
. Этот раздел позволяет создавать 'секреты' в репозиториях GitHub. Именно здесь хранить ключи AWS наиболее безопасно. Отсюда ключи, токены или пароли могут быть безопасно использованы в процессах CI/CD и прочем.

Создаем новый секрет
с названием AWS_ACCESS_KEY_ID
. Значение берем из поля Access key ID
из полученного ранее .csv-файла с ключами:

Аналогично создаем секрет
с именем AWS_SECRET_ACCESS_KEY
и заполняем значение ключем из поля Secret access key
из файла:

Создаем конфиг процесса.
Переходим в раздел Actions
и нажимаем set up a workflow yourself
:

Дальше откроется редактор конфига процесса GitHub Actions. Необходимо заполнить его с помощью кода ниже:
name: deploy-py-lambda
on:
push:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- name: Deploy code to Lambda
uses: mariamrf/py-lambda-action@v1.0.0
with:
lambda_function_name: 'habr_example_function'
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
AWS_DEFAULT_REGION: 'us-east-2'
В коде процесса мы указываем, что хотим выполнять процесс как только происходит push в main ветку нашего репозитория. Также мы указываем имя нашей фукнции habr_example_function
, регион AWS us-east-2
и передаем ключи из 'секретов' GitHub Actions с помощью конструкции вида ${{ secrets.AWS_ACCESS_KEY_ID }}
.
В GitHub предусмотрен механизм для переиспользования действий, поэтому в конфиге мы указываем, что берем код из этого репозитория. В этом репозитории добрый человек за нас прописал последовательность Shell-скриптов, которые нужно выполнить, чтобы обновить код AWS Lambda из командной строки.
Когда все готово нажимаем Start commit
-> Commit new file
:

Как только создан новый файл процесс начинает работу, поскольку создание файла это тоже push-реквест. Чтобы наблюдать за ходом процесса переходим в раздел Actions
. Перейдем внутрь процесса, нажав на Update lambda_function.py
:

Можем видеть как на серверах GitHub создается Unix-окружение, устанавливаются зависимости, а затем запускаются Shell-скрипты с нашими ключами и от нашего лица обновляют код лямбда-функции:

Когда все будет готово экран будет выглядеть следующим образом:

Переходим в AWS Lambda, видим изменившийся код и наш комментарий comment passed from GitHub Actions
.
Готово! Теперь все изменения из main-ветки репозитория попадают напрямую в AWS Lambda. Можно забыть про браузер и уходить в любимую IDE.

Публикую ссылки на все мои материалы у себя в LinkedIn. Добавляйтесь!