이 블로그 에서는 지금까지 서버리스 애플리케이션에 대해 다음과 같은 개념을 설명했습니다:
서버리스 시리즈의 세 번째 블로그에서는 Amazon API Gateway, AWS Lambda, 그리고 다음을 사용하여 간단한 마이크로서비스를 만드는 방법을 설명합니다. 카우치베이스. 읽기 이전 블로그 를 참조하세요. Amazon API 게이트웨이 는 개발자가 규모에 관계없이 API를 쉽게 생성, 게시, 유지 관리, 모니터링 및 보호할 수 있는 완전 관리형 서비스입니다. Amazon API Gateway는 트래픽 관리, 권한 부여 및 액세스 제어, 모니터링, API 버전 관리 등 최대 수십만 개의 동시 API 호출을 수락하고 처리하는 데 관련된 모든 작업을 처리합니다. 다음은 이 아키텍처의 주요 구성 요소입니다:
- 클라이언트는 curl, AWS CLI, Postman 클라이언트 또는 REST 엔드포인트를 호출할 수 있는 기타 도구/API가 될 수 있습니다.
- API 게이트웨이는 API를 프로비저닝하는 데 사용됩니다. 최상위 리소스는 경로에서 사용할 수 있습니다.
/책
. HTTPGET
그리고POST
메소드가 리소스에 대해 게시됩니다. - 각 API는 람다 함수를 트리거합니다. 두 개의 람다 함수가 생성됩니다,
도서 목록
함수를 사용하여 사용 가능한 모든 책을 나열하고책 만들기
함수를 사용하여 새 책을 만들 수 있습니다. - Couchbase는 EC2에서 지속성 저장소로 사용됩니다. 모든 JSON 문서는 이 데이터베이스에서 저장 및 검색됩니다.
시작해보자!
IAM 역할 만들기
IAM 역할에는 API 게이트웨이에서 이 역할을 사용하고 Lambda 기능을 실행할 수 있는 정책 및 신뢰 관계가 있습니다. 새 IAM 역할을 만들어 보겠습니다:
1 2 3 |
aws iam create-역할 --역할-이름 마이크로서비스 역할 --가정-역할-정책-문서 파일://./trust.json |
--역할-정책-문서 가정하기
엔티티에 역할을 맡을 수 있는 권한을 부여하는 신뢰 관계 정책 문서를 정의합니다. trust.json
에 있습니다. github.com/arun-gupta/serverless/blob/master/aws/microservice/trust.json 처럼 보입니다:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
{ "버전": "2012-10-17", "성명서": [ { "Sid": "", "효과": "허용", "교장": { "서비스": [ "lambda.amazonaws.com", "apigateway.amazonaws.com" ] }, "액션": "sts:가정 역할" } ] } |
이 신뢰 관계를 통해 Lambda 함수와 API 게이트웨이가 실행 중에 이 역할을 맡을 수 있습니다. 정책을 이 역할에 다음과 같이 연결합니다:
1 2 3 4 |
aws iam put-역할-정책 --역할-이름 마이크로서비스 역할 --정책-이름 마이크로정책 --정책-문서 파일://./policy.json |
policy.json
에 있습니다. github.com/arun-gupta/serverless/blob/master/aws/microservice/policy.json 처럼 보입니다:
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 |
{ "버전": "2012-10-17", "성명서": [ { "효과": "허용", "액션": [ "로그:*" ], "리소스": "ARN:AWS:로그:*:*:*" }, { "효과": "허용", "액션": [ "아피게이트웨이:*" ], "리소스": "arn:aws:apigateway:*::/*" }, { "효과": "허용", "액션": [ "execute-api:호출" ], "리소스": "ARN:AWS:실행-API:*:*:*" }, { "효과": "허용", "액션": [ "람다:*" ], "리소스": "*" } ] } |
이 관대한 정책은 모든 리소스에 대해 CloudWatch에서 생성된 로그에 대한 모든 권한을 허용합니다. 또한 모든 리소스에 대한 모든 Lambda 및 API 게이트웨이 권한을 허용합니다. 일반적으로 특정 리소스에는 필요한 정책만 부여됩니다.
람다 함수 만들기
람다 함수를 만드는 자세한 단계는 다음 문서에 설명되어 있습니다. AWS Lambda 및 Java를 사용한 서버리스 FaaS. 이 사례에 필요한 두 개의 람다 함수를 만들어 보겠습니다:
1 2 3 4 5 6 7 8 9 10 11 12 |
aws 람다 create-함수 --함수-이름 MicroserviceGetAll --역할 arn:aws:iam::598307997273:역할/마이크로서비스 역할 --핸들러 org.샘플.서버리스.aws.카우치베이스.BucketGetAll --zip-파일 fileb:///사용자/아룽업타/작업 공간/서버리스/aws/microservice/microservice-http-엔드포인트/target/microservice-http-엔드포인트-1.0-SNAPSHOT.jar --설명 "마이크로서비스 HTTP 엔드포인트 - 모두 가져오기" --런타임 java8 --지역 우리-west-1 --시간 초과 30 --메모리-크기 1024 --환경 변수={COUCHBASE_HOST=ec2-52-53-193-176.us-west-1.compute.amazonaws.com} --게시 |
이 기능에서 주목해야 할 몇 가지 주요 항목은 다음과 같습니다:
- IAM 역할
마이크로서비스 역할
이전 단계에서 생성된 것이 여기에 명시적으로 지정됩니다. - 핸들러는
org.sample.serverless.aws.couchbase.BucketGetAll
클래스입니다. 이 클래스는 다음을 사용하여 정의된 카우치베이스 데이터베이스를 쿼리합니다.COUCHBASE_HOST
환경 변수입니다.
두 번째 람다 함수를 만듭니다:
1 2 3 4 5 6 7 8 9 10 11 12 |
aws 람다 create-함수 --함수-이름 마이크로서비스포스트 --역할 arn:aws:iam::598307997273:역할/마이크로서비스 역할 --핸들러 org.샘플.서버리스.aws.카우치베이스.버킷포스트 --zip-파일 fileb:///사용자/아룽업타/작업 공간/서버리스/aws/microservice/microservice-http-엔드포인트/target/microservice-http-엔드포인트-1.0-SNAPSHOT.jar --설명 "마이크로서비스 HTTP 엔드포인트 - 포스트" --런타임 java8 --지역 우리-west-1 --시간 초과 30 --메모리-크기 1024 --환경 변수={COUCHBASE_HOST=ec2-52-53-193-176.us-west-1.compute.amazonaws.com} --게시 |
이 함수의 핸들러는 org.sample.serverless.aws.couchbase.BucketPost
클래스입니다. 이 클래스는 다음과 같이 식별되는 Couchbase 데이터베이스에 새 JSON 문서를 생성합니다. COUCHBASE_HOST
환경 변수를 사용할 수 있습니다. 이러한 클래스의 전체 소스 코드는 다음 링크에서 확인할 수 있습니다. github.com/arun-gupta/serverless/tree/master/aws/microservice/microservice-http-endpoint.
API 게이트웨이 리소스
Amazon API 게이트웨이를 사용하여 API 생성 및 테스트하기 그리고 람다 함수를 노출하는 API 빌드하기 에서 API 게이트웨이와 람다 함수를 사용하여 강력한 백엔드 시스템을 구축하는 방법에 대한 자세한 단계와 설명을 제공합니다. 이 블로그에서는 단계를 간략하게 요약하여 설명합니다. API 게이트웨이 리소스를 만들어 보겠습니다.
- 첫 번째 단계는 API를 만드는 것입니다:
123aws 아피게이트웨이create-rest-api--이름 예약
출력은 다음과 같이 표시됩니다:
12345{"name": "예약","id": "lb2qgujjif","createdDate": 1482998945}
의 값은id
속성은 API ID입니다. 우리의 경우, 이것은lb2qgujjif
. - 다음 AWS CLI 호출에 필요하므로 생성된 API의 ROOT ID를 찾습니다:
1aws 아피게이트웨이 get-리소스 --rest-api-id lb2qgujjif
출력 결과가 표시됩니다:
12345678{"items": [{"경로": "/","id": "hgxogdkheg"}]}
가치id
속성은 ROOT ID입니다. 이는 최상위 리소스에 대한 PARENT ID이기도 합니다. - 리소스 만들기
1234aws 아피게이트웨이 create-리소스--rest-api-id lb2qgujjif--부모-id hgxogdkheg--경로-part 책
출력 결과가 표시됩니다:
123456{"경로": "/books","pathPart": "books","id": "vrpkod","parentId": "hgxogdkheg"}
가치id
속성은 리소스 ID입니다.
API ID와 RESOURCE ID는 이후 AWS CLI 호출에 사용됩니다.
API 게이트웨이 POST 방법
이제 리소스가 생성되었으므로 HTTP를 생성해 보겠습니다. POST
메서드에 대해 설명합니다.
- 만들기
POST
메서드
12345aws 아피게이트웨이 put-메서드--rest-api-id lb2qgujjif--리소스-id vrpkod--http-메서드 POST--권한 부여-유형 없음
를 클릭해 응답을 확인합니다:
12345{"apiKeyRequired": false,"httpMethod": "POST","authorizationType": "NONE"} - 람다 함수를 POST 메서드의 대상으로 설정합니다:
1234567aws 아피게이트웨이 put-통합--rest-api-id lb2qgujjif--리소스-id vrpkod--http-메서드 POST--유형 AWS--통합-http-메서드 POST--uri arn:aws:아피게이트웨이:우리-west-1:람다:경로/2015-03-31/함수/arn:aws:람다:우리-west-1::함수:마이크로서비스포스트/호출
다음을 교체해야 합니다.에 AWS 계정 ID를 입력합니다. 여기에서도 이전 섹션의 API ID와 리소스 ID가 사용됩니다.
--uri
는 통합 입력의 URI를 지정하는 데 사용됩니다. URI의 형식은 고정되어 있습니다. 이 CLI는 결과를 다음과 같이 표시합니다:
12345678{"httpMethod": "POST","패스스루비헤이비어": "when_no_match","캐시키 매개변수": [],"type": "AWS","uri": "arn:aws:apigateway:us-west-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-west-1::function:MicroservicePost/invocations","캐시 네임스페이스": "vrpkod"} - 설정
콘텐츠 유형
POST 메소드 응답의 비율입니다:
123456aws 아피게이트웨이 put-메서드-응답--rest-api-id lb2qgujjif--리소스-id vrpkod--http-메서드 POST--상태-코드 200--응답-모델 "{"애플리케이션/json": "비어 있음"}"
를 클릭해 응답을 확인합니다:
123456{"응답 모델": {"application/json": "비어 있음"},"statusCode": "200"} - 설정
콘텐츠 유형
POST 방식 통합 응답의 비율입니다:
123456aws 아피게이트웨이 put-통합-응답--rest-api-id lb2qgujjif--리소스-id vrpkod--http-메서드 POST--상태-코드 200--응답-템플릿 "{"애플리케이션/json": "비어 있음"}"
를 클릭해 응답을 확인합니다:
123456{"statusCode": "200","응답 템플릿": {"application/json": "비어 있음"}} - API 배포
123aws 아피게이트웨이 create-배포--rest-api-id lb2qgujjif--단계-이름 테스트
를 클릭하여 응답을 확인합니다.
1234{"id": "9wi991","createdDate": 1482999187} - API 게이트웨이가 람다 함수를 호출할 수 있는 권한을 부여합니다:
123456aws 람다 추가-권한--함수-이름 마이크로서비스포스트--문-id 아피게이트웨이-테스트-post-1--액션 람다:InvokeFunction--교장 아피게이트웨이.아마존.com--출처-arn "arn:aws:execute-api:us-west-1::lb2qgujjif/*/POST/books"
또한 배포된 API에 권한을 부여합니다:
123456aws 람다 추가-권한--함수-이름 마이크로서비스포스트--문-id 아피게이트웨이-테스트-post-2--액션 람다:InvokeFunction--교장 아피게이트웨이.아마존.com--출처-arn "arn:aws:execute-api:us-west-1::lb2qgujjif/test/GET/books" - API 메소드를 테스트합니다:
123456aws 아피게이트웨이 테스트-호출-메서드--rest-api-id lb2qgujjif--리소스-id vrpkod--http-메서드 POST--경로-와 함께-쿼리-문자열 ""--body "{"id": "1", "책 이름": "테스트 책", "isbn": "123", "비용": "1.23"}"
를 클릭해 응답을 확인합니다:
12345678910{"status": 200,"body": "비어 있음","log": "요청 실행 로그 test-requestnThu Dec 29 08:16:05 UTC 2016 : 요청 실행 시작: test-invoke-requestnThu Dec 29 08:16:05 UTC 2016 : HTTP 메서드: POST, 리소스 경로: /booksnThu Dec 29 08:16:05 UTC 2016 : 메서드 요청 경로: {}nThu Dec 29 08:16:05 UTC 2016 : 메서드 요청 쿼리 문자열: {}nThu Dec 29 08:16:05 UTC 2016 : 메서드 요청 헤더: {}nThu Dec 29 08:16:05 UTC 2016 : 변환 전 메서드 요청 본문: {"id": "1", "책 이름": "테스트 책", "isbn": "123", "비용": "1.23"}nThu Dec 29 08:16:05 UTC 2016 : 엔드포인트 요청 URI: https://lambda.us-west-1.amazonaws.com/2015-03-31/functions/arn:aws:lambda:us-west-1:598307997273:function:MicroservicePost/invocationsnThu Dec 29 08:16:05 UTC 2016 : 엔드포인트 요청 헤더: {x-amzn-lambda-integration-tag=test-request, Authorization=****************************************************************************************************************************************************************************************************************************************************************************************************************************************c8bb85, X-Amz-Date=20161229T081605Z, x-amzn-apigateway-api-id=lb2qgujjif, X-Amz-Source-Arn=arn:aws:execute-api:us-west-1:598307997273:lb2qgujjif/null/POST/books, Accept=application/json, User-Agent=AmazonAPIGateway_lb2qgujjif, Host=lambda.us-west-1.amazonaws.com, X-Amz-Content-Sha256=559d0296d96ec5647eef6381602fe5e7f55dd17065864fafb4f581d106aa92f4, X-Amzn-Trace-Id=Root=1-5864c645-8494974a41a3a16c8d2f9929, Content-Type=application/json}nThu Dec 29 08:16:05 UTC 2016 : 변환 후 엔드포인트 요청 본문을 전송합니다: {"id": "1", "책 이름": "테스트 책", "isbn": "123", "비용": "1.23"}nThu Dec 29 08:16:10 UTC 2016 : 변환 전 엔드포인트 응답 본문: "{\"비용\":\"1.23\",\"id\":\"1\",\"책 이름\":\"테스트 책\",\"isbn\":\"123\"}"nThu Dec 29 08:16:10 UTC 2016 : 엔드포인트 응답 헤더: {x-amzn-Remapped-Content-Length=0, x-amzn-RequestId=0b25323b-cd9f-11e6-8bd4-292925ba63a9, Connection=keep-alive, Content-Length=78, Date=Thu, 29 Dec 2016 08:16:10 GMT, Content-Type=application/json}nThu Dec 29 08:16:10 UTC 2016 : 변환 후 메서드 응답 본문입니다: EmptynThu Dec 29 08:16:10 UTC 2016 : 메서드 응답 헤더: {X-Amzn-Trace-Id=Root=1-5864c645-8494974a41a3a16c8d2f9929, Content-Type=application/json}nThu Dec 29 08:16:10 UTC 2016 : 성공적으로 실행 완료nThu Dec 29 08:16:10 UTC 2016 : 상태: 200n으로 메서드가 완료되었습니다.","지연 시간": 5091,"헤더": {"X-암즈-트레이스-아이디": "Root=1-5864c645-8494974a41a3a16c8d2f9929","콘텐츠 유형": "application/json"}}
가치상태
속성이 200이면 호출이 성공했음을 나타냅니다. 의 값로그
속성은 CloudWatch 로그의 로그 문을 보여줍니다. 자세한 로그는 다음을 사용하여 얻을 수도 있습니다.aws logs filter-log-events --log-group /aws/lambda/MicroservicePost
. - 이 명령은 Couchbase에 단일 JSON 문서를 저장합니다. 이것은 쉽게 확인할 수 있습니다. Couchbase CLI 도구 cbq로 Couchbase 서버에 연결합니다:
1cbq -u 관리자 -p 비밀번호 -e="http://:8091"
다음에 기본 인덱스를 만듭니다.기본값
버킷을 쿼리하는 데 필요하므로 절 없이 버킷을 쿼리해야 합니다:
1234567891011121314cbq> create 기본 색인 기본_인덱스 on 기본값;{"요청ID": "13b539f9-7fff-4386-92f4-cea161a7aa08","서명": null,"결과": [],"status": "성공","metrics": {"elapsedTime": "1.917009047s","실행 시간": "1.916970061s","resultCount": 0,"결과 크기": 0}} - 쓰기 N1QL 쿼리를 사용하여 데이터에 액세스합니다:
123456789101112131415161718192021222324cbq> 선택 * 에서 기본값 limit 10;{"요청ID": "d7b1c3f9-6b4e-4952-9a1e-9faf5169926e","서명": {"*": "*"},"결과": [{"default": {"책 이름": "test","cost": "1.23","id": "1","isbn": "123"}}],"status": "성공","metrics": {"elapsedTime": "24.337755ms","실행 시간": "24.289796ms","resultCount": 1,"결과 크기": 175}}
결과에는 람다 함수에 의해 저장된 JSON 문서가 표시됩니다.
API 게이트웨이 GET 메서드
HTTP를 만들어 보겠습니다. GET
메서드를 호출합니다:
- 만들기
GET
메서드를 사용합니다:
12345aws 아피게이트웨이 put-메서드--rest-api-id lb2qgujjif--리소스-id vrpkod--http-메서드 GET--권한 부여-유형 없음 - 올바른 람다 함수를 GET의 대상으로 설정합니다:
1234567aws 아피게이트웨이 put-통합--rest-api-id lb2qgujjif--리소스-id vrpkod--http-메서드 GET--유형 AWS--통합-http-메서드 POST--uri arn:aws:아피게이트웨이:우리-west-1:람다:경로/2015-03-31/함수/arn:aws:람다:우리-west-1:598307997273:함수:MicroserviceGetAll/호출 - 설정
콘텐츠 유형
GET 메서드 응답을 반환합니다:
123456aws 아피게이트웨이 put-메서드-응답--rest-api-id lb2qgujjif--리소스-id vrpkod--http-메서드 GET--상태-코드 200--응답-모델 "{"애플리케이션/json": "비어 있음"}" - 설정
콘텐츠 유형
GET 메서드 통합 응답의 비율입니다:
123456aws 아피게이트웨이 put-통합-응답--rest-api-id lb2qgujjif--리소스-id vrpkod--http-메서드 GET--상태-코드 200--응답-템플릿 "{"애플리케이션/json": "비어 있음"}" - API 게이트웨이가 람다 함수를 호출할 수 있는 권한을 부여합니다.
123456aws 람다 추가-권한--함수-이름 MicroserviceGetAll--문-id 아피게이트웨이-테스트-getall-1--액션 람다:InvokeFunction--교장 아피게이트웨이.아마존.com--출처-arn "arn:aws:execute-api:us-west-1:598307997273:lb2qgujjif/*/GET/books" - 배포된 API에 권한을 부여합니다:
123456aws 람다 추가-권한--함수-이름 MicroserviceGetAll--문-id 아피게이트웨이-테스트-getall-2--액션 람다:InvokeFunction--교장 아피게이트웨이.아마존.com--출처-arn "arn:aws:execute-api:us-west-1:598307997273:lb2qgujjif/test/GET/books" - 방법을 테스트합니다:
1234aws 아피게이트웨이 테스트-호출-메서드--rest-api-id lb2qgujjif--리소스-id vrpkod--http-메서드 GET
를 클릭하여 출력을 확인합니다:
12345678910{"status": 200,"body": "비어 있음","log": "요청 실행 로그 test-requestnSat Dec 31 09:07:48 UTC 2016 : 요청 실행 시작: test-invoke-requestnSat Dec 31 09:07:48 UTC 2016 : HTTP 메서드: GET, 리소스 경로: /booksnSat 31 09:07:48 UTC 2016 : 메서드 요청 경로: {}nSat Dec 31 09:07:48 UTC 2016 : 메서드 요청 쿼리 문자열: {}nSat Dec 31 09:07:48 UTC 2016 : 메서드 요청 헤더: {}nSat Dec 31 09:07:48 UTC 2016 : 변환 전 메서드 요청 본문: nSat Dec 31 09:07:48 UTC 2016 : 엔드포인트 요청 URI: https://lambda.us-west-1.amazonaws.com/2015-03-31/functions/arn:aws:lambda:us-west-1:598307997273:function:MicroserviceGetAll/invocationsnSat Dec 31 09:07:48 UTC 2016 : 엔드포인트 요청 헤더: {x-amzn-lambda-integration-tag=test-request, Authorization=******************************************************************************************************************************************************************************************************************************************************************************************************6de147, X-Amz-Date=20161231T090748Z, x-amzn-apigateway-api-id=lb2qgujjif, X-Amz-Source-Arn=arn:aws:execute-api:us-west-1:598307997273:lb2qgujjif/null/GET/books, Accept=application/json, User-Agent=AmazonAPIGateway_lb2qgujjif, X-Amz-Security-Token=FQoDYXdzEHEaDEILpsKTo45Ys1LrFCK3A+KOe5HXOSP3GfVAaRYHe1pDUJGHL9MtkFiPjORLFT+UCKjRqE7UFaGscTVG6PZXTuSyQev4XTyROfPylCrtDomGsoZF/iwy4rlJQIJ7elBceyeKu1OVdaT1A99PVeliaCAiDL6Veo1viWOnP+7c72nAaJ5jnyF/nHl/OLhFdFv4t/hnx3JePMk5YM89/6ofxUEVDNfzXxbZHRpTrG/4TPHwjPdoR5i9dEzWMU6Eo5xD4ldQ/m5B3RmrwpaPOuEq39LhJ8k/Vzo+pAfgJTq5ssbNwYOgh0RPSGVNMcoTkCwk0EMMT5vDbmQqZ2dW1a1tmQg9N2xR+QQy+RKMFgO5YY8fMxHnRSdMuuipxl79G1pktc [TRUNCATED]n토 Dec 31 09:07:48 UTC 2016 : 변환 후 엔드포인트 요청 본문: nSat Dec 31 09:07:53 UTC 2016 : 변환 전 엔드포인트 응답 본문: "[{\"기본값\":{\"비용\":\"1.23\",\"id\":\"1\",\"책 이름\":\"테스트 책\",\"isbn\":\"123\"}}]"nSat Dec 31 09:07:53 UTC 2016 : 엔드포인트 응답 헤더: {x-amzn-Remapped-Content-Length=0, x-amzn-RequestId=99ab09b2-cf38-11e6-996f-f5f07af431af, Connection=keep-alive, Content-Length=94, Date=Sat, 31 Dec 2016 09:07:52 GMT, Content-Type=application/json}nSat Dec 31 09:07:53 UTC 2016 : 변환 후 메서드 응답 본문입니다: EmptynSat Dec 31 09:07:53 UTC 2016 : 메소드 응답 헤더: {X-Amzn-Trace-Id=Root=1-58677564-66f1e96642b16d2db703126e, Content-Type=application/json}nSat Dec 31 09:07:53 UTC 2016 : 성공적으로 실행 완료nSat Dec 31 09:07:53 UTC 2016 : 상태: 200n으로 메서드 완료","지연 시간": 4744,"헤더": {"X-암즈-트레이스-아이디": "Root=1-58677564-66f1e96642b16d2db703126e","콘텐츠 유형": "application/json"}}
다시 한 번 200 상태 코드는 호출이 성공했음을 나타냅니다. 자세한 로그는 다음을 사용하여 얻을 수 있습니다.aws logs filter-log-events --log-group /aws/lambda/MicroservicePost
.
이 블로그에서는 간단한 POST와 GET 메서드 하나만 설명합니다. 다른 HTTP 메서드도 이 마이크로서비스에 매우 쉽게 포함할 수 있습니다.
안녕하세요 @Arun,
람다와 함께 Couchbase NodeJs V2.6.3 SDK를 사용할 수 있나요?
최신 SDK로 시도할 때 다음과 같은 오류가 발생합니다.
"오류 메시지": "/var/lang/lib/libstdc++.so.6: 버전 `CXXABI_1.3.9`를 찾을 수 없습니다(/var/task/node_modules/couchbase/build/Release/couchbase_impl.node에서 필요).",