AWS Lambda 함수 핸들러(Java) - AWS Lambda

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

AWS Lambda 함수 핸들러(Java)

Lambda 함수의 핸들러는 이벤트를 처리하는 함수 코드의 메서드입니다. 함수가 호출되면 Lambda는 핸들러 메서드를 실행합니다. 함수는 핸들러가 응답을 반환하거나 종료하거나 제한 시간이 초과될 때까지 실행됩니다.

이 가이드의 GitHub 리포지토리는 다양한 핸들러 유형을 보여주는 easy-to-deploy 샘플 애플리케이션을 제공합니다. 자세한 내용은 이 주제의 끝 부분을 참조하세요.

예제 핸들러: Java 17 런타임

다음 Java 17 예제에서 HandlerIntegerJava17이라는 클래스는 handleRequest라는 핸들러 메서드를 정의합니다. 핸들러 메서드는 다음과 같은 입력을 받습니다.

  • 이벤트 데이터를 나타내는 사용자 지정 Java 레코드인 IntegerRecord입니다. 이 예제에서는 IntegerRecord를 다음과 같이 정의합니다.

    record IntegerRecord(int x, int y, String message) { }
  • 간접 호출, 함수, 실행 환경에 대한 정보를 제공하는 메서드와 속성을 제공하는 컨텍스트 객체입니다.

입력 IntegerRecord에서 message를 기록하고 x와 y의 합을 반환하는 함수를 작성한다고 가정합니다. 다음은 함수 코드입니다.

HandlerIntegerJava17.java
package example; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.LambdaLogger; import com.amazonaws.services.lambda.runtime.RequestHandler; // Handler value: example.HandlerInteger public class HandlerIntegerJava17 implements RequestHandler<IntegerRecord, Integer>{ @Override /* * Takes in an InputRecord, which contains two integers and a String. * Logs the String, then returns the sum of the two Integers. */ public Integer handleRequest(IntegerRecord event, Context context) { LambdaLogger logger = context.getLogger(); logger.log("String found: " + event.message()); return event.x() + event.y(); } } record IntegerRecord(int x, int y, String message) { }

함수 구성에서 핸들러 파라미터를 설정하여 Lambda가 간접적으로 호출할 메서드를 지정합니다. 핸들러를 다음과 같은 형식으로 표현할 수 있습니다.

  • package.Class::method – 전체 형식. 예: example.Handler::handleRequest.

  • package.Class핸들러 인터페이스를 구현하는 클래스에 대한 단축 형식입니다. 예를 들면 example.Handler입니다.

Lambda가 핸들러를 간접적으로 호출하면 Lambda 런타임은 이벤트를 JSON 형식 문자열로 수신하여 객체로 변환합니다. 이전 예제에서 샘플 이벤트는 다음과 같을 수 있습니다.

event.json
{ "x": 1, "y": 20, "message": "Hello World!" }

이 파일을 저장하고 다음 AWS Command Line Interface(CLI) 명령을 사용하여 로컬에서 함수를 테스트할 수 있습니다.

aws lambda invoke --function-name function_name --payload file://event.json out.json

예제 핸들러: Java 11 런타임 이하

Lambda는 Java 17 런타임 및 그 이상에서의 레코드만 지원합니다. 모든 Java 런타임에서 클래스를 사용하여 이벤트 데이터를 나타낼 수 있습니다. 다음 예제에서는 정수 목록과 컨텍스트 객체를 입력으로 사용하고 목록에 있는 모든 정수의 합계를 반환합니다.

다음 예제에서 Handler라는 클래스는 handleRequest라는 핸들러 메서드를 정의합니다. 핸들러 메서드는 이벤트 및 컨텍스트 객체를 입력으로 받아 문자열을 반환합니다.

HandlerList.자바
package example; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.LambdaLogger; import com.amazonaws.services.lambda.runtime.RequestHandler; import java.util.List; // Handler value: example.HandlerList public class HandlerList implements RequestHandler<List<Integer>, Integer>{ @Override /* * Takes a list of Integers and returns its sum. */ public Integer handleRequest(List<Integer> event, Context context) { LambdaLogger logger = context.getLogger(); logger.log("EVENT TYPE: " + event.getClass().toString()); return event.stream().mapToInt(Integer::intValue).sum(); } }

더 많은 예제는 샘플 핸들러 코드를 참조하세요.

초기화 코드

Lambda는 함수를 처음 호출하기 전 초기화 단계에서 정적 코드와 클래스 생성자를 실행합니다. 초기화 중에 생성된 리소스는 간접 호출 간에 메모리에 남아 있으며 핸들러에서 수천 번 재사용할 수 있습니다. 따라서 기본 핸들러 메서드 외부에 초기화 코드를 추가하여 컴퓨팅 시간을 절약하고 여러 간접 호출에서 리소스를 재사용할 수 있습니다.

다음 예제에서 클라이언트 초기화 코드는 기본 핸들러 메서드 외부에 있습니다. 런타임은 함수가 클라이언트의 첫 번째 이벤트를 제공하기 전에 클라이언트를 초기화합니다. Lambda가 클라이언트를 다시 초기화할 필요가 없으므로 후속 이벤트는 훨씬 더 빠릅니다.

Handler.java
package example; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.LambdaLogger; import com.amazonaws.services.lambda.runtime.RequestHandler; import java.util.Map; import software.amazon.awssdk.services.lambda.LambdaClient; import software.amazon.awssdk.services.lambda.model.GetAccountSettingsResponse; import software.amazon.awssdk.services.lambda.model.LambdaException; // Handler value: example.Handler public class Handler implements RequestHandler<Map<String,String>, String> { private static final LambdaClient lambdaClient = LambdaClient.builder().build(); @Override public String handleRequest(Map<String,String> event, Context context) { LambdaLogger logger = context.getLogger(); logger.log("Handler invoked"); GetAccountSettingsResponse response = null; try { response = lambdaClient.getAccountSettings(); } catch(LambdaException e) { logger.log(e.getMessage()); } return response != null ? "Total code size for your account is " + response.accountLimit().totalCodeSize() + " bytes" : "Error"; } }

입력 및 출력 유형 선택

핸들러 메서드의 서명에서 이벤트가 매핑되는 객체 유형을 지정합니다. 앞의 예제에서 Java 런타임은 이벤트를 Map<String,String> 인터페이스를 구현하는 유형으로 역직렬화합니다. S tring-to-string 맵은 다음과 같은 플랫 이벤트에 사용할 수 있습니다.

Event.json – 날씨 데이터
{ "temperatureK": 281, "windKmh": -3, "humidityPct": 0.55, "pressureHPa": 1020 }

그러나 각 필드의 값은 문자열이나 숫자여야 합니다. 이벤트에 객체 값이 있는 필드가 포함되어 있으면 런타임에서 이벤트를 역직렬화할 수 없으며 오류를 반환합니다.

함수가 처리하는 이벤트 데이터에서 작동하는 입력 유형을 선택합니다. 기본 형식, 제네릭 형식 또는 적절히 정의된 형식을 사용할 수 있습니다.

입력 유형
  • Integer, Long, Double 등. - 이벤트가 추가 형식이 없는 숫자입니다(예: 3.5). 런타임에서 값을 지정된 유형의 객체로 변환합니다.

  • String – 이벤트가 인용 부호를 포함한 JSON 문자열입니다(예: "My string."). 런타임에서 값을 인용 부호 없이 String 객체로 변환합니다.

  • Type, Map<String,Type> 등. - 이벤트가 JSON 객체입니다. 런타임에서 이벤트를 지정된 유형 또는 인터페이스의 객체로 역직렬화합니다.

  • List<Integer>, List<String>, List<Object> 등. - 이벤트가 JSON 배열입니다. 런타임에서 이벤트를 지정된 유형 또는 인터페이스의 객체로 역직렬화합니다.

  • InputStream – 이벤트가 임의의 JSON 유형입니다. 런타임에서 문서의 바이트 스트림을 수정하지 않고 핸들러에 전달합니다. 사용자가 입력을 역직렬화하고 출력 스트림에 출력을 써야 합니다.

  • 라이브러리 유형 - AWS 서비스에서 전송한 이벤트의 경우 aws-lambda-java-events라이브러리의 유형을 사용합니다.

고유한 입력 유형을 정의하는 경우 이벤트의 각 필드에 기본 생성자와 속성을 사용하여 역직렬화 가능하고 변경 가능한 POJO(Plain Old Java Object) 유형이어야 합니다. 이벤트에 포함되지 않은 속성과 속성에 매핑되지 않은 이벤트의 키는 오류 없이 삭제됩니다.

출력 유형은 객체 또는 void가 될 수 있습니다. 런타임은 반환 값을 텍스트로 직렬화합니다. 출력이 필드가 포함된 객체인 경우 런타임에서 이를 JSON 문서로 직렬화합니다. 프리미티브 값을 래핑하는 유형인 경우 런타임이 해당 값의 텍스트 표현을 반환합니다.

핸들러 인터페이스

aws-lambda-java-core 라이브러리는 핸들러 메서드에 대한 두 가지 인터페이스를 정의합니다. 제공된 인터페이스를 사용하여 핸들러 구성을 간소화하고 컴파일 타임에 핸들러 메서드 서명의 유효성을 검사하세요.

RequestHandler 인터페이스는 입력 유형과 출력 유형의 두 가지 파라미터를 취하는 제네릭 형식입니다. 두 유형 모두 객체여야 합니다. 이 인터페이스를 사용하면 Java 런타임에서 이벤트를 입력 유형의 객체로 역직렬화하고 출력을 텍스트로 직렬화합니다. 해당 입력 및 출력 유형에 대해 기본 제공 직렬화가 작동하는 경우 이 인터페이스를 사용하세요.

Handler.java – 핸들러 인터페이스
// Handler value: example.Handler public class Handler implements RequestHandler<Map<String,String>, String>{ @Override public String handleRequest(Map<String,String> event, Context context)

고유한 직렬화를 사용하려면 RequestStreamHandler 인터페이스를 구현합니다. 이 인터페이스를 사용하면 Lambda에서 핸들러에 입력 스트림과 출력 스트림을 전달합니다. 핸들러는 입력 스트림에서 바이트를 읽어 출력 스트림에 쓰고 void를 반환합니다.

다음 예제에서는 입력 및 출력 스트림 작업을 위해 버퍼링된 리더 및 라이터 유형을 사용합니다.

HandlerStream. 자바
import com.amazonaws.services.lambda.runtime.Context import com.amazonaws.services.lambda.runtime.LambdaLogger import com.amazonaws.services.lambda.runtime.RequestStreamHandler ... // Handler value: example.HandlerStream public class HandlerStream implements RequestStreamHandler { @Override /* * Takes an InputStream and an OutputStream. Reads from the InputStream, * and copies all characters to the OutputStream. */ public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException { LambdaLogger logger = context.getLogger(); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, Charset.forName("US-ASCII"))); PrintWriter writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(outputStream, Charset.forName("US-ASCII")))); int nextChar; try { while ((nextChar = reader.read()) != -1) { outputStream.write(nextChar); } } catch (IOException e) { e.printStackTrace(); } finally { reader.close(); String finalString = writer.toString(); logger.log("Final string result: " + finalString); writer.close(); } } }

샘플 핸들러 코드

이 안내서의 GitHub 저장소에는 다양한 핸들러 유형과 인터페이스의 사용을 보여주는 샘플 애플리케이션이 포함되어 있습니다. 각 샘플 애플리케이션에는 간편한 배포 및 정리를 위한 스크립트, AWS SAM 템플릿 및 지원 리소스가 포함되어 있습니다.

Java의 샘플 Lambda 애플리케이션
  • java17-examples – Java 레코드를 사용하여 입력 이벤트 데이터 객체를 나타내는 방법을 보여주는 Java 함수입니다.

  • java-basic – 단위 테스트 및 변수 로깅 구성을 사용하는 최소한의 Java 함수 모음입니다.

  • java - Amazon API Gateway, Amazon SQS 및 Amazon Kinesis와 같은 다양한 서비스의 이벤트를 처리하는 방법에 대한 스켈레톤 코드가 포함된 Java 함수 모음입니다. 이러한 함수는 최신 버전의 aws-lambda-java-events라이브러리 (3.0.0 이상) 를 사용합니다. 이러한 예는 AWS SDK를 종속 항목으로 요구하지 않습니다.

  • s3-java – Amazon S3의 알림 이벤트를 처리하고 JCL(Java Class Library)을 사용하여 업로드된 이미지 파일의 썸네일을 생성하는 Java 함수입니다.

  • API Gateway를 사용하여 Lambda 함수 호출 — 직원 정보가 포함된 Amazon DynamoDB 테이블을 스캔하는 Java 함수입니다. 이후 Amazon 간편 알림 서비스를 사용하여 직원들에게 근무 기념일을 축하하는 문자 메시지를 보냅니다. 이 예제에서는 API Gateway를 사용하여 함수를 호출합니다.

java-eventss3-java 애플리케이션은 AWS 서비스 이벤트를 입력으로 받아 문자열을 반환합니다. java-basic 애플리케이션에는 여러 유형의 핸들러가 포함되어 있습니다.

다른 핸들러 유형을 테스트하려면 AWS SAM 템플릿에서 핸들러 값을 변경합니다. 자세한 지침은 샘플 애플리케이션의 Readme 파일을 참조하세요.