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 - 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 отображаются в теле ответа.
использованная литература
- Развертывание лямбда-приложений
- Безсерверные архитектуры
- AWS API Gateway
- Создание простого микросервиса с использованием Lambda и API Gateway
- Документы Couchbase Server
- Форумы Couchbase
- Следуйте за нами на @couchbasedev
Ссылка: | Микросервис с использованием AWS Serverless Application Model и Couchbase от нашего партнера по JCG Аруна Гупта из блога Miles to go 3.0… . |