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. Методы HTTPGETиPOSTпубликуются для ресурса. - Каждый API запускает лямбда-функцию. Созданы две лямбда-функции: функция списка книг для перечисления всех доступных книг и функция создания книги для создания новой книги.
- Couchbase используется в качестве постоянного хранилища в EC2. Все документы JSON хранятся и извлекаются из этой базы данных.
Другие блоги на сервере:
- Микросервис с использованием AWS API Gateway, AWS Lambda и Couchbase
- Кнопка AWS IoT, лямбда и Couchbase
- Бессерверный FaaS с лямбда и Java
Давайте начнем!
Шаблон модели серверного приложения (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-31Description: Microservice using API Gateway, Lambda and CouchbaseResources: 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 completeSuccessfully 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 отображаются в теле ответа.
использованная литература
- Развертывание лямбда-приложений
- Безсерверные архитектуры
- AWS API Gateway
- Создание простого микросервиса с использованием Lambda и API Gateway
- Документы Couchbase Server
- Форумы Couchbase
- Следуйте за нами на @couchbasedev
| Ссылка: | Микросервис с использованием AWS Serverless Application Model и Couchbase от нашего партнера по JCG Аруна Гупта из блога Miles to go 3.0… . |








