🥞 BE
home

Web Application with Serverless

Date
2024/05/06
Category
DevOps
Tag
AWS
Detail

DynamoDB table 생성하기

DynamoDB는 AWS의 NoSQL 데이터서비스이다. 기존에 흔히 사용하는 Oracle이나 Mysql의 경우, 데이터를 보관하는 형태인 스키마를 정의하고, 이 스키마를 이용해서 데이터를 저장하게 된다.
하지만 이 DynamoDB 와 같은 NoSQL 데이터베이스를 이용하면 이런 스키마 없이 데이터를 원하는 형태로 자유롭게 저장할 수 있다. 또한, AWS의 완전관리형 서비스인만큼 서버 관리도 신경쓰지 않아도 된다.
서비스에 연결할 DynamoDB 테이블을 만들게 되면 멤버의 이름과 성격을 저장해 놓을 수 있다.
hello-member 테이블을 생성하고, Partition key에는 name을 설정한다.
이렇게 name 이라는 기본키를 가진 hello-member 테이블을 생성하였다. 이제 앱서버 기능을 하는 Lambda를 생성하고 코드를 작성해 보자.

Lambda로 앱서버 생성하기

Lambda는 AWS 의 대표적인 서버리스 서비스로, 서버에 대해서 고민을 하지 않고 서비스를 간단하게 만들 수 있도록 도와준다.
많은 요청이 발생할 때에도 Lambda는 자동으로 확장되고, 관리되므로 걱정하지 않고 서비스에만 집중할 수 있다. 추가하고 싶은 기능이나, 간단한 서비스를 만들 때 간단히 Lambda 를 이용할 수 있다.
Lambda를 통해서 사진 이미지의 썸네일 버젼을 만드는 기능을 만들수도 있고, 간단하게 데이터 분석을 하고 싶을 때에도 이용할 수 있다. 좀 더 익숙해 지면 AWS 의 이벤트 서비스들과 연동해서 이벤트가 발생했을 때 Lambda 의 기능을 이용해서 이벤트를 처리하는 식으로 사용할 수도 있다.
Author from scratch를 선택하고,
Function name : api-service-create
Runtime : Python 3.9
Permission은 직접 지정한다.
Create a new role from AWS policy templates를 누르고, my-lambda-role이름으로 Simple microservice permissions를 지정하여 생성한다.
Code source 부분에 다음의 코드를 복붙한다.
이 코드는 멤버의 이름과 기분 상태를 랜덤으로 매핑시켜주고, 이를 DynamoDB에 저장하는 기능이다.
이후 test를 눌러, my-api-test를 만들어준 후, 저장한다.
DynamoDB에서 확인해보면, Items returned에 Lambda로 입력한 값이 잘 저장된 것을 확인할 수 있다.
여기까지 됐으면, DynamoDB와 Lambda은 잘 만들어 졌고, 제대로 동작하는걸 확인했다. 이제 인터넷을 통해 람다를 실행할수 있도록 인터넷 주소를 만들어 람다와 연결할 예정이다. 그러기 위해서 API Gateway을 배워보자.

API Gateway 구성하기

API GatewayAWS의 API 관리 서비스이다. API 란 외부에서 기업의 서비스를 이용하려고 할때 규격을 정해주는 것을 의미한다. 일종의 형식을 정해놓고, 이 형식대로 기업의 서비스를 호출하면 기업은 서비스를 제공해 주는 약속이라고 생각하시면 된다. API Gateway는 이런 API 를 관리해주고 API 를 통해 외부에서의 호출이 왔을때 대문 역할을 하는 AWS 서비스이다.
API Gateway 서비스를 생성하고 lambda 와 연결해서 좀 더 완성도 높은 서비스를 만들어 보자.
REST API를 선택 후, my-api를 생성한다.
Create Method 화면이 나오고 여기서 API를 구성할 수 있다.
Method Type : GET
Integration type : Lambda Function
Lambda Proxy integration : ON
Lambda Function : api-service-create
위의 옵션으로 설정 후, Create method.
이후, GET method에 대한 Test를 진행한다. Status가 200으로 잘 나오면 성공.
API gateway 를 만들었지만, 바로 호출하면 CORS 관련 에러가 나게 될 것이다. 따라서 호출이 정상적으로 이루어지기 위한 추가 설정을 해보자.
생성한 API의 Resources 메뉴에서 Enable CORS 를 클릭하고, 생성한 GET Method를 선택 후 Save.
api 가 정상적으로 작동된다는 것을 확인하고, 추가 설정을 마쳤으니 이제 이 api 를 실제 사용할 수 있게 준비하자. Resources 화면에서 Deploy API 를 누른다.
Stage : *New stage*
Stage name : dev
완료되면 Invoke URL 이 나오게 된다. 이 URL 은 사람마다 모두 다르다. 복사해서 메모장에 기록.
url을 실행하면 아래와 같이 나온다. 문구는 랜덤으로 생성된다.
마지막으로 S3의 정적 웹사이트 호스팅 기능을 사용하여 Web 서버를 대체한다. S3 bucket에 index.html 파일을 배포하고 권한을 부여하여, 전세계 사용자들이 내가 만든 웹애플리케이션에 접근하여 사용할수 있도록 해보자.
현재 Lambda와 Dynamodb 테이블을 생성하고 API Gateway를 연결한 것이다.

S3로 웹서버 기능 사용하기

S3어디서나 원하는 양의 데이터를 검색할 수 있도록 구축된 객체 스토리지이다. Amazon Simple Storage Service(Amazon S3)는 업계 최고 수준의 확장성, 데이터 가용성, 보안 및 성능을 제공하는 객체 스토리지 서비스이다.
사용자는 규모와 업종에 관계없이 원히는 양의 데이터를 저장하고 보호하여 데이터 레이크, 클라우드 네이티브 애플리케이션 및 모바일 앱과 같은 거의 모든 사용 사례를 지원할 수 있다. 비용 효율적인 스토리지 클래스와 사용이 쉬운 관리 기능을 통해 비용을 최적화하고, 데이터를 정리하고, 세분화된 액세스 제어를 구성하여 특정 비즈니스, 조직 및 규정 준수 요구 사항을 충족할 수 있다.
S3의 정적 웹사이트 호스팅 기능을 활성화하여 S3의 웹서버 기능을 사용해 보자.

S3 Bucket 생성

Create bucket을 누르고, S3 Bucket을 생성한다.
Bucket name : my-bucket-[random number]
여기서 [random number]는 무작위 숫자이며, 대괄호를 빼야한다. (Bucket name은 전세계에서 유일해야 함.) 이후 다음의 그림처럼 옵션을 지정하고 Bucket을 생성한다.
다음의 코드를 복사하여, index.html 파일로 저장한다. 이후, 50번째 줄의 URL을 앞서 api gateway에서 만든 url로 대체한다. 이후 다시 저장.
만든 index.html 파일의 Upload를 수행한다.

S3 정적 웹사이트 호스팅 기능 활성화하기

Properties 탭을 누르고, Static website hosting 섹션을 Edit 한다.
index document입력란에 index.html을 입력한다. 처음 주소로 접속할 때 읽어 들일 html파일을 지정해 주는 부분이다.
위 설정이 잘 되었다면, 정적 웹사이트 기능이 활성화되고, 아래와 같이 주소가 생성된다.
아직 외부에서 접근할수 있는 권한이 없어서 정적 웹사이트가 차단되어 있다. 외부에서 파일을 읽어 들일수 있도록 권한을 부여해보자. 아래와 같이 Permissions 탭으로 이동한 후, Bucket policy 섹션에 Edit 버튼을 눌러서 수정한다.
다음 내용을 복사하여, Bucket Policy 편집창에 붙여넣는다. 그리고 11,12번째 줄의 [본인버킷번호] 부분을 본인의 Bucket 랜덤 넘버로 변경한다. 그리고 Save changes 버튼을 눌러서 저장.
정적 웹사이트 호스팅 주소를 브라우저에 붙여 넣어보자. 아래 화면 처럼 나오면 Who are you? 버튼을 눌러준다. 람다가 실행되고 Dynamodb에 기록이 잘되었는지 확인한다.
이렇게 아래와 같은 서버리스 아키텍처를 모두 완성했다.