paint-brush
Руководство по созданию бессерверного API AWS и конвейера CICDк@pchandel09
6,800 чтения
6,800 чтения

Руководство по созданию бессерверного API AWS и конвейера CICD

к Puneet Chandel11m2023/10/27
Read on Terminal Reader

Слишком долго; Читать

В этой статье демонстрируется разработка бессерверного API с использованием сервисов AWS и устанавливается конвейер непрерывной интеграции/непрерывного развертывания (CICD) в среде AWS.
featured image - Руководство по созданию бессерверного API AWS и конвейера CICD
Puneet Chandel HackerNoon profile picture


Обзор

В этой статье демонстрируется разработка бессерверного API с использованием сервисов AWS и устанавливается конвейер непрерывной интеграции/непрерывного развертывания (CICD) в среде AWS.


Часть 1. Описывается создание функции Lambda для обработки запросов от шлюза API и сохранения данных в DynamoDB с использованием модели бессерверных приложений.


Часть 2. Подробно описаны необходимые шаги для настройки репозитория CodeCommit в AWS и настройки конвейера CICD, который автоматически запускает процесс сборки после отправки новых изменений в репозиторий.

Предварительные условия

Для этого проекта вам понадобится учетная запись AWS (достаточно уровня бесплатного пользования). Будут использоваться следующие компоненты AWS:


  • API-шлюз AWS
  • AWS Лямбда
  • AWS ДинамоБД
  • AWS CodeCommit
  • Сборка кода AWS
  • Кодовый конвейер AWS
  • АВС С3
  • Разное – CloudWatch, IAM и т. д.


Убедитесь, что ваша локальная среда разработки настроена следующим образом:


  1. Установите интерфейс командной строки AWS . Следуйте инструкциям здесь , чтобы установить интерфейс командной строки AWS.


  2. Установите AWS SAM (модель бессерверного приложения) . Установите SAM CLI, следуя инструкциям здесь .


  3. Выберите IDE : используйте IntelliJ или аналогичную IDE для разработки. Я предпочитаю IntelliJ


  4. Maven для упаковки . Убедитесь, что у вас установлен Maven для упаковки вашего приложения.


  5. Необязательно: Docker (если вам нужно тестировать функции Lambda локально): установите Docker, если вы планируете тестировать функции Lambda локально.


Эти инструменты и компоненты составят основу проекта.

Часть 1: Разработка

В этом разделе мы увидим процесс создания стартового проекта с использованием AWS SAM, включая завершение класса обработчика, сборку, развертывание на AWS и проведение тестирования с помощью Postman.


Настройка среды

  1. Настройка АВС :

    Перейдите в консоль AWS по адресу https://aws.amazon.com/console/ . Войдите в систему, используя свои учетные данные администратора.

    1. Создайте пользователя в IAM :
      • В IAM создайте пользователя, предназначенного для локальной разработки и использования CLI/SAM.
    2. Создайте таблицу DynamoDB :
      • Имя: «пользователи», первичный ключ: «id» (тип: строка)
  2. Настройте AWS CLI на локальном компьютере :

    • Откройте терминал и запустите $ aws configure
    • Укажите ключи доступа для пользователя IAM, созданного ранее, и другие значения по умолчанию.
  3. Инициализируйте проект с использованием модели бессерверных приложений AWS (SAM) :

    • Откройте терминал и запустите $ sam init
    • Выберите шаблон быстрого запуска AWS.
    • Выберите пример «Hello World».
    • Выберите Java 11 или 17, тип пакета — zip и используйте Maven в качестве менеджера зависимостей.
    • Включите ведение журналов и мониторинг с помощью CloudWatch и XRay.
  4. Переименуйте проект : переименуйте проект, присвоив ему желаемое имя.

  5. Откройте проект в IntelliJ : запустите IntelliJ и откройте проект.

  6. Добавьте зависимости в pom.xml :

    • Добавьте необходимые зависимости в файл pom.xml . Вам нужно только добавить DynamoDB, поскольку другие зависимости будут автоматически включены SAM.

       <dependencies> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-core</artifactId> <version>1.2.2</version> </dependency> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-events</artifactId> <version>3.11.0</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <scope>test</scope> </dependency> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-dynamodb</artifactId> <version>1.12.573</version> </dependency> </dependencies>



Напишите класс обработчика

Для лямбда-функции отредактируйте класс обработчика, автоматически созданный Сэмом, и добавьте следующий код: это простой код, и для реальных проектов вы можете использовать более модульный код.

 public class UserRequestHandler implements RequestHandler<Map<String,String>, Map<String,String>> { private AmazonDynamoDB amazonDynamoDB; private String DYNAMODB_TABLE_NAME = "users"; private Regions REGION = Regions.US_EAST_1; @Override public Map<String,String> handleRequest(Map<String,String> input, Context context) { this.initDynamoDbClient(); LambdaLogger logger = context.getLogger(); logger.log("Input payload:" + input.toString()); String userId = UUID.randomUUID().toString(); String firstName= input.get("firstName"); String lastName= input.get("lastName"); Map<String, AttributeValue> attributesMap = new HashMap<>(); attributesMap.put("id", new AttributeValue(userId)); attributesMap.put("firstName", new AttributeValue(firstName)); attributesMap.put("lastName", new AttributeValue(lastName)); logger.log(attributesMap.toString()); amazonDynamoDB.putItem(DYNAMODB_TABLE_NAME, attributesMap); Map<String, String> response = new HashMap<>(); response.put("id", userId); response.put("firstName", firstName); response.put("lastName", lastName); return response; } private void initDynamoDbClient() { this.amazonDynamoDB = AmazonDynamoDBClientBuilder.standard() .withRegion(REGION) .build(); } }


Обновить файл шаблона SAM

Файл шаблона SAM играет ключевую роль в создании и развертывании изменений в AWS. Обновите файл проекта. Ключевые элементы, на которых следует сосредоточиться в этом файле, — это имена функций Lambda и конечные точки API-шлюза. Они имеют решающее значение для функциональности вашего бессерверного приложения.


 AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: > pc-aws-user-api Sample SAM Template for pc-aws-user-api # More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst Globals: Function: Timeout: 20 MemorySize: 128 Tracing: Active Api: TracingEnabled: true Resources: UserRequestHandlerLambdaFunction: Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction Properties: CodeUri: PcAwsUsersApi Handler: com.pc.aws.users.UserRequestHandler::handleRequest Runtime: java11 Architectures: - x86_64 MemorySize: 512 Environment: # More info about Env Vars: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#environment-object Variables: PARAM1: VALUE JAVA_TOOL_OPTIONS: -XX:+TieredCompilation -XX:TieredStopAtLevel=1 # More info about tiered compilation https://aws.amazon.com/blogs/compute/optimizing-aws-lambda-function-performance-for-java/ Events: PcUsers: Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api Properties: Path: /users Method: post ApplicationResourceGroup: Type: AWS::ResourceGroups::Group Properties: Name: Fn::Sub: ApplicationInsights-SAM-${AWS::StackName} ResourceQuery: Type: CLOUDFORMATION_STACK_1_0 ApplicationInsightsMonitoring: Type: AWS::ApplicationInsights::Application Properties: ResourceGroupName: Ref: ApplicationResourceGroup AutoConfigurationEnabled: 'true' Outputs: # ServerlessRestApi is an implicit API created out of Events key under Serverless::Function # Find out more about other implicit resources you can reference within SAM # https://github.com/awslabs/serverless-application-model/blob/master/docs/internals/generated_resources.rst#api PcAwsUsersApi: Description: API Gateway endpoint URL for Prod stage Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/users/" UserRequestHandlerLambdaFunction: Description: Lambda Function ARN Value: !GetAtt UserRequestHandlerLambdaFunction.Arn UserRequestHandlerLambdaFunctionIamRole: Description: Implicit IAM Role created Value: !GetAtt UserRequestHandlerLambdaFunctionRole.Arn


Сборка и развертывание кода с использованием SAM

В IntelliJ откройте терминал и выполните следующие команды:

$ sam build

$ sam deploy –guided


При появлении запроса укажите имя стека «PcAwsUsersApi» и выберите параметры по умолчанию.


В выводе будет показан созданный стек CloudFormation, а также будет предоставлена конечная точка шлюза API.

Проверьте API

Прежде чем тестировать API, предоставьте DynamoDB доступ к роли Lambda, созданной SAM.

  • Откройте функцию Lambda в консоли AWS.


  • Перейдите к «Разрешения» и найдите имя роли.


  • Добавьте к этой роли разрешение «DynamoDBFullAccess».


Этот шаг гарантирует, что функция Lambda имеет необходимые разрешения для взаимодействия с DynamoDB.




Перейдите к API Gateway, затем выполните следующие действия, чтобы получить URL-адрес вашей службы:

  1. Перейдите в API Gateway в консоли AWS.

  2. Выберите свой API.

  3. На левой боковой панели нажмите «Этапы».

  4. В разделе «Этапы» выберите этап «Prod».

  5. В разделе «Редактор сцены» вы найдете «URL-адрес вызова». Скопируйте этот URL.



  • Запустите приложение Почтальон.
  • Создайте POST-запрос. Создайте новый запрос со следующими данными:
    • Метод: ПОСТ
    • URL-адрес: вставьте URL-адрес конечной точки шлюза API, полученный ранее.
  • Установите заголовки: добавьте все необходимые заголовки (например, Content-Type: application/json ).


  • Добавить тело запроса: создайте объект JSON, представляющий пользовательские данные, которые вы хотите отправить в запросе. Это будут данные, которые вы ожидаете хранить в DynamoDB.


Часть II. Реализация конвейера CICD.

В этом разделе мы покажем, как построить конвейер CICD с помощью AWS CodeCommit, CodeBuild и CodePipeline. Конвейер инициирует процесс сборки, который извлекает код из репозитория, собирает его с использованием файла сборки и запускает CloudFormation для создания стека.


Создать репозиторий CodeCommit

Войдите в AWS и найдите сервис CodeCommit.


Создайте новый репозиторий в AWS CodeCommit для хранения исходного кода вашего проекта.

Зафиксировать код в репозитории

В IntelliJ откройте терминал и введите следующие команды, чтобы зафиксировать код, созданный на шаге I.

 $ git init → This initialize local git $ git add . → This will stage files $ git commit -m "commit to CodeCommit"


Отправить изменения в удаленный репозиторий

Скопируйте URL-адрес репозитория CodeCommit из консоли aws.

 $ git remote add origin <repo URL> $ git push --set-upstream origin master --> This will prompt for user/password



Создать проект AWS CodeBuild

Настройте проект CodeBuild, в котором указано, как создавать приложение. Сюда входит определение сред сборки, команд сборки и зависимостей.


  • Создайте корзину S3 для хранения файлов сборки.


  • Найдите AWS Code Build, создайте новый проект и предоставьте CodeCommit в качестве источника кода и S3 для хранения артефактов.


Чтобы настроить CodeBuild, вам необходимо создать файл спецификации сборки с именем buildspec.yml в каталоге вашего проекта. Этот файл будет содержать команды сборки и инструкции для CodeBuild.


Вы можете обратиться к официальной документации здесь для получения подробных инструкций по созданию файла buildspec.yml .


 version: 0.2 phases: install: runtime-versions: java: corretto11 pre_build: commands: - echo Nothing to do in the pre_build phase... build: commands: - echo Build started on `date` - sam build - sam package --output-template-file pcoutputtemplate.yaml --s3-bucket com-appsdev-pc-001 post_build: commands: - echo Build completed on `date` artifacts: files: - pcoutputtemplate.yaml


Отправьте новый файл в репозиторий из локального хранилища.


После этого вы можете собрать проект и проверить, извлечен ли код из репозитория и созданы ли артефакты.


Создайте конвейер кода

  • Создайте новый конвейер в AWS CodePipeline.


  • Подключите конвейер к репозиторию CodeCommit в качестве источника.


  • Настройте конвейер для использования CodeBuild в качестве этапа сборки.


  • Добавьте этап развертывания для запуска CloudFormation, используя созданный вами шаблон.


Конвейер автоматически создаст и развернет код на основе коммита git.



Тестирование конвейера


  • Откройте свой проект в IntelliJ.


  • Внесите небольшое изменение в один из ваших файлов, например, добавьте еще одну строку логгера.


  • Зафиксируйте изменение в локальном репозитории Git.


  • Отправьте фиксацию в репозиторий CodeCommit.


 $ git branch CR01 $ git checkout CR01 $ git add . $ git commit -m “CR01” $ git push --set-upstream origin CR01 You cand also create a pull request in aws code commit, just for simplicity I am merging from local $ git checkout master $ git merge --ff-only CR01 $ git push
  • Перейдите в консоль AWS CodePipeline.


  • Вы должны увидеть, что конвейер запускается автоматически. Он извлечет последнюю версию кода из репозитория, создаст проект с помощью CodeBuild и развернет его с помощью CloudFormation.


  • Отслеживайте ход выполнения на панели управления CodePipeline.


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







































В статье показано, как спроектировать устойчивый и автоматизированный процесс развертывания, используя AWS API Gateway, Lambda, DynamoDB, CodeCommit, CodeBuild и CodePipeline.


Спасибо за чтение. Пусть ваши бессерверные начинания увенчаются успехом и инновациями!