AWS 서버리스로 서버 없이 간단한 웹 애플리케이션 만들기
AWS (Amazon Web Services) 서버리스는 서버를 관리하거나 스케일링을 할 필요 없이 서버리스 애플리케이션을 배포하고 실행할 수 있는 클라우드 컴퓨팅 모델이다.
기존의 IT 환경에서는 물리적인 서버를 사용하여 애플리케이션을 운영하였으나, 이러한 방식에서는 서비스 트래픽이 급증할 경우 인스턴스의 스케일 아웃에 시간이 많이 소요되어 급격하게 증가하는 서비스 트래픽에 대응하기에 어려움이 있었다. 그러다 AWS EC2 인스턴스와 같은 가상머신 기술을 사용하면서 하드웨어를 직접 관리할 필요가 없어졌으며, 자원의 스케일링 자동화 기능을 통해 서버 인스턴스를 유연하게 확장 및 축소할 수 있게 되었다.
더 나아가 Amazon API Gateway, AWS Lambda와 같은 이벤트 기반 함수를 이용하면서 서버리스 컴퓨팅이 가능해졌다.
이러한 변화는 전통적인 IT 패러다임에서 클라우드 컴퓨팅 패러다임으로의 전환을 나타내는데, 이를 통해 기업은 많은 이점을 얻을 수 있게 되었다.
서버리스 특징
- 서버의 관리와 프로비전 없이 코드를 실행 할 수 있다.
- 사용한 만큼만 지불한다.(onDemand)
- 빠르게 배포하고 업데이트가 가능하다.
- 서버리스 환경을 잘 활용할 수 있는 아키텍쳐 설계가 필요하다.
-> 병렬처리
-> 이벤트 기반 아키텍처 등
🖇️ AWS 서버리스를 사용해야 하는 이유
- 높은 확장성: 애플리케이션이 사용하는 리소스가 증가하면 AWS가 자동으로 이에 대응하여 확장합니다. 이로 인해 서버의 스케일링과 관리에 대한 부담이 줄어든다.
- 저렴한 비용: 사용한 만큼만 비용이 청구됩니다. 이는 서버를 유지보수하고 관리하는 데 드는 비용을 줄여준다.
- 빠른 개발: 개발과 배포가 빠릅니다. 개발자는 애플리케이션의 핵심 로직에 집중할 수 있으며, AWS는 배포 및 확장을 자동으로 처리한다.
- 보안: AWS에서 관리되는 보안 기능을 활용할 수 있습니다. 이는 사용자 데이터와 인프라를 보호할 수 있도록 도와준다.
- 운영의 편리함: 서버를 따로 관리할 필요가 없기 때문에 운영이 편리합니다. 이로 인해 개발자는 애플리케이션 로직에만 집중할 수 있고 운영 부분은 AWS에서 자동으로 처리된다.
🔎 서버리스 웹 애플리케이션 실습에서 사용되는 서비스
- AWS Lambda
- Amazon API Gateway
- Amazon DynamoDB
AWS Lambda
: 서버리스의 대표적인 서비스로 서버를 관리하지 않고 코드를 실행할 수 있다.
- 이벤트 기반으로 동작하여 특정 이벤트 발생 시 실행되어 개발자는 코드 작성에만 집중할 수 있다.
- 일반적으로 서비스를 운영할 때 CPU 사용률이나 메모리 사용량을 약 70% 정도로 설정해 두고 넘아갈 경우 스케일링되도록 구성을 하게 되는데, 람다를 사용한다면 항상 100%의 사용량을 달성할 수 있고 사용하지 않는 동안 유휴 상태로 금액을 지불하지 않기 때문에 쓴 만큼만 비용을 지불할 수 있다.
고려 사항
- 런타임 제한 : 최대 실행 시간이 15분이므로 장기 실행 작업이나 복잡한 로직에는 적합하지 않다.
- 초기 지연시간 발생(Cold Start) : 언어에 따라 다르지만 약 5분여 이상 호출이 되지 않는다면 Cold 상태로 바뀌어 다시 호출될 경우 약 1000ms 정도의 지연시간을 가지게 되어 민감한 애플리케이션에는 적합하지 않다.
사용 예
공통 코드 모듈화
- 여러 함수에서 코드를 재사용하려는 경우 람다를 사용하면 간단하게 처리가 가능하다.(ex. 로깅)
이미지 크기 조정
- 이미지를 S3 버킷에 업로드하면 람다를 실행하여 크기를 다른 차원(썸네일 등)으로 조정하고 다시 저장할 수 있다.
Amazon API Gateway
: API를 생성, 배포, 운영할 수 있는 완전 관리형 서비스로, 다양한 클라이언트 애플리케이션에서 사용될 수 있는 RESTful API를 구축할 수 있다.
- 트래픽 제어, API 호출에 대한 모니터링, 사용자 인증 관리 등의 역할을 수행할 수 있다.
Amazon API Gateway VS 자체 Gateway
Amazon API Gateway 사용의 장점
- 관리형 서비스 : 인프라, 유지 관리 또는 확장에 신경 쓸 필요가 없다.
- 보안 : IAM, AWS Cognito 등 과 통합되어 인증 및 권한 부여를 위한 여러 옵션을 제공한다.
- AWS 서비스와의 통합 : AWS Lambda, DynamoDB 및 S3와 같은 AWS 서비스와 원활하게 통합되므로 서버리스 애플리케이션 및 마이크로서비스를 쉽게 구축할 수 있다.
자체 Gateway 사용의 장점
- 공급업체 종속 : AWS에 대한 의존도가 높아져 클라우드 제공업체를 전환하거나 다중 클라우드 전략으로 작업해야 하는 경우 유연성이 저하된다.
- 비용 : Amazon API Gateway는 API 호출 수, 데이터 전송 및 캐싱 같은 추가 기능에 따라 요금이 부과된다.
- 사용자 정의 제한 : Amazon API Gateway는 많은 기능을 제공하지만, 특정 기능을 구현하려고 할 때 제한이 있을 수 있다.
Amazon DynamoDB
: 완전 관리형 NoSQL 데이터베이스 서비스로, 키-값 데이터 모델을 기반으로 하며 빠른 속도와 확장성, 신뢰성 등의 이점을 제공하여 간편한 운영 및 관리가 가능하다.
- 대기 시간이 짧고 처리량이 많은 작업을 위해 설계되어 실시간 및 빠른 속도를 보장해야 하는 작업에 적합하다.
- 트래픽 변동을 처리하도록 자동으로 확장되어 고가용성과 성능을 보장한다.
고려 사항
제한된 쿼리 기능 : 다른 DB에서 사용할 수 있는 조인 및 트랜잭션 같은 일부 쿼리 기능이 없다.
비용 : 사용량에 따른 비용이 청구되기 때문에 사용 패턴에 따라 다른 DB에 비해 비용이 높을 수 있다.
🚀 실습
Lambda로 웹서버 생성하기
1. 웹페이지를 보이기 위한 Webpage Lambda 생성
Lambda > Functions > Create function
함수 이름과 언어를 설정하고 Create function 버튼을 클릭
1. 소스 붙여넣기
2. Deploy 버튼 클릭
3. URL 경로 이동
해당 코드는 HTTP 서버의 핸들러 함수로,
브라우저에서 실행될 때 버튼이 표시되며, 버튼을 클릭하면 checkEvent() 함수가 호출돼 URL로 GET 요청을 보낸다.
import json
def lambda_handler(event, context):
response = {
"statusCode": 200,
"statusDescription": "200 OK",
"Access-Control-Allow-Origin" : "*",
"isBase64Encoded": False,
"headers": {
"Content-Type": "text/html; charset=utf-8"
}
}
response['body'] = """<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>
"""
return response
아직 URL을 설정하지 않아 버튼을 클릭하면 오류가 반환 됨
2. 버튼의 기능을 추가할 Api service lambda 생성
Webpage Lambda 생성 방식과 동일하게 생성하되,
이번에는 Permissions을 직접 생성하고, AWS DynamoDB와 연결
Function name 으로는 api-service-create를 입력하고, Runtime으로는 python 3.9 선택
Permissions 섹션에서 Execution role 의 Create a new role from AWS policy templates 를 선택합니다. Role name으로는 my-lambda-role으로 작성 후 Policy templates 항목에 Simple microservice permissions DynamoDB 를 추가하고 Create
동일하게 소스 붙여넣고 Deploy 클릭
여기까지 만들었다면, 두 개의 Lambda 함수를 만든 것
이제 이 function에 연결할 dynamoDB 를 생성할 차례
DynamoDB 생성
DynamoDB > create table 버튼 클릭
Table name 은 hello-member 로, Partition key는 name 으로 작성 후 create table 버튼을 눌러서 생성
다음으로는 api gateway 생성
Api gateway 생성
API Gateway > APIs > REST API 에서 Build 버튼 클릭
protocol 로는 REST 를, Create new API 로는 New API, Setting 에서는 API name 을 my-api 입력 후 create API 버튼 클릭
Actions > Create Method 클릭 > GET 선택 > 체크표시 클릭하여 저장 > api를 구성할 수 있는 페이지
Integration type 을 Lambda Function 을 선택하고, Use Lambda Proxy integration 는 클릭.
Lambda Function 에 api-service-create 로 이름을 작성 후 Save
생성한 api를 실제 사용할 수 있도록 설정
APIs > Actions > Deploy API
Deployment stage 에서는 [New Stage] 를 선택하고 Stage name 에서는 dev 입력 후 Deploy 클릭
저장 후 보이는 URL 복사!!
현재까지 진행 상태
Lambda 와의 연결
좀 전에 만들었던 simple-webpage 람다로 이동 후 URL을입력하세요 라는 문구를 복사해 온 URL 로 대체 후 Deploy
모든 세팅 끝
아까 생성했던 simple-webpage 람다의 URL로 이동 후 Who are you? 버튼을 클릭하면 랜덤값dl 출력 되는 거 확인 가능
또한 DynamoDB > Tables > hello-member 테이블 > Explore table items 버튼 클릭하면 실제로 값이 저장된 것 확인 가능
이렇게 해서 하나의 완성된 서비스를 만들어 보았다. 서버를 생각할 필요없이 서비스 구성에만 집중할 수 있다는 것이 서버리스의 장점이다.