
서버리스 컴퓨팅(Serverless Computing)은 애플리케이션의 인프라와 지원 서비스 계층이 소프트웨어 계층에서 완전히 추상화된 최신 클라우드 기반 애플리케이션 아키텍처입니다. 모든 애플리케이션은 여전히 물리적 서버에서 실행되지만, 서버리스 애플리케이션에서는 이러한 서버 운영의 책임을 Amazon Web Services(AWS)와 같은 클라우드 서비스 제공업체가 맡게 됩니다.
진정한 서버리스 아키텍처 패러다임에서 Lambda 함수 코드는 타사(일반적으로 클라우드 서비스 제공업체)가 호스팅하고 관리하는 인프라에서 실행됩니다. 이때 타사는 프로비저닝, 확장, 부하 분산, 보안 등 인프라 관리 전반을 담당합니다. 또한 AWS 툴킷, 운영체제, 패치, 서버리스 프레임워크, 코드 라이브러리, 지원 서비스까지 모두 관리합니다. 사용자는 애플리케이션이 실제로 사용하는 컴퓨팅 시간에 대해서만 비용을 지불하며, 서버리스 백엔드는 애플리케이션 부하가 증가하거나 감소할 때 자동으로 확장되고 부하를 분산시키므로 비용 효율적이고 확장성이 뛰어납니다.
2024년 전 세계 서버리스 아키텍처 시장 규모는 약 253억 달러로 추정되며, 2025년부터 2030년까지 연평균 성장률(CAGR) 14.1%로 성장할 것으로 예상됩니다. 서버리스 컴퓨팅을 채택하는 개발자와 조직이 늘어남에 따라, 특히 Java와 같은 인기 있는 언어를 활용해 효율적이고 이벤트 기반의 애플리케이션을 구축하는 방법을 이해하는 것이 중요합니다.
이제 Java 11을 사용해 Lambda 함수를 생성하고, Amazon DynamoDB와 연결하며, Sumo Logic의 Telemetry API 통합을 통해 AWS 옵저버빌리티를 향상시키는 방법을 살펴보겠습니다.
AWS Lambda 함수란 무엇인가?
AWS Lambda는 서버를 프로비저닝하거나 관리할 필요 없이 모든 유형의 애플리케이션 또는 백엔드 서비스를 위한 코드를 실행할 수 있는 서버리스 이벤트 기반 컴퓨팅 서비스입니다. Amazon CloudWatch, Amazon S3, Amazon EC2 등 200개 이상의 AWS 서비스 및 SaaS(Software-as-a-Service) 애플리케이션에서 Lambda 함수를 트리거할 수 있습니다.
이 함수는 Amazon Simple Queue Service(SQS)에서 Lambda 함수로 데이터가 전달되거나, Amazon S3 내 파일이 변경될 때 발생하는 이벤트에 대응합니다. 이 이벤트는 함수의 첫 번째 매개변수로 전달됩니다. Lambda 함수는 완전히 무상태(stateless) 구조로 동작하기 때문에, 특정 인스턴스에서 함수가 어디서 실행될지 또는 몇 번 실행되었는지에 대한 보장은 없습니다.
Java 11로 AWS Lambda 함수 코딩하기
AWS Lambda를 사용하면 AWS 클라우드에서 실행할 수 있는 Lambda Java 함수를 생성하고 업로드할 수 있습니다. 이 함수는 다양한 언어로 작성할 수 있지만, 여기서는 Java 11을 사용하여 AWS Lambda 함수를 만드는 방법에 초점을 맞추겠습니다. 이 글에서는 AWS 콘솔을 통해 함수를 코딩하고, 설정하고, 테스트하는 과정을 단계별로 살펴봅니다.
AWS Lambda 예시: 간단한 우편번호 검증기
이 예시에서는 Amazon DynamoDB 테이블에 새 주소가 추가될 때 반응하는 간단한 우편번호 유효성 검사기를 만들어보겠습니다.
0단계: 시작 전 준비
- AWS 관리 콘솔에 액세스할 수 있는지 확인합니다. AWS 프리 티어(free tier)에서 이 예제를 생성하고 배포하는 데는 추가 비용이 발생하지 않습니다.
- 테스트가 끝난 후에는 트리거를 비활성화하고 DynamoDB 테이블을 삭제하여 불필요한 사용을 방지해야 합니다.
1단계: DynamoDB 테이블 생성
- DynamoDB 콘솔로 이동합니다.
- US_Address_Table이라는 이름의 테이블을 생성하고, 기본 키를 ID(문자열 유형)로 설정합니다.
- Streams를 활성화하고 NEW_IMAGE 보기 형식을 선택합니다.
- 다음 단계에서 사용할 수 있도록 테이블의 ARN을 복사해 둡니다.
2단계: Lambda 함수용 역할 생성
- IAM 콘솔로 이동합니다.
- AWSLambdaDynamoDBExecutionRole 관리형 정책을 사용해 새 역할을 생성합니다.
- 역할 이름은 예를 들어 lambda-validator로 지정합니다.
3단계: DynamoDB 업데이트 권한 추가
- 인라인 정책을 추가하거나 콘솔에서 설정하여 DynamoDB 테이블의 UpdateItem 권한을 부여합니다. 이때 테이블의 ARN을 사용합니다.
4단계: Lambda 함수 코딩
- Java 11과 AWS SDK v2를 사용합니다. 아래는 Lambda 함수의 간단한 예시 코드입니다.
package com.example;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.LambdaLogger;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
import software.amazon.awssdk.services.dynamodb.model.*;
import com.amazonaws.services.lambda.runtime.events.DynamodbEvent;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.regex.Pattern;
public class AddressValidator implements RequestHandler<DynamodbEvent, String> {
private static final Pattern ZIP_CODE_PATTERN = Pattern.compile("^[0-9]{5}(?:-[0-9]{4})?$");
private final ObjectMapper objectMapper = new ObjectMapper();
private final DynamoDbClient dynamoDbClient = DynamoDbClient.builder().region(Region.US_WEST_2).build();
private static final String TABLE_NAME = "US_Address_Table";
public String handleRequest(DynamodbEvent event, Context context) {
LambdaLogger logger = context.getLogger();
for (DynamodbEvent.DynamodbStreamRecord record : event.getRecords()) {
if ("INSERT".equals(record.getEventName())) {
try {
String jsonAddress = record.getDynamodb().getNewImage().get("address").getS();
Address address = objectMapper.readValue(jsonAddress, Address.class);
if (!Boolean.TRUE.equals(address.getValidated())) {
address.setValidated(ZIP_CODE_PATTERN.matcher(address.getZipcode()).matches());
String updatedJson = objectMapper.writeValueAsString(address);
dynamoDbClient.updateItem(UpdateItemRequest.builder()
.tableName(TABLE_NAME)
.key(record.getDynamodb().getKeys())
.updateExpression("SET address = :a")
.expressionAttributeValues(Map.of(":a", AttributeValue.builder().s(updatedJson).build()))
.returnValues(ReturnValue.UPDATED_NEW)
.build());
}
} catch (Exception e) {
logger.log("Exception during ZIP validation: " + e.getMessage());
}
}
}
return "Validated " + event.getRecords().size() + " records.";
}
}
5단계: AWS 콘솔을 이용한 Lambda 함수 업로드
- Maven 또는 Gradle을 사용해 Java Lambda 함수를 fat JAR 형식으로 패키징합니다.
- AWS Lambda 콘솔을 통해 JAR 파일을 업로드합니다.
- 런타임(runtime)은 Java 11로 설정하고, 핸들러(handler)는 com.example.AddressValidator::handleRequest로 지정합니다.
- 이전 단계에서 생성한 역할을 할당합니다.
6단계: AWS 콘솔에서 함수 동기식 테스트
- Lambda 콘솔에서 테스트 이벤트(test event)를 만듭니다.
- 다음 JSON 형식을 사용합니다.
{
"Records": [
{
"eventID": "1",
"eventVersion": "1.0",
"dynamodb": {
"Keys": {
"id": {"S": "111-222-333"}
},
"NewImage": {
"address": {
"S": "{\"address1\":\"123 Main St\",\"city\":\"Portland\",\"state\":\"OR\",\"zipcode\":\"97229\"}"
},
"id": {"S": "111-222-333"}
},
"StreamViewType": "NEW_IMAGE",
"SequenceNumber": "111-222-333",
"SizeBytes": 26
},
"awsRegion": "us-west-2",
"eventName": "INSERT",
"eventSourceARN": "arn:aws:dynamodb:us-west-2:account-id:table/ExampleTableWithStream/stream/2023-01-01T00:00:00.000",
"eventSource": "aws:dynamodb"
}
]
}
- NullPointer 또는 권한 오류가 발생한다면, 테이블의 ARN이 올바른지, Lambda 역할에 필요한 권한이 모두 포함되어 있는지 확인하시기 바랍니다.
- logger.log() 구문을 추가하면 디버깅에 도움이 됩니다.
7단계: DynamoDB에서 Lambda 함수 트리거
- DynamoDB 콘솔에서 테이블의 트리거 탭으로 이동하여 Lambda 함수를 링크합니다.
- 수동 테스트를 위해 배치 크기를 1로 설정합니다.
- 연결이 완료되면, 테이블에 새 항목을 추가할 때마다 Lambda 함수가 트리거되고 유효성이 검사된 필드로 주소 개체가 업데이트됩니다.
Sumo Logic의 활용 장점
Sumo Logic의 SaaS 로그 분석 플랫폼을 사용하면 AWS Lambda의 로그, 플랫폼 메트릭, 플랫폼 트레이스를 Telemetry API를 통해 Sumo Logic으로 직접 통합할 수 있습니다. 이 통합 기능은 AWS 환경 전반의 옵저버빌리티를 높여, 인프라를 직접 관리하지 않아도 Lambda 함수에 대한 심층적인 가시성과 간편한 모니터링이 가능해집니다.
AWS 모니터링과 관측 수준을 한 단계 높일 준비가 되셨나요?30일 무료 평가판을 체험하세요.



