Как автоматизировать безопасное лямбда-развертывание из Git — CloudSavvy IT
В Lambda есть веб-редактор текста, который вы, вероятно, использовали ранее для написания своих функций. Это отлично подходит для начинающих изучать платформу, но это не лучший способ обработки обновлений. Вот как можно отслеживать ваши функции Lambda в Git.
Как работает CI / CD для Lambda
Вместо того, чтобы использовать ручной редактор, вы должны разрабатывать свои функции локально, фиксировать и отправлять изменения в репозиторий Git, а также иметь CodePipeline для сборки и развертывания для вас.
CodePipeline запускается автоматически всякий раз, когда обнаруживает изменения в вашем исходном элементе управления, и отправляет эти изменения в CodeBuild (или Jenkins) для сборки. Этот шаг не является обязательным, и вы можете не использовать его для лямбды, но если вы используете что-то вроде TypeScript, вам понадобится этот этап. После сборки изменения передаются в CodeDeploy, который обрабатывает развертывание.
CodeDeploy автоматически обновит ваши функции Lambda и установит новую версию. Чтобы сделать процесс развертывания более плавным, он может постепенно смещать трафик с помощью псевдонима, пока 100% трафика не будет направлено на новую функцию.
Для управления фактическим развертыванием CodeDeploy использует модель сервера приложений AWS (SAM). SAM является расширением CloudFormation, службы инфраструктуры как код. Это в основном читаемый человеком шаблон языка сериализации данных (YAML), который используется для обработки всей конфигурации, связанной с развертыванием функций Lambda, и их предпосылок, и является важной частью возможности развертывания с использованием только кода.
Настройка контроля источника
Этот шаг довольно прост. Вы захотите создать новый каталог проекта, в котором будет содержаться весь ваш код, и инициализировать его с помощью Git. Шаблон SAM будет находиться в корне этого каталога с именем template.yml
, Каждая функция будет находиться в отдельной папке, корнем которой будет index.js для каждой. Это четко разделяет все и облегчает управление
ProjectDirectory |--template.yml |--Function | |--index.js |--AnotherFunction |--index.js
CodePipeline поддерживает Github и BitBucket для контроля версий. Если вы используете какой-либо из них, все, что вам нужно сделать, — это создать новую ветвь для развертываний (или просто использовать master, если у вас все в порядке). Если вы используете другой сервис, вы захотите использовать собственный контроль исходного кода CodeCommit в AWS в качестве вторичного репозитория, внося изменения в него всякий раз, когда вы хотите вносить обновления.
Написание шаблона SAM
Этот шаг будет самым сложным и наиболее специфичным для вашей функции и ее требований. Вам нужно будет создать шаблон SAM, который настроит вашу функцию Lambda и все ее необходимые ресурсы.
Базовый шаблон выглядит примерно так:
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, которая работает на NodeJS и имеет свой обработчик в HelloWorld/index.js
,
Вы также можете развернуть другие ресурсы из шаблона SAM. Например, чтобы дать API-шлюзу разрешение вызывать вашу функцию и настроить ее на запуск по определенному пути API, вы должны добавить следующее:
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}:*/*/*/*
Вам определенно понадобится более конкретное использование, чем то, что можно перечислить здесь, поэтому для получения дополнительной информации о SAM вы можете прочитать наше руководство по работе с ним, Руководства для разработчиков AWS, или полная схема на Github,
Получив рабочий шаблон, вы можете протестировать развертывание, установив SAM CLI:
pip install aws-sam-cli
Затем вы упакуете свой проект и сохраните артефакты в корзине S3:
sam package --template-file template.yml --output-template-file package.yml --s3-bucket bucket-name
И вы вручную запустите развертывание:
sam deploy --template-file package.yml --stack-name sam-hello-world --capabilities CAPABILITY_IAM
Если все работает правильно, вы должны увидеть новый стек CloudFormation и приложение в Lambda с вашими функциями.
Упаковка и развертывание проекта с помощью CodePipeline
Этот этап не является обязательным, даже если вы не работаете со скомпилированным языком. Используя шаблон SAM, CodeBuild будет использоваться здесь для обработки упаковки проекта во что-то, что может быть легко развернуто с CodeDeploy. При желании вы можете выполнить другие команды перед упаковкой, такие как npm run build
а также npm install
,
Во-первых, вам потребуется роль выполнения, способная обрабатывать обновления CloudFormation. Открыть Консоль управления IAM для добавления новой роли, Выберите «CloudFormation» в качестве ресурса, который будет использовать эту роль, затем добавьте «AWSLambdaExecute
политика разрешений.
Сохраните роль, откройте ее и прикрепите следующую встроенную политику:
{ "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" }
Создать новый конвейер из Консоль CodePipeline, Выберите настройки по умолчанию для создания новой роли службы. Это будет настроено автоматически.
На этапе управления исходным кодом выберите тип управления исходным кодом, репо и ветвь релиза.
На этапе сборки вы захотите создать новый проект в CodeBuild. Конфигурация по умолчанию подходит, просто выберите Amazon Linux 2 в качестве операционной системы для сборки и выберите стандартную среду выполнения и стандартный образ.
Главное, что вам понадобится для codePipeline, это ваш buildspec.yml
файл, помещенный в корневой каталог вашего проекта. Это настраивает CodeBuild с помощью команд, которые ему необходимо выполнить. Следующая конфигурация является примером, который устанавливает TypeScript, все пакеты NPM, запускает npm run build
, а затем упаковывает все для CloudFormation.
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
Возможно, вам придется изменить это в соответствии с вашим проектом.
Как только это будет сделано, вы можете настроить заключительный этап. Вместо того, чтобы использовать CodeDeploy, мы будем использовать CloudFormation для непосредственного обновления, так как в любом случае вся упаковка происходила на этапе сборки. Выберите «CloudFormation» в качестве поставщика развертывания и установите режим действия «Создать или заменить набор изменений». Введите новое имя и измените имя набора.
Для шаблона выберите «BuildArtifact» и введите в outputtemplate.yml
с предыдущего шага. Добавьте «Возможности IAM» к возможностям и выберите роль службы, которую вы создали ранее вручную.
Нажмите «Создать», и ваш конвейер должен работать без ошибок. Тем не менее, этап CloudFormation делает изменить набор, что похоже на предварительный просмотр изменений. Для фактического развертывания изменений нам нужно выполнить набор изменений.
Нажмите «Изменить» на созданном вами конвейере. В разделе «Развертывание» нажмите «Изменить» и нажмите «Добавить группу действий» после уже созданное действие. Если вы создадите новое действие до этого, оно не будет работать.
Выберите «CloudFormation» в качестве провайдера. Выберите «BuildArtifact» в качестве входного артефакта. Для режима действия и изменения имени набора введите те же значения, которые вы создали для первого действия развертывания.
Нажмите «Сохранить», и вы вернетесь на главный экран конвейера. Нажмите «Release Change», чтобы снова запустить конвейер вручную. Теперь он должен завершиться, и изменения должны быть видны в консоли Lambda.
Если вы получаете ошибки, это довольно легко отследить, так как вы можете нажать «Подробнее» рядом с сообщением об ошибке в CodePipeline. Это может быть неудачная сборка, неполный шаблон SAM или недостаточные разрешения для CodeBuild или CloudFormation.
Если вы фиксируете изменения в вашем контроле исходного кода, он должен быть обнаружен CodePipeline и начать весь этот процесс заново.