Статьи

Микросервис с использованием AWS Serverless Application Model и Couchbase

Amazon Web Services представили модель безсерверных приложений , или SAM, пару месяцев назад. Он определяет упрощенный синтаксис для выражения безсерверных ресурсов. SAM расширяет AWS CloudFormation для добавления поддержки API Gateway, AWS Lambda и Amazon DynamoDB. Этот блог покажет, как создать простой микросервис с использованием SAM. Конечно, мы будем использовать Couchbase вместо DynamoDB!

В этом блоге также будут использованы основные концепции, описанные в Microservice с использованием AWS API Gateway, AWS Lambda и Couchbase . SAM покажет простоту, с которой весь стек для микросервиса может быть развернут и управляем.

В качестве обновления, вот ключевые компоненты в архитектуре:

  • Клиент может быть curl, AWS CLI / Console, клиентом Postman или любым другим инструментом / API, который может вызывать конечную точку REST.
  • AWS API Gateway используется для предоставления API. Ресурс верхнего уровня доступен в path /books . Методы HTTP GET и POST публикуются для ресурса.
  • Каждый API запускает лямбда-функцию. Созданы две лямбда-функции: функция списка книг для перечисления всех доступных книг и функция создания книги для создания новой книги.
  • Couchbase используется в качестве постоянного хранилища в EC2. Все документы JSON хранятся и извлекаются из этой базы данных.

Другие блоги на сервере:

Давайте начнем!

Шаблон модели серверного приложения (SAM)

Шаблон AWS CloudFormation с безсерверными ресурсами, соответствующими модели AWS SAM, называется файлом или шаблоном SAM. Он развернут как стек CloudFormation.

Давайте посмотрим на наш шаблон SAM:

Этот шаблон доступен по адресу github.com/arun-gupta/serverless/blob/master/aws/microservice/template.yml .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
AWSTemplateFormatVersion : '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: Microservice using API Gateway, Lambda and Couchbase
Resources:
  MicroserviceGetAllGateway:
    Type: AWS::Serverless::Function
    Properties:
      Handler: org.sample.serverless.aws.couchbase.gateway.BucketGetAll
      Runtime: java8
      CodeUri: s3://serverless-microservice/microservice-http-endpoint-1.0-SNAPSHOT.jar
      Timeout: 30
      MemorySize: 1024
      Environment:
        Variables:
          COUCHBASE_HOST: ec2-35-163-21-104.us-west-2.compute.amazonaws.com
      Role: arn:aws:iam::598307997273:role/microserviceRole
      Events:
        GetResource:
          Type: Api
          Properties:
            Path: /books
            Method: get
  MicroservicePostGateway:
    Type: AWS::Serverless::Function
    Properties:
      Handler: org.sample.serverless.aws.couchbase.gateway.BucketPost
      Runtime: java8
      CodeUri: s3://serverless-microservice/microservice-http-endpoint-1.0-SNAPSHOT.jar
      Timeout: 30
      MemorySize: 1024
      Environment:
        Variables:
          COUCHBASE_HOST: ec2-35-163-21-104.us-west-2.compute.amazonaws.com
      Role: arn:aws:iam::598307997273:role/microserviceRole
      Events:
        GetResource:
          Type: Api
          Properties:
            Path: /books
            Method: post

Спецификация шаблона SAM содержит полную информацию о содержимом шаблона. Ключевые части шаблона:

  • Определяет два ресурса, оба типа лямбда-функции, идентифицируемые атрибутом AWS::Serverless::Function . Имя лямбда-функции определяется Resources.<resource> .
  • Класс для каждого обработчика определяется значением атрибута Resources.<resource>.Properties.Handler
  • Среда выполнения Java 8 используется для запуска функции, определенной Resources.<resource>.Properties.Runtime
  • Код для класса загружается в корзину S3, в нашем случае в s3://serverless-microservice/microservice-http-endpoint-1.0-SNAPSHOT.jar
  • Resources.<resource>.Properties.Environment.Variables.COUCHBASE_HOST атрибута Resources.<resource>.Properties.Environment.Variables.COUCHBASE_HOST определяет хост, на котором работает Couchbase. Это может быть легко развернуто на EC2, как объяснено в Setup Couchbase .
  • Каждая лямбда-функция запускается API. Он развертывается с использованием AWS API Gateway. Путь определяется Events.GetResource.Properties.Path . HTTP-метод определяется с Events.GetResource.Properties.Method атрибута Events.GetResource.Properties.Method .

Java-приложение

Приложение Java, содержащее функции Lambda, находится по адресу github.com/arun-gupta/serverless/tree/master/aws/microservice/microservice-http-endpoint .

Лямбда-функция, запускаемая методом HTTP GET показана:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
public class BucketGetAll implements RequestHandler<GatewayRequest, GatewayResponse> {
  
    @Override
    public GatewayResponse handleRequest(GatewayRequest request, Context context) {
        try {
            N1qlQuery query = N1qlQuery
                    .simple(select("*")
                            .from(i(CouchbaseUtil.getBucketName()))
                            .limit(10));
  
            String result = CouchbaseUtil.getBucket().query(query).allRows().toString();
  
            return new GatewayResponse(200, result, GatewayResponse.HEADERS_JSON);
        } catch (ConfigurationException e) {
            return new GatewayResponse(400, e.getMessage(), GatewayResponse.HEADERS_TEXT);
        }
    }
}

Немного объяснения:

  • Каждая лямбда-функция должна реализовывать интерфейс com.amazonaws.services.lambda.runtime.RequestHandler .
  • Интеграция API Gateway и Lambda требует определенного входного формата и выходного формата . Эти форматы определены как GatewayRequest и GatewayResponse .
  • Функциональная логика использует Couchbase Java SDK для запроса базы данных Couchbase. N1QL- запрос используется для запроса к базе данных. Результаты и исключение затем GatewayRequest в GatewayRequest и GatewayResponse .

Лямбда-функция, запускаемая методом HTTP POST, также довольно проста:

01
02
03
04
05
06
07
08
09
10
11
12
13
public class BucketPost implements RequestHandler<GatewayRequest, GatewayResponse> {
  
    @Override
    public GatewayResponse handleRequest(GatewayRequest request, Context context) {
  
        try {
            JsonDocument document = CouchbaseUtil.getBucket().upsert(Book.fromStringToJson(request.getBody()));
            return new GatewayResponse(200, document.content().toString(), GatewayResponse.HEADERS_JSON);
        } catch (Exception ex) {
            return new GatewayResponse(400, ex.getMessage(), GatewayResponse.HEADERS_TEXT);
        }
    }
}

Немного объяснения:

  • Полезная нагрузка входящего запроса извлекается из GatewayRequest
  • Документ, вставленный в Couchbase, возвращается в качестве ответа.
  • Как и в предыдущем методе, логика функций использует Couchbase Java SDK для запроса базы данных Couchbase. Результаты и исключение затем GatewayRequest в GatewayRequest и GatewayResponse .

Создайте приложение Java как:

1
mvn -f microservice-http-endpoint/pom.xml clean package

Загрузить лямбда-функцию на S3

Шаблон SAM читает код из корзины S3. Давайте создадим ведро S3:

1
aws s3 mb s3://serverless-microservice --region us-west-2

Регион us-west-2 является одним из поддерживаемых регионов для API Gateway . Имена сегментов S3 глобально уникальны, но их местоположение зависит от региона.

Загрузите код в корзину S3:

1
aws s3 cp microservice-http-endpoint/target/microservice-http-endpoint-1.0-SNAPSHOT.jar s3://serverless-microservice/microservice-http-endpoint-1.0-SNAPSHOT.jar

Код теперь загружен в корзину S3. Шаблон SAM готов к развертыванию!

Развернуть SAM шаблон

Разверните шаблон SAM:

1
2
3
4
aws cloudformation deploy \
--template-file template.yml \
--stack-name microservice-gateway \
--region us-west-2

Показывает вывод:

1
2
3
Waiting for changeset to be created..
Waiting for stack create/update to complete
Successfully created/updated stack - microservice-gateway

Эта одна команда развертывает функции Lambda и REST Resource / API, которые запускают эти функции Lambda.

Вызвать микросервис

API Gateway публикует REST API, который может вызываться curl, wget, AWS CLI / Console, Postman или любым другим приложением, которое может вызывать REST API. Этот блог будет использовать Консоль AWS, чтобы показать взаимодействие.

Шлюз API дома по адресу us-west-2.console.aws.amazon.com/apigateway/home?region=us-west-2#/apis показывает:

Нажмите на API, чтобы увидеть все API в этом ресурсе:

Нажмите на POST, чтобы увидеть страницу по умолчанию для выполнения метода POST:

Нажмите на Test, чтобы проверить API:

Добавьте полезную нагрузку в тело запроса и нажмите Test чтобы вызвать API. Результаты показаны ниже:

Теперь нажмите GET, чтобы увидеть страницу выполнения по умолчанию:

Нажмите на Test, чтобы проверить API:

Тело запроса не требуется, просто нажмите кнопку Проверить вызов API. Результаты как показано:

Выходные данные из базы данных Couchbase отображаются в теле ответа.

использованная литература