AWS Lambda это бессерверная вычислительная платформа от Amazon, часть Amazon Web Services (AWS). Суть такая: сервис выполняет код в ответ на события, при этом полностью управляет масштабированием ресурсов. Событиями могут быть запросы, cron-расписание и многое другое. С помощью AWS Lambda делают, наверное, все, что должно крутиться в облаке и что-то делать. По возрастанию сложности: 

Для начинающих разработчиков или просто желающих попробовать бессерверный подход приятной неожиданностью станет довольно высокий уровень бесплатного доступа, который не ограничивается по времени. Каждый месяц 1 миллион запросов в AWS Lambda доступно бесплатно. Если вспомнить, что AWS также предоставляет до 25 ГБ бесплатного хранения данных в супер быстрой NoSQL базе данных DynamoDB, то предложение становится супер привлекательным для pet project’а или экспериментов. 

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

  1. Регистрация на AWS.

Очевидно, первое, что необходимо сделать это зарегистрировать аккаунт AWS. Здесь подробно описано, как это сделать и ничего при этом не заплатить.

  1. Создание функции.

Сделали аккаунт AWS, переходим к созданию функции. 

Набираем в строке поиска ‘lambda’ и переходим в соответствующий раздел:

Нажимаем ‘Create function’.

Function name = ‘habr_function’

Runtime = ‘Python 3.9’ или более поздняя версия. 

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

  1. Создание репозитория.

Создадим для этих нужд репозиторий на 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!')

    }

  1. Получаем ключи 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. (это распространенная ошибка) 

  1. Задаем 'секреты' в 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 из файла:

  1. Создаем конфиг процесса. 

Переходим в раздел 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. Добавляйтесь!