[AWS] Serverless Architecture
말 그대로 서버가 아예 없는게 아니고 개발자가 직접 서버를 관리 할 필요가 없는 아키텍처를 서버리스 아키텍처라고 부른다.
AWS에서는 Gateway / Lambda / DynamoDB 서비스를 통해 서버리스 아키텍처를 제공한다.
Lambda는 이벤트 기반으로 다양한 언어로 작성된 소스코드를 실행하는 서버리스 컴퓨팅 서비스로, 여러 AWS 서비스와 통합되어서 사용되는 경우가 많다.
EC2를 사용할 때는 사용자가 직접 서버 설정, OS 관리 등 인프라 관련 작업을 수행해 줘야 했지만, Lambda는 AWS가 직접 인프라를 관리 해 주고 이벤트가 발생할 때만 소스가 실행돼 서비스 비용 계산도 편하다.
import boto3
s3 = boto3.client('s3')
def lambda_handler(event, context):
for record in event['Records']:
bucket_name = record['s3']['bucket']['name']
file_name = record['s3']['object']['key']
print(f"파일업로드: {file_name} in {bucket_name}")
return {
"statusCode": 200,
"body": "파일업로드 처리"
}
boto3은 파이썬에서 AWS API를 사용하는 라이브러리로, 사용자가 S3 버킷에 파일을 업로드하면 Lambda가 실행돼 작성한 파이썬 함수가 실행된다.
이미지를 업로드했을 때 이미지 크기 및 화질을 조정하는 것 처럼 다양한 비즈니스 로직을 작성할 수 있다.
EventBridge와 Lambda를 연동해 EC2 인스턴스를 구동하지 않고 Cron Job을 구현할 수 있다.
Lambda 자체에는 스케쥴 기능이 없으니 EventBridge를 사용하고, 비즈니스 로직은 Lambda로 작성해 서버리스 환경에서 작동하는 스케쥴러를 구현할 때 사용한다.
기본적으로 Lambda는 Auto Scaling을 지원하지만, Concurrency Limit를 설정해 해당 수치를 초과해서 확장되지는 않는다.
초과된 요청에 대해서는 Throttle으로 429 에러가 발생하고 지연되거나 실패하게 된다.
Reserved Concurrency 값을 지정해 위에서 정의한 lambda_handler 함수가 최대 몇 개 까지 동시에 실행될 수 있는지를 정의할 수 있고, 해당 값을 통해 동시성을 조작한다.
Lambda가 자바같은 컴파일 언어를 실행하는 경우 바이트코드 변환 및 컴파일 과정이 추가로 수행되어야 해서 인터프리터 언어를 실행할 때 보다 좀 더 오래 걸린다.
AWS는 비용 절감을 위해 Lambda 실행 환경을 일정 시간이 지나면 종료시키는데, 이후 새로운 요청이 들어올 경우 다시 실행 환경을 구축해야 하니 초기 지연이 발생한다.
이 지연 시간을 Cold Start라고 부르는데 이를 해결하기 위해 실행 환경을 저장하는 SnapStart방식을 사용한다.
자바의 경우 JVM 웜업으로 인해 초기 실행 시 최적화되지 않은 상태로 동작하니 성능이 제대로 나오지 않을 수 있는데, 이런 경우에도 SnapStart를 적용하는게 도움이 된다.
public class LambdaInvoker {
public static void main(String[] args) {
AWSLambda lambdaClient = AWSLambdaClientBuilder.defaultClient();
InvokeRequest request = new InvokeRequest()
.withFunctionName("myLambdaFunction")
.withPayload("{ "key": "value" }");
InvokeResult result = lambdaClient.invoke(request);
String response = new String(result.getPayload().array(), StandardCharsets.UTF_8);
}
}
스프링같은 웹 백엔드 프레임워크가 람다를 호출하는 경우도 있지만, AWS API Gateway를 사용해서 람다를 직접 호출하는게 좀 더 일반적이다.
클라이언트가 API Gateway에 HTTP 요청을 보내면, 해당 게이트웨이가 람다를 호출하고 클라이언트의 응답을 반환하는 방식으로 완전한 서버리스 아키텍처를 활용할 수 있다.
이 때 인증이 필요한 경우 AWS Cognito를 사용해 Gateway에서 JWT를 발급받는다.
하나의 Lambda 호출로 비즈니스 로직을 모두 구현하기 힘든 경우 스프링 배치의 Step 처럼 서버리스 오케스트레이션 기능을 제공하는 AWS Step 서비스를 사용하자.
'DevOps > Amazon Web Service' 카테고리의 다른 글
[AWS] Decoupling System (0) | 2025.02.19 |
---|---|
[AWS] S3 - Simple Storage Service (0) | 2025.01.22 |
[AWS] Route53 (0) | 2025.01.18 |
[AWS] RDS - Relational Database Service (0) | 2025.01.17 |
[AWS] Availability and Scalability (0) | 2025.01.14 |
댓글
이 글 공유하기
다른 글
-
[AWS] Decoupling System
[AWS] Decoupling System
2025.02.19 -
[AWS] S3 - Simple Storage Service
[AWS] S3 - Simple Storage Service
2025.01.22 -
[AWS] Route53
[AWS] Route53
2025.01.18 -
[AWS] RDS - Relational Database Service
[AWS] RDS - Relational Database Service
2025.01.17