Гид по технологиям

CI/CD для AWS Lambda: отслеживание функций через Git и развертывание через CodePipeline

• 5 min read • DevOps • Обновлено 21 Nov 2025
CI/CD для Lambda: Git + CodePipeline
CI/CD для Lambda: Git + CodePipeline

Логотип AWS Lambda

  • Разрабатывайте Lambda локально, храните код в Git, а сборку и деплой автоматизируйте через CodePipeline → CodeBuild → CloudFormation/SAM.
  • SAM (Serverless Application Model) описывает инфраструктуру в YAML и нужен для корректного развертывания серверлес-ресурсов.
  • В CodePipeline используйте стадию сборки для упаковки артефактов и стадию деплоя через CloudFormation (создание change set и его исполнение).

Быстрые ссылки

  • Как работает CI/CD для Lambda
  • Настройка системы контроля версий
  • Написание SAM-шаблона
  • Упаковка и деплой проекта через CodePipeline

Важно: редактор в консоли Lambda удобен для быстрой отладки и экспериментов, но не подходит для управляемого рабочего процесса. Для стабильных релизов нужен Git + автоматизация.

Введение

Lambda предоставляет встроенный онлайн-редактор, который часто используют при обучении или при быстрых правках. Однако для серьёзных проектов такой подход не обеспечивает истории изменений, ревью, тестирования и повторяемости развертываний. Лучше разрабатывать локально, версионировать код в Git и строить CI/CD-пайплайн, который будет автоматически собирать и выкатывать функции.

В этой статье описаны практические шаги по переходу от ручного редактирования к CI/CD-процессу, включая примеры SAM-шаблонов, buildspec и роль IAM. Также приведены чек-листы, сценарии отката, критерии приёмки и подсказки по отладке ошибок.

Как работает CI/CD для Lambda

Коротко: вы храните исходники в Git, CodePipeline следит за репозиторием и запускает сборку в CodeBuild. Сборка подготавливает артефакты и SAM-шаблон, затем CloudFormation (или CodeDeploy в других сценариях) выполняет обновление. CodeDeploy может мигрировать трафик через алиасы, что даёт возможность безопасного плавного релиза.

Детали процесса:

  • Push в репозиторий (GitHub, Bitbucket, CodeCommit) запускает CodePipeline.
  • CodePipeline передаёт контроль в CodeBuild для сборки и упаковки (необязательно для простых JS-скриптов, но необходим для TypeScript или компилируемых языков).
  • Результатом сборки являются zip-архивы с функциями и обновлённый SAM/CloudFormation-шаблон.
  • На этапе deploy CloudFormation создаёт Change Set (предварительный просмотр изменений). После проверки change set исполняется, и стек обновляется.
  • Если используется CodeDeploy, можно настроить поэтапную миграцию трафика (linear, canary, all-at-once).

Понятия в одну строку:

  • SAM: расширение CloudFormation для serverless-приложений. Опишет функции, триггеры и разрешения в YAML.
  • Change Set: превью изменений CloudFormation перед их применением.

Настройка системы контроля версий

  1. Создайте корневую директорию проекта и инициализируйте Git:
  • Структура проекта, рекомендуемая по умолчанию:
ProjectDirectory
|--template.yml
|--Function
|  |--index.js
|--AnotherFunction
|  |--index.js
  1. Файл SAM-шаблона должен лежать в корне и называться
template.yml
  1. Каждый Lambda handler — в отдельной папке. Это упрощает упаковку и развёртывание.

  2. Выберите провайдера исходного кода:

  • GitHub или Bitbucket: CodePipeline интегрируется напрямую.
  • Другой сервис: рекомендую создать зеркальный репозиторий в AWS CodeCommit и пушить туда для запуска пайплайна.

Советы по ветвлению:

  • Заводите отдельную ветку для релизов (release) и используйте protected-ветки для production.
  • Всегда используйте pull request + ревью перед слиянием в релизную ветку.

Написание SAM-шаблона

SAM — центральный элемент автоматического деплоя. Шаблон описывает функции, триггеры (API Gateway, SQS, SNS и т.д.), политики и разрешения.

Ниже приведён минимальный пример регистрации функции через SAM (сделан как в исходном тексте):

AWSTemplateFormatVersion: '2010-09-09'

Transform: AWS::Serverless-2016-10-31

Description: An AWS Serverless Specification template describing your function

Resources:

HelloWorld:

Type: AWS::Serverless::Function

Properties:

  Handler: HelloWorld/index.handler

  Runtime: nodejs8.10

Это регистрирует одну Lambda-функцию, использующую Node.js, с handler в HelloWorld/index.js.

Пример добавления API Gateway и разрешений (фрагмент в стиле SAM/CloudFormation):

AWSTemplateFormatVersion: '2010-09-09'

Transform: AWS::Serverless-2016-10-31

Description: An AWS Serverless Specification template describing your function

Resources:

HelloWorld:

Type: AWS::Serverless::Function

Properties:

  Handler: HelloWorld/index.handler

  Runtime: nodejs8.10

  Events:

    HelloWorldApi:

      Type: Api

      Properties:

        Path: /helloworld

        Method: GET

HelloWorldPermission:

Type: AWS::Lambda::Permission

Properties:

  Action: lambda:InvokeFunction

  FunctionName:

    Fn::GetAtt:

      - HelloWorld

      - Arn

  Principal: apigateway.amazonaws.com

  SourceArn:

    Fn::Sub: arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}:*/*/*/***

Замечания:

  • Обязательно указывайте правильный Runtime (nodejs14.x, nodejs16.x и т.д.). В примерах может быть устаревшая версия nodejs8.10 — проверьте актуальную версию при деплое. Не изменяйте версию без тестирования.
  • Для более сложных сценариев добавляйте роли IAM, политики и зависимости ресурсов прямо в шаблоне.

Ресурсы для дальнейшего чтения: официальные developer guides AWS, документация SAM и примеры на GitHub.

Локальная проверка и SAM CLI

  1. Установите SAM CLI для локального тестирования и паковки:
pip install aws-sam-cli
  1. Пакуем проект и загружаем артефакты в S3:
sam package \
  --template-file template.yml \
  --output-template-file package.yml \
  --s3-bucket bucket-name
  1. Разворачиваем стек вручную (полезно для отладки):
sam deploy \
  --template-file package.yml \
  --stack-name sam-hello-world \
  --capabilities CAPABILITY_IAM

Если всё прошло успешно, вы увидите новый CloudFormation стек и ресурсы в консоли Lambda.

Упаковка и деплой проекта через CodePipeline

Эта стадия обязательна для предсказуемого CI/CD, даже если проект не компилируется. Мы используем CodeBuild для пакетирования и CloudFormation для применения изменений.

Настройка роли выполнения

  1. Создайте IAM роль в консоли IAM и выберите CloudFormation как сервис, который будет использовать эту роль (или вручную назначьте доверительную политику).
  2. К роли прикрепите политику AWSLambdaExecute (если нужна стандартная политика).
  3. Добавьте inline-политику с набором разрешений, необходимым для управления ресурсами (пример ниже — минимально достаточный набор зависит от вашего шаблона):
{

"Statement": [

  {

    "Action": [

      "apigateway:*",

      "codedeploy:*",

      "lambda:*",

      "cloudformation:CreateChangeSet",

      "iam:GetRole",

      "iam:CreateRole",

      "iam:DeleteRole",

      "iam:PutRolePolicy",

      "iam:AttachRolePolicy",

      "iam:DeleteRolePolicy",

      "iam:DetachRolePolicy",

      "iam:PassRole",

      "s3:GetObject",

      "s3:GetObjectVersion",

      "s3:GetBucketVersioning"

    ],

    "Resource": "*",

    "Effect": "Allow"

  }

],

"Version": "2012-10-17"

}

Примечание: права выше открыты на все ресурсы (“Resource”: “*”). В production лучше ограничить список ресурсов и действий по принципу минимально необходимых прав.

Создание пайплайна

  1. В консоли CodePipeline создайте новый pipeline. Можно использовать автоматические настройки создания роли сервиса.
  2. В выборе провайдера исходного кода укажите GitHub, Bitbucket или CodeCommit и репозиторий.
  3. Для стадии сборки создайте проект в CodeBuild. Для простых Node-проектов достаточно Amazon Linux 2 и стандартного образа.

Настройки CodeBuild

buildspec.yml — конфигурация сборки

Файл buildspec.yml должен лежать в корне проекта и описывать команды сборки. Пример для TypeScript-проекта из исходного текста:

version: 0.2

phases:

install:

runtime-versions:

  nodejs: 10

commands:

  - npm install -g typescript

build:

commands:

  - echo Build started on `date`

  - npm install time

  - npm run build

  - export BUCKET=typescript-lambda

  - aws cloudformation package --template-file template.yml --s3-bucket $BUCKET --output-template-file outputtemplate.yml

artifacts:

type: zip

files:

- template.yml

- outputtemplate.yml

Пояснения и рекомендации:

- Обновите runtime-versions.nodejs в соответствии с используемой версией Node.js (например, 14 или 16).
- Замените `npm install time` на реальные зависимости вашего проекта.
- Переключите `BUCKET` на S3-бакет, доступный для ролей пайплайна.
- Можно добавить тестовую фазу (test) и запуск unit/integration тестов.

### Стадия деплоя в CloudFormation

Вместо прямого использования CodeDeploy, в этом руководстве мы применяем CloudFormation change set:

1. В качестве deploy-провайдера в CodePipeline выберите CloudFormation.
2. Установите режим действия "Create or replace a change set" и укажите имя change set.
3. В шаблоне укажите артефакт сборки `BuildArtifact` и файл `outputtemplate.yml`.
4. Добавьте Capability IAM и выберите сервисную роль, созданную ранее.

![Настройка CloudFormation для Lambda](/files/e1f7d776-c8f6-4b93-a36b-d69c292a8002.png)

CodePipeline создаст change set, но не применит его автоматически. Чтобы выполнить change set, мы добавим ещё одну action-группу, которая выполнит созданный change set.

1. Нажмите Edit на пайплайне и в разделе Deploy выберите Edit.
2. Добавьте Action Group сразу после созданного действия создания change set (важно — новая группа должна идти после создания change set).

![Группа действий](/files/1d105ac6-94e4-45c0-8300-b96fa04f4dd2.png)

3. Выберите провайдер CloudFormation, укажите BuildArtifact как входной артефакт и укажите те же значения change set и режима.

![Конфигурация выполнения деплоя](/files/19c661d3-3561-4c3f-8876-6885a8791e4a.png)

4. Сохраните и вручную запустите Release Change, чтобы протестировать пайплайн.

После успешного выполнения вы увидите ресурсы в Lambda.

![Сборка успешна](/files/99ef08a1-902e-4583-9fea-ebe0234aa63d.png)

Если появляются ошибки, откройте "More Details" рядом с ошибкой в CodePipeline. Чаще всего это:

- неудачная сборка в CodeBuild;
- неполный/невалидный SAM-шаблон;
- недостаточные IAM-права для выполнения операций CloudFormation/CodeBuild.

Если вы продолжаете пушить в репозиторий, CodePipeline будет запускаться автоматически и проходить те же шаги.

## Практические рекомендации и лучшие практики

1. Минимизируйте права: давайте ролям только необходимые разрешения. Привилегированные политики удобно использовать только для initial bootstrap, но в production лучше иметь строго ограниченные роли.
2. Используйте алиасы и версии Lambda: публикуйте новую версию и меняйте алиас, это упрощает откат.
3. Настройте Canary/Linear deploys в CodeDeploy, если хотите постепенное переключение трафика.
4. Автоматизируйте тесты в сборочной фазе: unit, integration, contract tests для API-интерфейсов.
5. Включите логирование и мониторинг: CloudWatch Logs, метрики Lambda, X-Ray для трейсинга.
6. Храните секреты в AWS Secrets Manager или Parameter Store и не коммитите ключи в репозиторий.

## Чек-лист ролей и задач

Разделим задачи по ролям (кто отвечает за что):

Разработчик:

- писать и запускать unit-тесты;
- поддерживать структуру функций и template.yml;
- обновлять зависимости и фиксировать версии runtime.

DevOps-инженер:

- настраивать CodePipeline/CodeBuild/CloudFormation;
- создавать и поддерживать IAM роли и политики;
- управлять S3-артефактами,
- мониторить пайплайн.

QA-инженер:

- писать integration-тесты, проверять change sets перед применением;
- проводить нагрузочное тестирование и тесты на откат.

Продукт-менеджер:

- определяет правила релизов и политики отката;
- утверждает каналы трафика и окна развертывания.

## Playbook: шаги для нового проекта (SOP)

1. Создать репозиторий и инициализировать структуру проекта.
2. Написать минимальный SAM-шаблон и проверить локально через `sam deploy --guided`.
3. Настроить S3-бакет для хранения артефактов сборки.
4. Создать IAM роль с правами CloudFormation и загрузить inline-политику (адаптировать права).
5. Создать CodeBuild проект с корректным образoм и разрешениями.
6. Создать CodePipeline со стадиями: Source → Build → Deploy (CreateChangeSet) → Deploy (Execute).
7. Настроить мониторинг и оповещения на провале пайплайна.
8. Прописать тесты в buildspec и включить их в pipeline.

## Сценарий отката и runbook при инциденте

1. При критических ошибках переключите алиас на предыдущую стабильную версию.
2. Если используете CloudFormation и change set привёл к некорректному состоянию, откатите стек на предыдущую версию через консоль CloudFormation.
3. Проверяйте логи Lambda и CloudWatch для поиска причин ошибки.
4. В случае проблем с правами — проверьте IAM-логи и CloudTrail.
5. Документируйте причину и введите тест, чтобы предотвратить повтор.

Критерии приёмки (минимальные):

- пайплайн успешно собирает и упаковывает артефакты;
- change set создаётся и не содержит неожиданных удалений критичных ресурсов;
- все unit и integration тесты проходят;
- smoke-тесты на продакшн alias проходят.

## Тест-кейсы и примеры приёмки

- Unit tests: покрытие ключевой бизнес-логики (asserts on outputs).
- Integration: вызов API-эндпоинта и проверка ответа.
- Smoke: короткий сценарий, который выполняется после деплоя (health-check endpoint, проверка подключения к БД/посреднику).

## Безопасность и соответствие (GDPR/Конфиденциальность)

- Не храните персональные данные в логах.
- Секреты — в Secrets Manager/Parameter Store with encryption.
- Ограничьте доступ к IAM ролям и S3-бакетам.
- Для данных пользователей из ЕС убедитесь, что хранилища и обработки соответствуют политике компании и требованиям регуляторов.

## Альтернативные подходы

- Jenkins/GitLab CI вместо CodeBuild/CodePipeline: если ваша CI уже централизована в Jenkins, можно использовать его для сборки и вызывать SAM/CloudFormation шаги.
- Serverless Framework, Terraform: альтернативы SAM/CloudFormation. Serverless Framework даёт удобный UX и плагины; Terraform — декларативно управляет infra, но требует дополнительных интеграций для serverless-аспектов.
- Использование образов контейнеров для Lambda (Container image support) — полезно для монолитных зависимостей.

Когда CI/CD через CodePipeline может не подойти:

- У вас уже централизованная, отлаженная CI/CD-система, и миграция в AWS Pipeline экономически неоправдана.
- Нужна мультиоблачная стратегия, где инструменты облачного провайдера будут ограничивать переносимость.

## Ментальные модели и эвристики

- Разделяй и властвуй: каждая функция — отдельный модуль, отдельный пакет/zip.
- Декларативность выше импровизации: описали всё в шаблоне — можно повторить развертывание в другой среде.
- Маленькие релизы: меньше рисков и проще откат.

## Сравнение подходов (краткая матрица)

- CodePipeline + SAM: нативная интеграция, простая настройка, хорошая поддержка IAM. Подходит для AWS-centric команд.
- Jenkins + SAM: гибкость, но требует управляющей инфраструктуры для интеграции с AWS.
- Serverless Framework: удобные плагины, кросс-платформенность, дополнительная абстракция.

## Галерея пограничных случаев

- Большие zip-архивы: S3-бакеты и ограничения на размер артефактов.
- Длинные cold-starts: оптимизация пакета, разделение функциональности.
- Несовместимость runtime: проверьте версии Node/Python/Java.

## 1‑строчный глоссарий

- SAM — Serverless Application Model, расширение CloudFormation для serverless.
- Change Set — превью изменений CloudFormation перед применением.
- Alias — именованная ссылка на версию Lambda, удобна для маршрутизации трафика.

## Шаблоны и сниппеты

- Пример buildspec.yml и SAM-шаблон приведены выше.
- Инструменты для проверки: `aws cloudformation validate-template --template-body file://template.yml`.

## Отладка и советы по ошибкам

- "Insufficient permissions" — проверьте inline-политику роли и `iam:PassRole` для CloudFormation.
- "Template validation error" — используйте `aws cloudformation validate-template` и SAM linter.
- "Build failed" — смотрите логи CodeBuild, добавьте `echo` в buildspec для диагностики.

## Итог

CI/CD для AWS Lambda даёт контроль, повторяемость и безопасность релизов. Локальная разработка, Git, SAM и CodePipeline — комбинация, позволяющая выстроить предсказуемый процесс релизов. Не забудьте тестирование, мониторинг и минимизацию прав.

Примените чек-листы и playbook из этой статьи при создании первого пайплайна. Как только пайплайн настроен, добавляйте тесты и политики безопасности постепенно — так вы уменьшите риск человеческой ошибки и ускорите время вывода изменений в продакшн.

Примечание: при копировании примеров проверьте актуальность версий runtime и замените устаревшие значения.
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро