AWS Lambda Managed Instances와 Java 25 및 AWS SAM - Part 1 소개 및 샘플 애플리케이션

발행: (2026년 1월 16일 오전 01:09 GMT+9)
8 min read
원문: Dev.to

Source: Dev.to

소개

이 시리즈 기사에서는 **AWS Lambda Managed Instances (LMI)**의 개념을 소개합니다. 이후 Java 25AWS SAM을 사용하여 LMI를 활용한 샘플 애플리케이션을 개발할 것입니다. 이 기사에서는 LMI의 아이디어를 설명하고 샘플 애플리케이션을 소개합니다.

Source: https://docs.aws.amazon.com/lambda/latest/dg/lambda-managed-instances.html

AWS Lambda 관리형 인스턴스

Lambda 관리형 인스턴스는 Graviton4, 네트워크 최적화 인스턴스 및 기타 특수 컴퓨팅 옵션을 포함한 최신 세대 Amazon EC2 인스턴스에서 Lambda 함수를 실행할 수 있게 해 주며, 인스턴스 수명 주기, OS/런타임 패치, 라우팅, 로드 밸런싱 또는 스케일링 정책을 직접 관리할 필요가 없습니다.

Lambda 관리형 인스턴스를 사용하면 Savings PlansReserved Instances와 같은 EC2 가격 혜택을 누릴 수 있습니다.

지원되는 인스턴스 유형 목록은 AWS Lambda 요금 페이지에서 확인하고, 사용 중인 AWS 리전을 선택하십시오.

주요 기능

  • 적합한 인스턴스 선택 – 최신 CPU(예: Graviton4), 구성 가능한 메모리‑CPU 비율, 고대역폭 네트워킹 등 성능 및 비용 요구 사항에 맞는 인스턴스를 선택합니다.
  • 자동 프로비저닝 – AWS가 적절한 인스턴스를 자동으로 프로비저닝하고 함수 실행 환경을 시작합니다.
  • 동적 스케일링 – 인스턴스가 함수 트래픽 패턴에 따라 동적으로 확장·축소됩니다.
  • 완전 관리형 경험 – 인프라 관리, 스케일링, 패치, 라우팅을 AWS가 처리하며, 익숙한 다양한 이벤트 소스 통합을 그대로 사용할 수 있습니다.

Lambda 관리형 인스턴스를 사용해야 할 경우

  • 대량·예측 가능한 워크로드 – 트래픽 급증이 없는 안정적인 워크로드에 이상적이며, 기본적으로 5분 이내에 트래픽을 두 배로 늘릴 수 있습니다.
  • 성능이 중요한 애플리케이션 – 최신 CPU, 유연한 메모리‑CPU 비율, 높은 네트워크 처리량을 활용할 수 있습니다.
  • 규제 요구 사항 – VPC 및 인스턴스 배치에 대한 세밀한 거버넌스가 필요한 경우.

샘플 애플리케이션

코드 예제는 GitHub 저장소 **aws-lambda-java-25‑lmi**에서 확인할 수 있습니다.

아키텍처

샘플 애플리케이션 아키텍처

이 애플리케이션은 Amazon DynamoDB를 NoSQL 영속성 레이어로 사용하여 제품을 생성하고 ID로 조회합니다. Amazon API Gateway를 통해 노출되며, AWS Lambda에 의해 실행되고 AWS SAM(Serverless Application Model)으로 배포됩니다. 이러한 서비스, AWS 서버리스 아키텍처, 그리고 SAM에 대한 기본적인 이해가 전제됩니다.

사전 요구 사항

샘플을 빌드하고 배포하려면 로컬에 다음이 설치되어 있어야 합니다:

예제: GetProductByIdHandler

아래는 GetProductByIdHandler Lambda 함수의 소스 코드입니다. 이 함수는 API‑Gateway 요청에서 제품 ID를 추출하고, DynamoDB에서 제품을 조회한 뒤 적절한 응답을 반환합니다.

@Override
public APIGatewayProxyResponseEvent handleRequest(
        APIGatewayProxyRequestEvent requestEvent,
        Context context) throws JsonProcessingException {

    var id = requestEvent.getPathParameters().get("id");
    var optionalProduct = productDao.getProduct(id);

    if (optionalProduct.isEmpty()) {
        return new APIGatewayProxyResponseEvent()
                .withStatusCode(HttpStatusCode.NOT_FOUND)
                .withBody("Product with id = " + id + " not found");
    }

    return new APIGatewayProxyResponseEvent()
            .withStatusCode(HttpStatusCode.OK)
            .withBody(objectMapper.writeValueAsString(optionalProduct.get()));
}

handleRequest 메서드는 APIGatewayProxyRequestEvent(API Gateway에 의해 호출)를 받아들입니다. requestEvent.getPathParameters().get("id")를 통해 제품 ID를 가져오고, productDao.getProduct(id)를 사용해 DynamoDB를 조회한 뒤, APIGatewayProxyResponseEvent에 JSON으로 직렬화된 응답을 담아 반환합니다. 제품이 존재하지 않을 경우 404 Not Found 응답이 반환되고, 존재할 경우 200 OK 응답과 함께 제품 데이터가 API Gateway로 전송됩니다.

Source: https://github.com/Vadym79/aws-lambda-java-25

Lambda 함수 개요

제품을 생성하고 영구 저장하기 위해 사용하는 Lambda 함수 CreateProductHandler 의 코드는 아래 예시와 유사합니다.

Product 엔터티

Product 엔터티의 소스 코드는 매우 간단합니다:

public record Product(String id, String name, BigDecimal price) {}

DynamoProductDao 영속성 레이어

DynamoProductDao 영속성 레이어 구현은 AWS SDK for Java 2.0을 사용해 DynamoDB에 쓰거나 읽습니다. 아래는 앞서 설명한 GetProductByIdHandler Lambda 함수에서 사용한 getProduct 메서드의 소스 코드입니다:

public Optional getProduct(String id) {
    GetItemResponse getItemResponse = dynamoDbClient.getItem(
        GetItemRequest.builder()
            .key(Map.of("PK", AttributeValue.builder().s(id).build()))
            .tableName(PRODUCT_TABLE_NAME)
            .build()
    );

    if (getItemResponse.hasItem()) {
        return Optional.of(ProductMapper.productFromDynamoDB(getItemResponse.item()));
    } else {
        return Optional.empty();
    }
}

여기서 우리는:

  1. DynamoDbClient 인스턴스를 사용해 DynamoDB 테이블을 조회하는 GetItemRequest를 빌드합니다.
  2. 테이블 이름은 AWS SAM 템플릿에서 설정한 환경 변수(System.getenv("PRODUCT_TABLE_NAME"))에서 가져옵니다.
  3. 제품이 존재하면, 커스텀 ProductMapper 를 이용해 DynamoDB 아이템을 Product 엔터티로 매핑합니다.

다음 글에서는 AWS SAM template.yaml 에서 설명되는 인프라스트럭처 코드(IaC) 부분을 다룰 예정이며, 여기에는 LMI‑특화 설정이 포함되어 있습니다.

Source:

빌드 및 배포

  1. 애플리케이션을 빌드합니다:

    mvn clean package
  2. SAM으로 배포합니다:

    sam deploy -g

배포가 완료되면 SAM이 맞춤형 Amazon API Gateway URL을 반환합니다. 이 URL을 사용해 제품을 생성하고 ID로 조회할 수 있습니다. API는 API 키로 보호되며, 각 요청에 다음 HTTP 헤더를 포함해야 합니다:

X-API-Key: a6ZbcDefQW12BN56WEV7LMI

(MyApiKey 정의는 **template.yaml**에 있습니다.)

예시: 제품 생성

curl -X PUT \
     -d '{ "id": "1", "name": "Print 10x13", "price": 0.15 }' \
     -H "Content-Type: application/json" \
     -H "X-API-Key: a6ZbcDefQW12BN56WEV7LMI" \
     https://{API_GATEWAY_URL}/prod/products

예시: 제품 조회

curl -H "X-API-Key: a6ZbcDefQW12BN56WEV7LMI" \
     https://{API_GATEWAY_URL}/prod/products/1

결론

이 기사에서는 AWS Lambda Managed Instances의 개념을 설명하고 샘플 애플리케이션을 소개했습니다. 다음 기사에서는 Lambda Capacity Providers와 이를 생성하는 방법에 대해 논의할 예정입니다.

제 콘텐츠가 마음에 드신다면, GitHub에서 저를 팔로우하고 제 저장소에 별표를 눌러 주세요!

Back to Blog

관련 글

더 보기 »

기술은 구원자가 아니라 촉진자다

왜 사고의 명확성이 사용하는 도구보다 더 중요한가? Technology는 종종 마법 스위치처럼 취급된다—켜기만 하면 모든 것이 개선된다. 새로운 software, ...

에이전틱 코딩에 입문하기

Copilot Agent와의 경험 나는 주로 GitHub Copilot을 사용해 인라인 편집과 PR 리뷰를 수행했으며, 대부분의 사고는 내 머리로 했습니다. 최근 나는 t...