dailyFocus - Backend
: Serverless web application 개발 흐름을 가볍게 이해할수 있도록 진행한 프로젝트로 가이드가 되도록 작성하였습니다.
<목차>
- Web Application 소개
- AWS 계정 설정
- Back-end 계획하기
- Back-end 구현하기
- Back-end 배포하기
- Back-end 자동 배포하기
- 참고
Web Application 소개
DailyFocus
링크 : http://kd-sp3-dailyfocus.s3-website.ap-northeast-2.amazonaws.com/
Github : https://github.com/jgcman3/dailyfocus-app-backend
가이드를 위해 만든 Web App 은 'Daily Focus' 입니다.
- 몰입을 돕는 시간관리 툴
- "한가지 일에 집중하라"
- 역활 1 : 하나의 mission 을 생성하고 mission 완료시 몰입한 시간을 기록한다.
- 역활 2 : 진행한 mision 들을 보여준다.
UX/UI 화면
AWS 계정 설정
AWS Account 생성
IAM User 생성
- Access type 으로 Programmatic access 필수 선택 하세요.
- User에 따른 권한 할당 하세요.
- 생성된 Access key ID 와 Secret access key 를 소중히 보관하세요. 노출시 매우 위험합니다. 누군가 몰래 사용한다면 비용 폭탄을 맞을 수 있어요.
AWS CLI 설정
pip를 이용해서 AWS CLI 설치 하세요.
AWS CLI 에 당신의 Access Key ID 와 Secret key를 입력 하세요.
AWS IAM 으로 계정을 분리 하는 이유 :
- 이력 추적 : cloud Trail 서비스를 통해 누가 어떤 작업들을 진행했는지 이력확인을 할 수 있습니다.
- 보안 강화 : 각각 스스로 access key 를 관리 하므로, 보안을 강화합니다.
- 비용 관리 : cloud 공급자를 통한 서버 구축은 간단한 조작하나가 비용으로 직결됩니다. 개인에게 할당된 access key는 노출시 비용 폭탄( ? ) 발생 할 수 있습니다.
Back-end 계획하기
구현 요소
- 가입 / 로그인
- 미션 Create / Read / Update / Delete
회원 및 인증 관리
- 가입시 요청사항
- 아이디는 email 입력
- 비밀번호 입력
- email 로 전송되 Code 입력
데이터 베이스 : 수집할 항목
- userId : 사용자 식별값
- noteId : 미션의 식별값
- createdAt : 미션 생성 시간
- completedAt : 미션 완료 시간
- content : 미션 내용
요청 창구 : REST API 구성
- path : /notes
- POST method : 미션 Create 동작
- GET method : 미션 목록 Read 동작
- path : /notes/{noteId}
- GET method : 미션 Read 동작
- PUT method : 미션 Update 동작
- DELETE method : 미션 Delete 동작
요청 처리
- 미션 Creat 동작 : create()
- 미션 목록 Read 동작 : list()
- 미션 Read 동작 : get()
- 미션 Update 동작 : update()
- 미션 Delete 동작 : delete()
Back-end 구현하기
구성 요소
AWS 에서는 serverless 아키텍처로 제공하는 서비스들을 이용하여 구성할 수 있습니다.
사용한 AWS 서비스 소개
Web Console 로 Backend 구성하는 방법
아래 순서와 이름으로 생성할 계획입니다.
이번에는 더욱 손쉽게 Serverless Backend를 구성할 수 있는 framework 을 이용하겠습니다.
Serverless Framework 'Serverless' 로 Backend 구성하는 방법
Serverless Framework 로 backend를 구성한다는 것은 Serverless 인프라를 코드로 관리하는 것입니다.
Serverless framework 으로 많이 알려진 것이 'AWS SAM(Serverless Application Model)' 과 'Serverless' 가 있습니다.
이중에 'Serverless'를 사용하겠습니다.
아래와 같이 구성하려고 합니다.
serverless 기본 설정 및 확인
serverless 설치
serverles 의 hello-world 프로젝트 생성
serverless.yml 파일 보고 이해하기
handler.js 람다 파일 보고 이해하기
로컬로 handler.js 람다 응답 테스트 하기 ( Serverless invoke local --function helloWorld )
자신의 AWS Account 계정에 배포하기( serverless deploy -v )
Serverless로 back-end 구현하기
backend 소스 코드 다운로드
aws-sdk package 설치하기
의존성 npm package들 설치
( aws-sdk 패키지를 설치하기 위한 목적입니다. $npm install aws-sdk --save dev 로 대신할 수 있습니다. )
serverless.yml 코드 ( serverless.yml )
람다에서 사용할 DynamoDB lib 모듈 ( libs/dynamodb-lib.js )
람다에서 사용할 Response lib 모듈 ( libs/dynamodb-lib.js )
Create 람다 함수 ( create.js )
List 람다 함수 ( list.js )
Get 람다 함수 ( get.js )
Update 람다 함수 ( update.js )
Delete 람다 함수 ( delete.js )
DynamoDB 테이블 생성 cloudFormation templete 코드 ( resources/dynamodb-table.yml )
Cognito user pool 생성 cloudFormation templete 코드 ( resources/cognito-user-pool.yml )
Cognito identity pool 생성 cloudFormation templete 코드 ( resources/cognito-identity-pool.yml )
API Gateway error 에 대한 CORS 헤더 추가 CloudFormation templete 코드 ( resources/api-gateway-errors.yml )
( 클라이언트에서 " No 'Access-Control-Allow-Origin' header is present on the requested resource " 와 같은 오류 메시지를 발생할 수 있습니다. )
Back-end 배포하기
web console 에서 배포 하기
- web console 에서 생성 및 설정 하는 것 자체가 배포 입니다
IAC 로 관리한 코드를 AWS CloudFormation 통해서 배포하기
- 여기서는 serverless framework 으로 구성한 serverless.yml 파일을 이용하겠습니다.
dailyfocus-app-backend 폴더로 이동
한번에 모두 배포하기
람다 하나씩 배포하기
배포 결과 보기
- 배포 확인 하기
AWS Web console 의 'CloudFormation' 에 스택에 생성되어 있음을 확인하세요.
해당 스택으로 각각의 리소스들( Lambda, API Gateway, DynamoDB )이 생성되어 있습니다.
Back-end 자동 배포하기
CI/CD pipelines for Serverless apps
- CircleCI : https://circleci.com/
- TravisCI : https://travis-ci.com/plans/
- Seed : https://seed.run/
- etc.
'Seed' 를 이용해 자동 배포하기
- 회원가입 : https://seed.run/
- 앱 추가
- Connect a repo : 저장소 선택
- Add a service : templete 파일 지정
- Configure the stages : stage 정보와 AWS IAM Access key, Secret key 입력
- 배포 관리 화면
dev stage로 자동 배포 하기
- prod stage 로 배포 하기
- Promote 버튼 선택
- prod stage 에 배포되는 리소스 내용 확인
- Promote to production 버튼 선택
참고
링크
- AWS site: https://aws.amazon.com/ko/
- Serverless framework : https://serverless.com/
- Serverless stack : https://serverless-stack.com/
- CloudFormation guide : https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide
- DynamoDB guide : https://www.dynamodbguide.com/what-is-dynamo-db
- Amplify javascript library : https://github.com/aws-amplify/amplify-js
- aws-sdk javascript library : https://docs.aws.amazon.com/ko_kr/sdk-for-javascript/?id=docs_gateway
- DailyFocus back-end source code : https://github.com/jgcman3/dailyfocus-app-backend
- DailyFocus front-end source code : https://github.com/jgcman3/dailyfocus-app-frontend
- Seed, CI/CD pipeline for serverless : https://seed.run/
- CircleCI, CI/CD pipeline for serverless : https://circleci.com/
- TravisCI, CI/CD pipeline for serverless : https://travis-ci.com/plans/
댓글
댓글 쓰기