Как автоматизировать безопасное лямбда-развертывание из 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 в качестве операционной системы для сборки и выберите стандартную среду выполнения и стандартный образ.

Настройки Codebuild

Главное, что вам понадобится для 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 и начать весь этот процесс заново.

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован.