아마존 웹 서비스 소개 서버리스 애플리케이션 모델또는 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' 변환: AWS::Serverless-2016-10-31 설명: API 게이트웨이를 사용한 마이크로서비스, Lambda 그리고 카우치베이스 리소스: 마이크로서비스겟올게이트웨이: 유형: AWS:서버리스 :서버리스:기능 속성: 핸들러: org.sample.serverless.aws.couchbase.gateway.BucketGetAll 런타임: java8 CodeUri: s3://serverless-microservice/microservice-http-endpoint-1.0-SNAPSHOT.jar 시간 초과: 30 메모리 크기: 1024 환경: 변수: COUCHBASE_HOST: ec2-35-163-21-104.us-west-2.compute.amazonaws.com 역할: arn:aws:iam::598307997273역할/마이크로서비스 역할 이벤트: GetResource: 유형: Api 속성: 경로: /books 방법: get 마이크로서비스포스트게이트웨이: 유형: AWS:서버리스 :서버리스:기능 속성: 핸들러: org.sample.serverless.aws.couchbase.gateway.BucketPost 런타임: java8 CodeUri: s3://serverless-microservice/microservice-http-endpoint-1.0-SNAPSHOT.jar 시간 초과: 30 메모리 크기: 1024 환경: 변수: COUCHBASE_HOST: ec2-35-163-21-104.us-west-2.compute.amazonaws.com 역할: arn:aws:iam::598307997273역할/마이크로서비스 역할 이벤트: GetResource: 유형: Api 속성: 경로: /books 방법: 게시물 |
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 클래스 BucketGetAll 구현 요청 핸들러<게이트웨이 요청, 게이트웨이 응답> { @오버라이드 public 게이트웨이 응답 핸들 요청(게이트웨이 요청 요청, 컨텍스트 컨텍스트) { 시도 { N1qlQuery 쿼리 = N1qlQuery .simple(선택("*") .에서(i(카우치베이스유틸.getBucketName())) .limit(10)); 문자열 결과 = 카우치베이스유틸.getBucket().쿼리(쿼리).모든 행().toString(); 반환 new 게이트웨이 응답(200, 결과, 게이트웨이 응답.HEADERS_JSON); } catch (구성 예외 e) { 반환 new 게이트웨이 응답(400, e.getMessage(), 게이트웨이 응답.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 클래스 버킷포스트 구현 요청 핸들러<게이트웨이 요청, 게이트웨이 응답> { @오버라이드 public 게이트웨이 응답 핸들 요청(게이트웨이 요청 요청, 컨텍스트 컨텍스트) { 시도 { JsonDocument 문서 = 카우치베이스유틸.getBucket().업서트(예약.fromStringToJson(요청.getBody())); 반환 new 게이트웨이 응답(200, 문서.콘텐츠().toString(), 게이트웨이 응답.HEADERS_JSON); } catch (예외 ex) { 반환 new 게이트웨이 응답(400, ex.getMessage(), 게이트웨이 응답.HEADERS_TEXT); } } } |
약간의 설명이 필요합니다:
- 수신 요청 페이로드는 다음에서 검색됩니다.
게이트웨이 요청
- 카우치베이스에 삽입된 문서는 응답으로 반환됩니다.
- 이전 방법과 마찬가지로 함수 로직은 카우치베이스 자바 SDK 를 사용하여 카우치베이스 데이터베이스를 쿼리합니다. 그러면 결과와 예외는 다음과 같습니다.
에 싸여게이트웨이 요청
그리고게이트웨이 응답
.
Java 애플리케이션을 다음과 같이 빌드합니다:
1 |
mvn -f 마이크로서비스-http-엔드포인트/pom.xml clean 패키지 |
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 마이크로서비스-http-엔드포인트/대상/마이크로서비스-http-엔드포인트-1.0-스냅샷.jar s3://serverless-microservice/microservice-http-endpoint-1.0-SNAPSHOT.jar |
이제 코드가 S3 버킷에 업로드되었습니다. SAM 템플릿을 배포할 준비가 되었습니다!
SAM 템플릿 배포
SAM 템플릿을 배포합니다:
1 2 3 4 |
aws 클라우드 포메이션 배포 --템플릿-파일 템플릿.yml --스택-이름 마이크로서비스-게이트웨이 --지역 우리-west-2 |
출력이 표시됩니다:
1 2 3 |
대기 중 에 대한 변경 집합 에 be 생성.. 대기 중 에 대한 스택 create/업데이트 에 완료 성공적 생성/업데이트 스택 - 마이크로서비스-게이트웨이 |
이 하나의 명령으로 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 호출 테스트를 클릭하기만 하면 됩니다. 결과는 다음과 같습니다:
카우치베이스 데이터베이스의 출력은 응답 본문에 표시됩니다.