DynamoDB 는 AWS의 NoSQL 데이터서비스입니다. 기존에 흔히 사용하시는 Oracle이나 Mysql의 경우, 데이터를 보관하는 형태인 스키마를 정의하고, 이 스키마를 이용해서 데이터를 저장하게 됩니다. 하지만 이 DynamoDB 와 같은 NoSQL 데이터베이스를 이용하시면 이런 스키마 없이 데이터를 원하는 형태로 자유롭게 저장할 수 있습니다. 또한, AWS의 완전관리형 서비스인만큼 서버 관리도 신경쓰지 않으셔도 됩니다.
이렇게 name 이라는 기본키를 가진 hello-member 테이블을 생성하였습니다. 이제 앱서버 기능을 하는 Lambda를 생성하고 코드를 작성해 보겠습니다. 우리는 전체 아키텍처에서 아래 처럼 DynamoDB 테이블을 생성한겁니다.
Lambda 는 AWS 의 대표적인 서버리스 서비스로, 서버에 대해서 고민을 하지 않고 서비스를 간단하게 만들 수 있도록 도와드립니다.
많은 요청이 발생할 때에도 Lambda는 자동으로 확장되고, 관리되므로 걱정하지 않고 서비스에만 집중할 수 있습니다. 추가하고 싶은 기능이나, 간단한 서비스를 만드실 때 어렵게 생각하지 말고 Lambda 를 이용할 수 있습니다.
Lambda를 통해서 사진 이미지의 썸네일 버젼을 만드는 기능을 만들수도 있고, 간단하게 데이터 분석을 하고 싶을 때에도 이용할 수 있습니다. 좀 더 익숙해 지시면 AWS 의 이벤트 서비스들과 연동해서 이벤트가 발생했을 때 Lambda 의 기능을 이용해서 이벤트를 처리하는 식으로 사용하실 수도 있습니다. 가능성이 무궁무진한 서비스입니다.
import json
import boto3
import random
import json
def lambda_handler(event, context):
member_name = ['Ama','Jone','Zon','Penny','Jessie']
member_status = ['Happy','Sad','Serious','Satisfied','Free']
dynamodb = boto3.resource('dynamodb',endpoint_url='http://dynamodb.ap-northeast-2.amazonaws.com')
member_table = dynamodb.Table('hello-member')
name = member_name[random.randint(0,4)]
status = member_status[random.randint(0, 4)]
member_table.put_item(
Item={
'name': name,
'status': status,
}
)
documents = {'name':name,'status':status}
print(documents)
return {
'statusCode': 200,
'headers': {'Access-Control-Allow-Origin': '*'},
'body': json.dumps(documents)
}
우리는 전체 아키텍처에서 아래 처럼 Lambda와 Dynamodb 테이블을 생성하고 연결한 겁니다.
API Gateway 는 AWS의 API 관리 서비스입니다. API 란 외부에서 기업의 서비스를 이용하려고 할때 규격을 정해주는 것을 의미합니다. 일종의 형식을 정해놓고, 이 형식대로 기업의 서비스를 호출하면 기업은 서비스를 제공해 주는 약속이라고 생각하시면 됩니다. API Gateway는 이런 API 를 관리해주고 API 를 통해 외부에서의 호출이 왔을때 대문 역할을 하는 AWS 서비스입니다.
이번 세션에서는 API Gateway 서비스를 생성하고 lambda 와 연결해서 좀 더 완성도 높은 서비스를 만들어 보겠습니다.
완료되면 Invoke URL 이 나오게 됩니다. 이 URL 은 사람마다 모두 다릅니다. 이 URL 은 반드시 복사해서 메모장에 붙어넣으시기 바랍니다. 바로 다음 단계에서 활용합니다.
이 URL을 브라우저에 붙여넣어 접속해 봅니다. 이 작업을 URL을 통해 Lambda를 호출한겁니다. 아래처럼 나오면 성공한겁니다. 문구는 랜덤으로 만들어지는 거라서 아래와 다를 수 있습니다. 이 URL을 다음장에서 html파일에 붙여 넣을겁니다.
이제 다 왔습니다. 마지막으로 S3의 정적 웹사이트 호스팅 기능을 사용하여 Web 서버를 대체할겁니다. S3 bucket에 index.html 파일을 배포하고 권한을 부여하여, 전세계 사용자들이 제가 만든 웹애플리케이션에 접근하여 사용할수 있도록 할겁니다.
우리는 전체 아키텍처에서 아래 처럼 Lambda와 Dynamodb 테이블을 생성하고 API Gateway를 연결한 겁니다.
S3는 어디서나 원하는 양의 데이터를 검색할 수 있도록 구축된 객체 스토리지 입니다. Amazon Simple Storage Service(Amazon S3)는 업계 최고 수준의 확장성, 데이터 가용성, 보안 및 성능을 제공하는 객체 스토리지 서비스입니다. 고객은 규모와 업종에 관계없이 원히는 양의 데이터를 저장하고 보호하여 데이터 레이크, 클라우드 네이티브 애플리케이션 및 모바일 앱과 같은 거의 모든 사용 사례를 지원할 수 있습니다. 비용 효율적인 스토리지 클래스와 사용이 쉬운 관리 기능을 통해 비용을 최적화하고, 데이터를 정리하고, 세분화된 액세스 제어를 구성하여 특정 비즈니스, 조직 및 규정 준수 요구 사항을 충족할 수 있습니다.
이번 세션에서는 S3의 정적 웹사이트 호스팅 기능을 활성화하여 S3의 웹서버 기능을 사용해 보겠습니다.
<html>
<head>
<meta charset="utf-8" name="viewport"
content="width=device-width, height=device-height, minimum-scale=1.0, maximum-scale=1.0, initial-scale=1.0">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<title>Hello World!</title>
<style>
#title {
font-family: arial;
font-size: 2em;
color: #eb971a;
margin-top: 50px;
text-align: center;
}
button {
background-color: #eb971a;
border: none;
color: white;
border-radius: 5px;
width: 40%;
height: 35px;
font-size: 13pt;
margin-top: 30px;
text-align: center;
}
#sentence {
font-size: 17pt;
margin-top: 30px;
font-weight: bold;
color: #eb971a;
}
</style>
</head>
<body>
<p id="title">Hello World From <b>Lambda</b></p>
<hr id="lambda-line" width="800px" align="center" color="#eb971a;">
<center><button onclick="checkEvent();">Who are you?</button></center>
<center>
<div id="sentence"></div>
</center>
</body>
<script type="text/javascript">
function checkEvent() {
$.ajax({
type: "GET",
url: "URL을입력하세요",
dataType: 'json',
success: function (data) {
document.getElementById('sentence').innerHTML = data.status + " " + data.name
},
error: function (error) {
alert('ERROR::');
console.log(error)
}
});
}
</script>
</html>
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1709405011428",
"Action": [
"s3:GetObject"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::my-bucket-[본인버킷번호]",
"arn:aws:s3:::my-bucket-[본인버킷번호]/*"
],
"Principal": "*"
}
]
}
정적 웹사이트 호스팅 주소를 브라우저에 붙여 넣어 봅니다. 아래 화면 처럼 나오면 Who are you? 버튼을 눌러줍니다. 람다가 실행되고 Dynamodb에 기록이 잘되었는지 확인합니다.
이렇게 우리는 아래와 같이 서버리스 아키텍처를 다 완성하였습니다.