아마존 웹 서비스 소개 서버리스 애플리케이션 모델또는 SAM이라고도 합니다. 이는 다음을 표현하기 위한 간소화된 구문을 정의합니다.
서버리스 리소스. SAM 확장 AWS 클라우드포메이션 를 추가하여 API 게이트웨이, AWS Lambda 및 Amazon DynamoDB에 대한 지원을 추가했습니다. 이 블로그에서는 다음을 사용하여 간단한 마이크로서비스를 만드는 방법을 보여드립니다.
SAM. 물론 카우치베이스 를 사용하세요! 이 블로그에서는 다음 블로그에서 설명한 기본 개념도 사용합니다. AWS API 게이트웨이, AWS Lambda 및 Couchbase를 사용한 마이크로서비스. SAM
는 마이크로서비스를 위한 전체 스택을 쉽게 배포하고 관리할 수 있음을 보여줍니다.
아키텍처의 주요 구성 요소는 다음과 같습니다:
- 클라이언트는 curl, AWS CLI/콘솔, Postman 클라이언트 또는 REST 엔드포인트를 호출할 수 있는 기타 도구/API가 될 수 있습니다.
- AWS API 게이트웨이는 API 프로비저닝에 사용됩니다. 최상위 리소스는 다음 경로에서 사용할 수 있습니다.
/책. HTTPGET그리고POST메소드가 리소스에 대해 게시됩니다. - 각 API는 람다 함수를 트리거합니다. 두 개의 람다 함수가 생성됩니다,
도서 목록함수를 사용하여 사용 가능한 모든 책을 나열하고책 만들기함수를 사용하여 새 책을 만들 수 있습니다. - Couchbase는 EC2에서 지속성 저장소로 사용됩니다. 모든 JSON 문서는 이 데이터베이스에서 저장 및 검색됩니다.
서버리스에 대한 기타 블로그:
- AWS API 게이트웨이, AWS Lambda 및 Couchbase를 사용한 마이크로서비스
- AWS IoT Button, 람다 및 카우치베이스
- Lambda 및 Java를 사용한 서버리스 FaaS
시작해보자!
서버리스 애플리케이션 모델(SAM) 템플릿
서버리스 리소스가 포함된 AWS CloudFormation 템플릿은 다음을 준수합니다. AWS SAM 모델 를 SAM 파일 또는 템플릿이라고 합니다. 배포됩니다.
를 CloudFormation 스택으로 사용하세요. SAM 템플릿을 살펴보겠습니다: 이 템플릿은 다음에서 사용할 수 있습니다. github.com/arun-gupta/serverless/blob/master/aws/microservice/template.yml.
|
1 2 3 4 5 6 7 8 9 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::서버리스::함수어트리뷰트입니다. 람다 함수의 이름은 다음과 같이 정의됩니다.리소스.. - 각 핸들러의 클래스는 다음 값으로 정의됩니다.
Resources..Properties.Handler속성 - Java 8 런타임은 다음에서 정의한 함수를 실행하는 데 사용됩니다.
Resources..Properties.Runtime속성 - 클래스의 코드는 S3 버킷에 업로드되며, 이 경우 다음 주소로 업로드됩니다.
s3://serverless-microservice/microservice-http-endpoint-1.0-SNAPSHOT.jar Resources..Properties.Environment.Variables.COUCHBASE_HOST속성 값은 카우치베이스가 실행되는 호스트를 정의합니다. 이것은 다음 설명에 따라 EC2에 쉽게 배포할 수 있습니다. 카우치베이스 설정.- 각 람다 함수는 API에 의해 트리거됩니다. AWS API 게이트웨이를 사용하여 배포됩니다. 경로는 다음과 같이 정의됩니다.
Events.GetResource.Properties.Path. HTTP 메서드는 다음을 사용하여 정의됩니다.Events.GetResource.Properties.Method속성입니다.
Java 애플리케이션
람다 함수가 포함된 Java 애플리케이션은 다음 주소에 있습니다. github.com/arun-gupta/serverless/tree/master/aws/microservice/microservice-http-endpoint.
다음에 의해 트리거되는 람다 함수 HTTP GET 메서드가 표시됩니다:
|
1 2 3 4 5 6 7 8 9 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 게이트웨이와 Lambda 통합에는 특정 입력 형식 그리고 출력 형식.
이러한 형식은 다음과 같이 정의됩니다.게이트웨이 요청그리고게이트웨이 응답클래스. - 함수 논리 사용 카우치베이스 자바 SDK 를 사용하여 Couchbase 데이터베이스를 쿼리합니다. N1QL 쿼리는 다음을 쿼리하는 데 사용됩니다.
를 데이터베이스에 저장합니다. 그런 다음 결과와 예외를게이트웨이 요청그리고게이트웨이 응답.
HTTP POST 메서드로 트리거되는 람다 함수 역시 매우 간단합니다:
|
1 2 3 4 5 6 7 8 9 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); } } } |
약간의 설명이 필요합니다:
- 수신 요청 페이로드는 다음에서 검색됩니다.
게이트웨이 요청 - 카우치베이스에 삽입된 문서는 응답으로 반환됩니다.
- 이전 방법과 마찬가지로 함수 로직은 카우치베이스 자바 SDK 를 사용하여 카우치베이스 데이터베이스를 쿼리합니다. 그러면 결과와 예외는 다음과 같습니다.
에 싸여게이트웨이 요청그리고게이트웨이 응답.
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 게이트웨이 지원 지역. 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 함수와 이러한 Lambda 함수를 트리거하는 REST 리소스/API를 배포할 수 있습니다.
마이크로서비스 호출
API 게이트웨이는 curl, wget, AWS CLI/콘솔, Postman 또는 REST API를 호출할 수 있는 기타 앱에서 호출할 수 있는 REST API를 게시합니다. 이 블로그에서는 AWS 콘솔을 사용하여 상호 작용을 보여줍니다. API 게이트웨이 홈 us-west-2.console.aws.amazon.com/apigateway/home?region=us-west-2#/apis 를 표시합니다:

이 리소스에 있는 모든 API를 보려면 API를 클릭하세요:

POST를 클릭하면 POST 메서드 실행을 위한 기본 페이지를 볼 수 있습니다:

테스트를 클릭하여 API를 테스트합니다:
요청 본문에서 페이로드를 추가하고 테스트 를 입력하여 API를 호출합니다. 결과는 아래와 같습니다:
이제 GET을 클릭하여 기본 실행 페이지를 확인합니다:

테스트를 클릭하여 API를 테스트합니다:

요청 본문은 필요하지 않으며 API 호출 테스트를 클릭하기만 하면 됩니다. 결과는 다음과 같습니다:
카우치베이스 데이터베이스의 출력은 응답 본문에 표시됩니다.



