AWS Lambda это бессерверная вычислительная платформа от Amazon, часть Amazon Web Services (AWS). Суть такая: сервис выполняет код в ответ на события, при этом полностью управляет масштабированием ресурсов. Событиями могут быть запросы, cron-расписание и многое другое. С помощью AWS Lambda делают, наверное, все, что должно крутиться в облаке и что-то делать. По возрастанию сложности:
ETL-процессы
И даже тяжелые микросервисы
Для начинающих разработчиков или просто желающих попробовать бессерверный подход приятной неожиданностью станет довольно высокий уровень бесплатного доступа, который не ограничивается по времени. Каждый месяц 1 миллион запросов в AWS Lambda доступно бесплатно. Если вспомнить, что AWS также предоставляет до 25 ГБ бесплатного хранения данных в супер быстрой NoSQL базе данных DynamoDB, то предложение становится супер привлекательным для pet project’а или экспериментов.
![](https://habrastorage.org/getpro/habr/upload_files/3f8/656/daa/3f8656daabec6ff4195b6ef21b57e989.jpeg)
Сегодня я расскажу, как без лишних усилий настроить CI/CD pipeline из GitHub в AWS Lambda с помощью GitHub Actions. Логика такая — когда мы пушим изменения в master-ветку репозитория на GitHub они прорастают в AWS и обновляет продовую версию функции.
Регистрация на AWS.
Очевидно, первое, что необходимо сделать это зарегистрировать аккаунт AWS. Здесь подробно описано, как это сделать и ничего при этом не заплатить.
Создание функции.
Сделали аккаунт AWS, переходим к созданию функции.
Набираем в строке поиска ‘lambda’ и переходим в соответствующий раздел:
![](https://habrastorage.org/getpro/habr/upload_files/bf7/7dc/fb3/bf77dcfb36c6adcbf8d3d4450d60ab5a.jpeg)
Нажимаем ‘Create function’.
Function name = ‘habr_function’
Runtime = ‘Python 3.9’ или более поздняя версия.
![](https://habrastorage.org/getpro/habr/upload_files/75d/a4f/28c/75da4f28c4a91ddb5a5b892b34c60fcb.jpeg)
Готово, функция создана. На экране вы сможете видеть дефолтный код для функции. Его можно поменять прямо в браузере, но это очень неудобно. Гораздо лучше, чтобы этот код обновлялся автоматически при коммите в репозиторий. Это мы и сделаем.
![](https://habrastorage.org/getpro/habr/upload_files/dc8/b39/ade/dc8b39ade92b36724a8e568cdf12b0f5.jpeg)
Создание репозитория.
Создадим для этих нужд репозиторий на github.com:
![](https://habrastorage.org/getpro/habr/upload_files/2d0/e28/5e9/2d0e285e9af97669c6d407aece9fe0f5.jpeg)
Чтобы протестировать GitHub Actions создадим файл с помощью браузера. В дальнейшем вы сможете использовать любую удобную вам IDE, чтобы коммитить файлы в репозиторий.
![](https://habrastorage.org/getpro/habr/upload_files/b5f/789/66c/b5f78966c071885ea7bfe95228c9b208.jpeg)
Создадим новый файл lambda_function.py
, так как именно файл с таким названием по умолчанию выполняется в AWS Lambda:
![](https://habrastorage.org/getpro/habr/upload_files/270/17e/ef7/27017eef7b012b8b3be7227d393eca29.jpeg)
Немного модифицируем код из дефолтного значения 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, открыв боковое меню справа:
![](https://habrastorage.org/getpro/habr/upload_files/806/c89/7cb/806c897cb11f97f10af70e3ccf1df89f.jpeg)
Откроем раздел Access keys (access key ID and secret access key)
и нажмем Create New Access Key
:
![](https://habrastorage.org/getpro/habr/upload_files/474/915/661/4749156615a145990f7255c8fe0a059a.jpeg)
При нажатии на кнопку Download Key File
мы получаем .csv-файл с ключами. Его можно открыть с помощью любого текстового редактора или Microsoft Excel.
![](https://habrastorage.org/getpro/habr/upload_files/5dc/935/57a/5dc93557a7c3d98ccc1937d034100e8d.jpeg)
В файле будут два ключа Access key ID
и Secret access key
. Их нужно сохранить, они понадобятся нам в следующем этапе. Кроме того, нужно помнить, что ключи дают неограниченный доступ к части функционала вашего аккаунта AWS, в т. ч. к платным функциям. По этой причине их не стоит разглашать. Также не нужно хранить ключи в репозиториях на GitHub. (это распространенная ошибка)
Задаем 'секреты' в GitHub.
Возвращаемся на GitHub. Переходим в раздел Settings
нашего репозитория. Далее Secrets
-> Actions
-> New repository secret
. Этот раздел позволяет создавать 'секреты' в репозиториях GitHub. Именно здесь хранить ключи AWS наиболее безопасно. Отсюда ключи, токены или пароли могут быть безопасно использованы в процессах CI/CD и прочем.
![](https://habrastorage.org/getpro/habr/upload_files/5f9/a7d/2a6/5f9a7d2a61e9966978b33d73f5f647e9.jpeg)
Создаем новый секрет
с названием AWS_ACCESS_KEY_ID
. Значение берем из поля Access key ID
из полученного ранее .csv-файла с ключами:
![](https://habrastorage.org/getpro/habr/upload_files/a0c/b28/9ed/a0cb289ed20ad9dcf2b5ac2cb0fc853f.jpeg)
Аналогично создаем секрет
с именем AWS_SECRET_ACCESS_KEY
и заполняем значение ключем из поля Secret access key
из файла:
![](https://habrastorage.org/getpro/habr/upload_files/ad4/85a/9e1/ad485a9e157f37f27e9bae3d56262f92.jpeg)
Создаем конфиг процесса.
Переходим в раздел Actions
и нажимаем set up a workflow yourself
:
![](https://habrastorage.org/getpro/habr/upload_files/1d3/9db/869/1d39db869c84fdc2dbaced153a9d91d5.jpeg)
Дальше откроется редактор конфига процесса 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
:
![](https://habrastorage.org/getpro/habr/upload_files/1f7/372/e55/1f7372e55d6e3d43a949ccced79f222a.jpeg)
Как только создан новый файл процесс начинает работу, поскольку создание файла это тоже push-реквест. Чтобы наблюдать за ходом процесса переходим в раздел Actions
. Перейдем внутрь процесса, нажав на Update lambda_function.py
:
![](https://habrastorage.org/getpro/habr/upload_files/e8c/dde/77d/e8cdde77d46188bda0c4b3d81d1decae.jpeg)
Можем видеть как на серверах GitHub создается Unix-окружение, устанавливаются зависимости, а затем запускаются Shell-скрипты с нашими ключами и от нашего лица обновляют код лямбда-функции:
![](https://habrastorage.org/getpro/habr/upload_files/837/9a3/2fd/8379a32fde02bfce275a1bed6ad0b775.jpeg)
Когда все будет готово экран будет выглядеть следующим образом:
![](https://habrastorage.org/getpro/habr/upload_files/d1f/493/a7f/d1f493a7ff57f9120cc1d6bb6d0e6a2b.jpeg)
Переходим в AWS Lambda, видим изменившийся код и наш комментарий comment passed from GitHub Actions
.
Готово! Теперь все изменения из main-ветки репозитория попадают напрямую в AWS Lambda. Можно забыть про браузер и уходить в любимую IDE.
![](https://habrastorage.org/getpro/habr/upload_files/155/d04/27f/155d0427fc5fb29a3e892abdb91c2ff4.jpg)
Комментарии (4)
grossws
05.12.2022 00:25+6Не стоит создавать access key для root аккаунта (aws об этом пишет много где). Создайте отдельного юзера в IAM, настройте разумную политику для него и используйте ключи от его имени.
Ну а о самой "статье" сказать толком нечего, 100500ый туториал как создать какой-нибудь объект в aws и как создать репо на github с недотуториалом про actions.
iSeiryu
05.12.2022 04:05+2Следующей статьёй можно раскрыть Blue/Green deployment, endpoints versioning, rollbacks.
darken99
06.12.2022 12:37НЕ ДЕЛАЙТЕ ТАК!
Для таких вещей давно придумали токены и вот это вот все: https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-cloud-providers
Еще и ключи для рута создаете...И Action официальный, а не непонятно что и откуда: https://github.com/marketplace/actions/aws-lambda-deploy
iSeiryu
Следующей статьёй можно раскрыть Blue/Green deployment, endpoints versioning, rollbacks.