원본 링크: https://github.com/aws-samples/aws-bookstore-demo-app
AWS Bookstore 데모 앱은 고객이 가상의 책을 쇼핑 할 수 있도록 상점 첫 화면 (및 백엔드)을 생성하는 풀 스택 샘플 웹 애플리케이션입니다.
단일 CloudFormation 템플릿으로 전체 애플리케이션을 생성 할 수 있습니다. 여기에서 배포 된 응용 프로그램을 사용해보십시오!
This sample code is made available under a modified MIT license. See the LICENSE file.
AWS Bookstore 데모 앱의 목표는 여러 목적으로 구축 된 AWS 데이터베이스와 Amazon API Gateway 및 AWS CodePipeline과 같은 기본 AWS 구성 요소를 활용하는 완전한 기능의 웹 애플리케이션을 제공하는 것입니다.
점점 더 많은 최신 웹 앱이 다양한 데이터베이스를 사용하여 구축됩니다. 개발자는 대규모 애플리케이션을 개별 구성 요소로 나누고 각 작업에 가장 적합한 데이터베이스를 선택합니다.
AWS Bookstore 데모 앱을 예로 들어 보겠습니다. 이 앱에는 장바구니, 제품 검색, 추천 및 최고 판매자 목록과 같은 여러 경험이 포함되어 있습니다.
이러한 각 사용 사례에 대해 앱은 특별히 구축 된 데이터베이스를 사용하므로 개발자가 기능, 성능 또는 확장을 타협 할 필요가 없습니다.
제공된 CloudFormation 템플릿은 AWS Bookstore 데모 앱의 전체 생성 및 배포를 자동화합니다. 템플릿에는 다음 구성 요소가 포함됩니다.
검색: Amazon Elasticsearch Service를 사용하면 상점 첫 화면에 대한 전체 텍스트 검색이 가능하므로 사용자는 작성자, 제목 및 카테고리를 포함한 다양한 용어를 기반으로 제품을 찾을 수 있습니다.
베스트셀러 목록: Redis 용 Amazon ElastiCache는 Amazon DynamoDB Streams에서 주문 정보를 읽어서 구입하거나 평가한 "Top 20" 도서의 리더 보드를 생성합니다.
서버리스 웹 애플리케이션: Amazon CloudFront 및 Amazon S3는 전 세계적으로 분산 된 애플리케이션을 제공합니다.
템플릿을 사용자 지정하여 자신만의 서점을 만들거나, 수정하여 다른 유형의 상점을 만들거나, 완전히 다른 유형의 웹 응용 프로그램을 만들도록 변경할 수 있습니다.
AWS Bookstore 데모 앱은 기본 웹 애플리케이션을 시작하고 실행하는 데 필요한 기본 서비스, 구성 요소 및 배관을 제공하는 AWS Full-Stack 템플릿을 기반으로 구축되었습니다.
사용자는 여행 예약 도구, 블로그 또는 다른 웹 앱 등 원하는 모든 애플리케이션을 생성하기 위해 AWS Full-Stack 템플릿을 기반으로 구축 할 수 있습니다.
이 AWS Bookstore 데모 앱은 AWS Full-Stack 템플릿을 사용하여 생성 할 수있는 항목의 한 예 일 뿐입니다.
AWS 계정에서 이 데모 애플리케이션을 생성하면 AWS 리소스가 생성되고 소비되며 비용이 발생합니다.
이 데모 애플리케이션을 실행하는 데 소요되는 비용은 약 $0.45 / 1 hour 입니다.
완료되면 모든 리소스를 종료 / 제거하여 AWS 계정에 대한 지속적인 청구를 방지하십시오 (아래의 정리 및 제거 지침 참조).
AWS Bookstore 데모 앱을 자체 AWS 계정에서 실행 하려면 다음 단계를 따르십시오. (AWS 계정이없는 경우 새 Amazon Web Services 계정을 생성하고 활성화하려면 어떻게합니까?를 참조하십시오).
원하는 AWS 리전에 대해 아래에서 Launch Stack 버튼 중 하나를 선택하여 AWS CloudFormation 콘솔을 열고 새 스택을 생성하십시오. AWS Bookstore 데모 앱은 다음 리전에서 지원됩니다.
Region name | Region code | Launch |
---|---|---|
US East (N. Virginia) | us-east-1 | |
US West (Oregon) | us-west-2 | |
EU (Ireland) | eu-west-1 | |
EU (Frankfurt) | eu-central-1 |
예를 들어 스택 이름을 지정하십시오.
MyBookstore |
S3 버킷의 이름을 지정합니다 (소문자로 Amazon S3의 모든 기존 버킷 이름에서 고유해야 함). 버킷 이름 지정 규칙을 참조하십시오.
프로젝트 이름을 제공하십시오 (소문자로 12 자 미만으로 제공). 리소스 이름을 지정할 때 사용됩니다. 테이블, 검색 도메인 등
검토 후 IAM 리소스 생성을 위한 파란색 상자를 선택합니다.
CloudFormation 배포가 완료되면 CodePipeline 콘솔에서 빌드 상태를 확인하고 성공했는지 확인합니다.
애플리케이션을 해체하고 AWS Bookstore 데모 앱과 관련된 모든 리소스를 제거하려면 다음 단계를 따르십시오.
완료되면 모든 관련 리소스를 종료 / 제거하여 AWS 계정에 대한 지속적인 요금을 방지하십시오.
요약 다이어그램
하이 레벨 및 엔드 투 엔드 다이어그램
빌드 아티팩트는 웹 애플리케이션 에셋(책 표지 사진, 웹 그래픽 등)이 유지되는 S3 버킷에 저장됩니다. Amazon CloudFront는 S3의 프런트 엔드 콘텐츠를 캐시하여 CloudFront 배포를 통해 사용자에게 애플리케이션을 제공합니다. 프런트 엔드는 Amazon Cognito 및 Amazon API Gateway 와만 상호 작용합니다. Amazon Cognito는 모든 인증 요청에 사용되는 반면 API Gateway (및 Lambda)는 DynamoDB, Elasticsearch, ElastiCache 및 Neptune에서 상호 작용하는 모든 API 호출에 사용됩니다.
백엔드 인프라의 핵심은 Amazon Cognito, Amazon DynamoDB, AWS Lambda 및 Amazon API Gateway로 구성됩니다. 이 애플리케이션은 사용자 인증을 위해 Amazon Cognito를 활용하고 책, 주문 및 체크 아웃 카트에 대한 모든 데이터를 저장하기 위해 Amazon DynamoDB를 활용합니다. 책과 주문이 추가되면 Amazon DynamoDB Streams는 Amazon Elasticsearch 클러스터 및 Redis 용 Amazon ElasticCache 클러스터를 업데이트하는 AWS Lambda 함수에 업데이트를 푸시합니다. Amazon Elasticsearch는 도서 검색 기능을 강화하고 Amazon Neptune은 사용자의 소셜 그래프 및 도서 구매에 대한 정보를 저장하여 추천을 강화합니다. Redis 용 Amazon ElasticCache는 도서 리더 보드를 강화합니다.
코드는 AWS CodeCommit에서 호스팅 됩니다. AWS CodePipeline은 AWS CodeBuild를 사용하여 웹 애플리케이션을 빌드합니다. 성공적으로 빌드 한 후 CodeBuild는 웹 애플리케이션 자산 (책 표지 사진, 웹 그래픽 등)이 유지되는 S3 버킷에 빌드 아티팩트를 복사합니다. Amazon S3에 업로드하는 것과 함께 CodeBuild는 캐시를 무효화하므로 사용자가 Amazon CloudFront 배포를 통해 상점 첫 화면에 액세스 할 때 항상 최신 경험을 볼 수 있습니다. AWS CodeCommit, AWS CodePipeline 및 AWS CodeBuild는 애플리케이션이 안정된 사용 상태에 있는 동안이 아니라 배포 및 업데이트 프로세스에서만 사용됩니다.
참고 : 제공된 CloudFormation 템플릿에는 애플리케이션을 생성하고 실행하는 데 필요한 리소스의 일부만 포함되어 있습니다. 웹 자산 (이미지 등), Lambda 함수 및 전체 경험을 생성하기 위해 템플릿에서 호출되는 기타 리소스가 있습니다. 이러한 리소스는 공용 S3 버킷에 저장되고 템플릿에서 참조됩니다.
AWS Bookstore 데모 앱의 백엔드는 Amazon DynamoDB를 활용하여 전자 상거래 애플리케이션을 빠르게 개선함에 따라 동적 확장 및 기능 추가 기능을 활성화합니다. 이 애플리케이션은 DynamoDB에 Books, Orders, Cart의 세 테이블을 생성합니다. DynamoDB의 기본 키는 파티션 (해시) 키와 선택적 정렬 (범위) 키로 구성됩니다. 기본 키 (파티션 및 정렬 키 함께)는 고유해야 합니다.
Books Table:
BooksTable { id: string (primary partition key) author: string category: string (index, GSI) cover: string (url to s3 file) name: string price: number rating: number } |
테이블의 파티션 키는 책의 ID 속성입니다. 파티션 키를 사용하면 ID만으로 책을 찾을 수 있습니다. 또한 카테고리 속성에는 글로벌 보조 인덱스 (GSI)가 있습니다. GSI를 사용하면 카테고리 속성에 대한 쿼리를 실행하고 카테고리 경험별로 도서를 작성할 수 있습니다.
향후 애플리케이션 업데이트를 위해 Elasticsearch를 통해 카테고리별로 검색 / 필터링 결과를 반환 할 계획입니다. 또한 이 샘플 응용 프로그램에는 개별 도서에 대한 페이지가 없기 때문에 "설명"속성이 없습니다. 이것은 사용자가 추가하고자 하는 것일 수 있습니다.
Order Table:
OrdersTable { customerId: string (primary partition key) orderId: string (uuid, primary sort key) books: bookDetail[] orderDate: date } |
bookDetail { bookId: string customerId: string quantity: number price: number } |
주문 테이블의 파티션 키는 고객 ID입니다. 이를 통해 고객 ID만으로 고객의 모든 주문을 조회 할 수 있습니다.
Cart Table:
CartTable { customerId: string (primary partition key) bookId: string (uuid, primary sort key) price: number quantity: number } |
장바구니 테이블은 고객의 저장된 장바구니에 대한 정보를 저장합니다.
Amazon API Gateway는 Frontend(Amazon CloudFront, Amazon S3)와 Backend(데이터베이스 등)를 호출하는 AWS Lambda 간의 인터페이스 계층 역할을합니다. 다음은 애플리케이션이 사용하는 다양한 API입니다.
Books (DynamoDB)
GET /books (ListBooks)
GET /books/{:id} (GetBook)
Cart (DynamoDB)
GET /cart (ListItemsInCart)
POST /cart(AddToCart)
PUT /cart (UpdateCart)
DELETE /cart (RemoveFromCart)
GET /cart/{:bookid} (GetCartItem)
Orders (DynamoDB)
GET /orders (ListOrders)
POST /orders (Checkout)
Best Sellers (ElastiCache)
GET /bestsellers (GetBestSellers)
Recommendations (Neptune)
GET /recommendations (GetRecommendations)
GET /recommendations/{:bookId} (GetRecommendationsByBook)
Search (Elasticsearch)
GET /search (SearchES)
AWS Lambda는 아키텍처 다이어그램에 표시된 것처럼 애플리케이션을 실행하기 위해 몇 가지 다른 위치에서 사용됩니다. 템플릿의 일부로 배포 된 중요한 Lambda 함수는 아래에 나와 있으며 functions 폴더에서 사용할 수 있습니다. 응답 필드가 비어있는 경우 애플리케이션은 성공 또는 실패에 대해 각각 statusCode 200 또는 500을 리턴합니다.
Redis 용 Amazon ElastiCache는 베스트셀러 / 리더 보드 기능을 제공하는 데 사용됩니다. 즉, 가장 많이 주문 된 책이 베스트셀러 목록의 상단에 동적으로 표시됩니다.
리더 보드 생성을 위해 AWS Bookstore 데모 앱은 ZINCRBY를 활용했습니다. "키에 저장된 정렬 된 세트에서 멤버의 점수를 증분별로 증가시킵니다. 정렬 된 집합에 멤버가 없으면 점수가 증가하여 추가됩니다 (이전 점수가 0.0 인 것처럼). 키가 없으면 지정된 멤버를 단독 멤버로 사용하여 새로운 정렬 된 집합이 생성됩니다.”
리더 보드를 채우는 정보는 DynamoDB 스트림을 통해 DynamoDB에서 제공됩니다. 주문이 접수되고 이후에 Orders 테이블에서 생성 될 때마다 Lambda로 스트리밍되어 Redis 용 ElastiCache의 캐시를 업데이트합니다. 이 정보를 전달하는 데 사용되는 Lambda 함수는 UpdateBestSellers입니다.
Neptune은 사용자, 책으로 구성된 소셜 그래프를 제공합니다. 추천은 구매 한 책 (예 : 주문 목록)에 대해서만 제공됩니다. 서점 홈페이지에 추천 도서 5 위권이 나와 있습니다.
Amazon Elasticsearch Service는 검색 창의 모든 화면 상단에서 사용할 수있는 서점 웹 애플리케이션의 검색 기능을 강화합니다. 사용자는 제목, 저자 및 카테고리로 검색 할 수 있습니다. 템플릿은 Elasticsearch 서비스에서 검색 도메인을 생성합니다.
서비스 연결 역할을 먼저 생성하는 것이 중요합니다 (CloudFormation 템플릿에 포함됨).
Amazon Cognito는 서점 애플리케이션에 대한 사용자 계정 생성 및 로그인을 처리합니다. 데모의 목적을 위해 서점은 로그인 후에 만 검색 할 수 있으며, 이는 다양한 유형의 웹 앱 아키텍처를 나타낼 수 있습니다. 사용자는 웹 앱의 일부를 공개적으로 사용할 수 있고 다른 부분은 로그인시 사용할 수있는 아키텍처를 분리하도록 선택할 수도 있습니다.
사용자 인증
Amazon Cognito는 Amazon API Gateway에서 Lambda 로의 모든 요청과 함께 모든 사용자에 대해 CognitoIdentityID (AWS Bookstore 데모 앱이 고객 ID로 사용)를 전달하여 서비스가 어떤 사용자가 무엇을하고 있는지 인증하는 데 도움을 줍니다.
Amazon CloudFront는 사용자가 인터페이스 하는 웹 애플리케이션 프런트엔드를 호스팅 합니다. 여기에는 페이지 및 이미지와 같은 웹 자산이 포함됩니다. 데모 목적으로 CloudFormation은 S3에서 이러한 리소스를 가져옵니다.
CloudWatch에서 제공하는 기능은 웹 앱의 최종 사용자에게 노출되지 않으며 개발자 / 관리자는 CloudWatch 로그, 경보 및 그래프를 사용하여 웹 애플리케이션의 사용량과 성능을 추적 할 수 있습니다.
CloudWatch와 마찬가지로 CodeCommit, CodePipeline 및 CodeBuild에서 제공하는 기능은 웹 앱의 최종 사용자에게 노출되지 않습니다. 개발자 / 관리자는 이러한 도구를 사용하여 응용 프로그램이 업데이트되고 개선 될 때 준비하고 배포 할 수 있습니다.
AWS Bookstore 데모 앱 사용에 관심을 가져 주셔서 기쁩니다! AWS를 막 시작하고 기능적인 애플리케이션을 시작하고 실행하려는 경우 시작하기에 좋은 곳입니다. 사용자 지정 응용 프로그램을 분기하여 빌드 할 샘플 전체 스택 응용 프로그램을 찾고있는 경우에도 똑같이 유용합니다. 기여 및 제안 된 추가를 통해 개발자의 참여를 권장합니다. 물론 자신 만의 버전을 만들 수 있습니다!
자세한 내용은 기여 지침을 참조하십시오.
풀 스택 웹 애플리케이션의 더 기본적인 예제는 AWS Bookstore 데모 앱이 구축 된 AWS 풀 스택 템플릿을 확인하십시오. 개요 섹션에서 언급했듯이 AWS Full-Stack 템플릿은 기본 웹 애플리케이션을 시작하고 실행하는 데 필요한 기본 서비스, 구성 요소 및 연결을 제공합니다. 사용자는 여행 예약 도구, 블로그 또는 다른 웹 앱 등 원하는 모든 애플리케이션을 생성하기 위해 AWS Full-Stack 템플릿을 기반으로 구축 할 수 있습니다. 이 AWS Bookstore 데모 앱은 AWS Full-Stack 템플릿을 사용하여 생성 할 수있는 항목의 한 예일뿐입니다.
AWS Bookstore 데모 앱에 대한 질문이 있거나 팀에 문의하려면 GitHub에 의견을 남겨주세요.
Demo URL: https://d14dfjebxkmbor.cloudfront.net/
해당 URL은 삭제 될 수 있습니다. (2020-11-09 배포 테스트중)