Java에서 Lambda 함수 핸들러 정의 - AWS Lambda

Java에서 Lambda 함수 핸들러 정의

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

이 페이지에서는 프로젝트 설정, 이름 지정 규칙, 모범 사례를 포함하여 Java에서 Lambda 함수 핸들러를 사용하는 방법을 설명합니다. 이 페이지에는 주문에 대한 정보를 가져와서 텍스트 파일 영수증을 생성하고 해당 파일을 Amazon Simple Storage Service(S3) 버킷에 넣는 Java Lambda 함수의 예제도 포함되어 있습니다. 함수를 작성한 후 배포하는 방법에 대한 자세한 내용은 .zip 또는 JAR 파일 아카이브를 사용하여 Java Lambda 함수 배포 또는 컨테이너 이미지로 Java Lambda 함수 배포 섹션을 참조하세요.

Java 핸들러 프로젝트 설정

Java에서 Lambda 함수를 사용할 경우 프로세스에는 코드를 작성한 후 컴파일하고, 컴파일된 아티팩트를 Lambda에 배포하는 작업이 포함됩니다. 다양한 방법으로 Java Lambda 프로젝트를 초기화할 수 있습니다. 예를 들어 Lambda 함수용 Maven Archetype, AWS SAM CLI sam init 명령이나 기본 IDE(예: IntelliJ IDEA 또는 Visual Studio Code)의 표준 Java 프로젝트 설정 같은 도구를 사용할 수 있습니다. 또는 필요한 파일 구조를 수동으로 생성할 수 있습니다.

일반적인 Java Lambda 함수 프로젝트는 다음과 같은 일반적인 구조를 따릅니다.

/project-root └ src └ main └ java └ example └ OrderHandler.java (contains main handler) └ <other_supporting_classes> └ build.gradle OR pom.xml

Maven 또는 Gradle을 사용하여 프로젝트를 빌드하고 종속성을 관리할 수 있습니다.

함수의 기본 핸들러 로직은 src/main/java/example 디렉터리 아래의 Java 파일에 있습니다. 이 페이지의 예제에서는 이 파일의 이름을 OrderHandler.java로 지정합니다. 이 파일 외에도 필요에 따라 추가 Java 클래스를 포함할 수 있습니다. 함수를 Lambda에 배포할 경우, 간접 호출 중에 Lambda가 간접적으로 호출해야 하는 기본 핸들러 메서드가 포함된 Java 클래스를 지정해야 합니다.

Java Lambda 함수 코드 예제

다음 예제 Java 21 Lambda 함수 코드는 주문에 대한 정보를 입력으로 가져와서 텍스트 파일 영수증을 생성하고 해당 파일을 Amazon S3 버킷에 넣습니다.

OrderHandler.java Lambda 함수
package example; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; import software.amazon.awssdk.core.sync.RequestBody; import software.amazon.awssdk.services.s3.S3Client; import software.amazon.awssdk.services.s3.model.PutObjectRequest; import software.amazon.awssdk.services.s3.model.S3Exception; import java.nio.charset.StandardCharsets; /** * Lambda handler for processing orders and storing receipts in S3. */ public class OrderHandler implements RequestHandler<OrderHandler.Order, String> { private static final S3Client S3_CLIENT = S3Client.builder().build(); /** * Record to model the input event. */ public record Order(String orderId, double amount, String item) {} @Override public String handleRequest(Order event, Context context) { try { // Access environment variables String bucketName = System.getenv("RECEIPT_BUCKET"); if (bucketName == null || bucketName.isEmpty()) { throw new IllegalArgumentException("RECEIPT_BUCKET environment variable is not set"); } // Create the receipt content and key destination String receiptContent = String.format("OrderID: %s\nAmount: $%.2f\nItem: %s", event.orderId(), event.amount(), event.item()); String key = "receipts/" + event.orderId() + ".txt"; // Upload the receipt to S3 uploadReceiptToS3(bucketName, key, receiptContent); context.getLogger().log("Successfully processed order " + event.orderId() + " and stored receipt in S3 bucket " + bucketName); return "Success"; } catch (Exception e) { context.getLogger().log("Failed to process order: " + e.getMessage()); throw new RuntimeException(e); } } private void uploadReceiptToS3(String bucketName, String key, String receiptContent) { try { PutObjectRequest putObjectRequest = PutObjectRequest.builder() .bucket(bucketName) .key(key) .build(); // Convert the receipt content to bytes and upload to S3 S3_CLIENT.putObject(putObjectRequest, RequestBody.fromBytes(receiptContent.getBytes(StandardCharsets.UTF_8))); } catch (S3Exception e) { throw new RuntimeException("Failed to upload receipt to S3: " + e.awsErrorDetails().errorMessage(), e); } } }

OrderHandler.java 파일은 다음 코드 섹션을 포함하고 있습니다.

  • package example: Java에서는 무엇이든 가능하지만 프로젝트의 디렉터리 구조와 일치해야 합니다. 여기서는 디렉터리 구조가 src/main/java/example이기 때문에 package example을 사용합니다.

  • import 문: Lambda 함수에 필요한 Java 클래스를 가져오는 데 사용합니다.

  • public class OrderHandler ...: Java 클래스를 정의하며 유효한 클래스 정의여야 합니다.

  • private static final S3Client S3_CLIENT ...: 클래스의 메서드 외부에서 S3 클라이언트를 초기화합니다. 이렇게 하면 초기화 단계에서 Lambda가 이 코드를 실행합니다.

  • public record Order ...: 이 사용자 지정 Java 레코드에서 예상 입력 이벤트의 형태를 정의합니다.

  • public String handleRequest(Order event, Context context): 기본 애플리케이션 논리를 포함한 기본 핸들러 메서드입니다.

  • private void uploadReceiptToS3(...) {}: 기본 handleRequest 핸들러 메서드에서 참조하는 도우미 메서드입니다.

다음 build.gradle 또는 pom.xml 파일은 이 함수와 함께 제공됩니다.

build.gradle
plugins { id 'java' } repositories { mavenCentral() } dependencies { implementation 'com.amazonaws:aws-lambda-java-core:1.2.3' implementation 'software.amazon.awssdk:s3:2.28.29' implementation 'org.slf4j:slf4j-nop:2.0.16' } task buildZip(type: Zip) { from compileJava from processResources into('lib') { from configurations.runtimeClasspath } } java { sourceCompatibility = JavaVersion.VERSION_21 targetCompatibility = JavaVersion.VERSION_21 } build.dependsOn buildZip
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>example-java</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>example-java-function</name> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>21</maven.compiler.source> <maven.compiler.target>21</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-core</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>s3</artifactId> <version>2.28.29</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-nop</artifactId> <version>2.0.16</version> </dependency> </dependencies> <build> <plugins> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>3.5.2</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</version> <configuration> <createDependencyReducedPom>false</createDependencyReducedPom> <filters> <filter> <artifact>*:*</artifact> <excludes> <exclude>META-INF/*</exclude> <exclude>META-INF/versions/**</exclude> </excludes> </filter> </filters> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.13.0</version> <configuration> <release>21</release> </configuration> </plugin> </plugins> </build> </project>

이 함수가 제대로 작동하려면 실행 역할s3:PutObject 작업을 허용해야 합니다. 또한 RECEIPT_BUCKET 환경 변수를 정의해야 합니다. 성공적으로 간접 호출되면 Amazon S3 버킷은 영수증 파일을 포함합니다.

참고

이 함수를 제한 시간 없이 성공적으로 실행하려면 추가 구성 설정이 필요할 수 있습니다. 메모리는 256MB, 제한 시간은 10초로 구성하는 것이 좋습니다. 콜드 스타트로 인해 첫 번째 간접 호출 시 추가 시간이 걸릴 수 있습니다. 후속 간접 호출은 실행 환경의 재사용으로 인해 훨씬 더 빠르게 실행됩니다.

Java 핸들러에 유효한 클래스 정의

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

RequestHandler 인터페이스는 입력 유형과 출력 유형의 두 가지 파라미터를 취하는 제네릭 형식입니다. 두 유형 모두 객체여야 합니다. 이 예제에서는 OrderHandler 클래스가 RequestHandler<OrderHandler.Order, String>을 구현합니다. 입력 유형은 클래스 내에서 정의하는 Order 레코드이고, 출력 유형은 String입니다.

public class OrderHandler implements RequestHandler<OrderHandler.Order, String> { ... }

이 인터페이스를 사용하면 Java 런타임에서 이벤트를 입력 유형의 객체로 역직렬화하고 출력을 텍스트로 직렬화합니다. 해당 입력 및 출력 유형에 대해 기본 제공 직렬화가 작동하는 경우 이 인터페이스를 사용하세요.

고유한 직렬화를 사용하려면 RequestStreamHandler 인터페이스를 구현할 수 있습니다. 이 인터페이스를 사용하면 Lambda에서 핸들러에 입력 스트림과 출력 스트림을 전달합니다. 핸들러는 입력 스트림에서 바이트를 읽어 출력 스트림에 쓰고 void를 반환합니다. Java 21 런타임을 사용하는 예제는 HandlerStream.java를 참조하세요.

Java 함수에서 기본 및 일반 유형(예: String, Integer, =List, Map)으로만 작업하는 경우 인터페이스를 구현할 필요가 없습니다. 예를 들어 함수가 Map<String, String> 입력을 가져와 String을 반환할 경우 클래스 정의 및 핸들러 서명은 다음과 같을 수 있습니다.

public class ExampleHandler { public String handleRequest(Map<String, String> input, Context context) { ... } }

또한 인터페이스를 구현하지 않을 경우 컨텍스트 객체는 선택 사항입니다. 예를 들어 클래스 정의 및 핸들러 서명은 다음과 같을 수 있습니다.

public class NoContextHandler { public String handleRequest(Map<String, String> input) { ... } }

핸들러 이름 지정 규칙

Java 내 Lambda 함수의 경우, RequestHandler 또는 RequestStreamHandler 인터페이스를 구현하려면 기본 핸들러 메서드의 이름이 handleRequest여야 합니다. 또한 handleRequest 메서드 위에 @Override 태그를 포함합니다. 함수를 Lambda에 배포할 경우 함수의 구성에서 기본 핸들러를 다음 형식으로 지정합니다.

  • <package>.<Class> – 예: example.OrderHandler.

RequestHandler 또는 RequestStreamHandler 인터페이스를 구현하지 않는 Java 내 Lambda 함수의 경우 핸들러의 이름을 사용할 수 있습니다. 함수를 Lambda에 배포할 경우 함수 구성에서 기본 핸들러를 다음 형식으로 지정합니다.

  • <package>.<Class>::<handler_method_name> – 예: example.Handler::mainHandler.

입력 이벤트 객체 정의 및 액세스

JSON은 Lambda 함수의 가장 일반적인 표준 입력 형식입니다. 이 예제에서 함수는 다음과 유사한 입력을 예상합니다.

{ "order_id": "12345", "amount": 199.99, "item": "Wireless Headphones" }

Java 17에서 Lambda 함수로 작업할 때 예상되는 입력 이벤트의 형태를 Java 레코드로 정의할 수 있습니다. 이 예제에서는 Order 객체를 나타내는 OrderHandler 클래스 내의 레코드를 정의합니다.

public record Order(String orderId, double amount, String item) {}

이 레코드는 예상 입력 형태와 일치합니다. 레코드를 정의한 후 레코드 정의를 준수하는 JSON 입력에 사용하는 핸들러 서명을 작성할 수 있습니다. Java 런타임은이 JSON을 Java 객체로 자동으로 역직렬화합니다. 그런 다음, 객체의 필드에 액세스할 수 있습니다. 예를 들어 event.orderId는 원래 입력에서 orderId의 값을 검색합니다.

참고

Java 레코드는 Java 17 런타임 이상에 포함된 기능입니다. 모든 Java 런타임에서 클래스를 사용하여 이벤트 데이터를 나타낼 수 있습니다. 이러한 경우 Jackson 같은 라이브러리를 사용하여 JSON 입력을 역직렬화할 수 있습니다.

기타 입력 이벤트 유형

Java에서 Lambda 함수에 대해 가능한 입력 이벤트는 많습니다.

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

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

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

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

  • 라이브러리 유형 – 다른 AWS 서비스에서 전송하는 이벤트의 경우 aws-lambda-java-events 라이브러리에 있는 유형을 사용합니다. 예를 들어 Amazon Simple Queue Service(SQS)에서 Lambda 함수를 호출하는 경우 SQSEvent 객체를 입력으로 사용합니다.

Lambda 컨텍스트 객체 액세스 및 사용

Lambda 컨텍스트 객체에는 호출, 함수, 실행 환경에 관한 정보가 포함되어 있습니다. 이 예제에서 컨텍스트 객체는 com.amazonaws.services.lambda.runtime.Context 유형이며, 기본 핸들러 함수의 두 번째 인수입니다.

public String handleRequest(Order event, Context context) { ... }

클래스가 RequestHandler 또는 RequestStreamHandler 인터페이스를 구현하는 경우 컨텍스트 객체는 필수 인수입니다. 그렇지 않으면 컨텍스트 객체는 선택 사항입니다. 허용되는 유효한 핸들러 서명에 대한 자세한 내용은 Java 핸들러에 유효한 클래스 정의 섹션을 참조하세요.

AWS SDK를 사용하여 다른 서비스를 직접적으로 호출하는 경우 몇 가지 주요 영역에서 컨텍스트 객체가 필요합니다. 예를 들어 Amazon CloudWatch에 대한 함수 로그를 생성하려면 context.getLogger() 메서드를 사용하여 로깅할 LambdaLogger 객체를 가져올 수 있습니다. 이 예제에서는 어떤 이유로든 처리가 실패할 경우 로거를 사용하여 오류 메시지를 로깅할 수 있습니다.

context.getLogger().log("Failed to process order: " + e.getMessage());

로깅 외에도 함수 모니터링에 컨텍스트 객체를 사용할 수 있습니다. 컨텍스트 객체에 대한 자세한 내용은 Lambda 컨텍스트 객체를 사용하여 Java 함수 정보 검색 섹션을 참조하세요.

핸들러에서 AWS SDK for Java v2 사용

종종 Lambda 함수를 사용하여 다른 AWS 리소스와 상호 작용하거나 업데이트하는 경우가 있습니다. 이러한 리소스와 인터페이스로 접속하는 가장 간단한 방법은 AWS SDK for Java v2를 사용하는 것입니다.

참고

AWS SDK for Java(v1)는 유지 관리 모드이며 2025년 12월 31일에 지원이 종료됩니다. 앞으로는 AWS SDK for Java v2만 사용하는 것을 권장합니다.

함수에 SDK 종속성을 추가하려면 Gradle용 build.gradle 또는 Maven용 pom.xml 파일에 추가합니다. 함수에 필요한 라이브러리만 추가하는 것이 좋습니다. 이전의 예제 코드에서는 software.amazon.awssdk.services.s3 라이브러리를 사용했습니다. Gradle에서는 build.gradle의 종속성 섹션에 다음 줄을 추가하여 이 종속성을 추가할 수 있습니다.

implementation 'software.amazon.awssdk:s3:2.28.29'

Maven에서는 pom.xml<dependencies> 섹션에 다음 줄을 추가합니다.

<dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>s3</artifactId> <version>2.28.29</version> </dependency>
참고

이는 SDK의 최신 버전이 아닐 수 있습니다. 애플리케이션에 적합한 SDK 버전을 선택합니다.

그런 다음, Java 클래스에서 직접 종속성을 가져옵니다.

import software.amazon.awssdk.services.s3.S3Client; import software.amazon.awssdk.services.s3.model.PutObjectRequest; import software.amazon.awssdk.services.s3.model.S3Exception;

이렇게 하면 예제 코드가 다음과 같이 Amazon S3 클라이언트를 초기화합니다.

private static final S3Client S3_CLIENT = S3Client.builder().build();

이 예제에서는 함수를 간접적으로 호출할 때마다 초기화할 필요가 없도록 기본 핸들러 함수에서 Amazon S3 클라이언트를 초기화했습니다. SDK 클라이언트를 초기화한 후에는 이를 사용하여 다른 AWS 서비스와 상호 작용할 수 있습니다. 예제 코드는 다음과 같이 Amazon S3 PutObject API를 직접적으로 호출합니다.

PutObjectRequest putObjectRequest = PutObjectRequest.builder() .bucket(bucketName) .key(key) .build(); // Convert the receipt content to bytes and upload to S3 S3_CLIENT.putObject(putObjectRequest, RequestBody.fromBytes(receiptContent.getBytes(StandardCharsets.UTF_8)));

환경 변수에 액세스

핸들러 코드에서 System.getenv() 메서드를 사용하여 모든 환경 변수를 참조할 수 있습니다. 이 예제에서는 다음 코드 줄을 사용하여 정의된 RECEIPT_BUCKET 환경 변수를 참조합니다.

String bucketName = System.getenv("RECEIPT_BUCKET"); if (bucketName == null || bucketName.isEmpty()) { throw new IllegalArgumentException("RECEIPT_BUCKET environment variable is not set"); }

전역 상태 사용

Lambda는 함수를 처음 호출하기 전 초기화 단계에서 정적 코드와 클래스 생성자를 실행합니다. 초기화 중에 생성된 리소스는 간접 호출 간의 메모리에 남아 있으므로 함수를 호출할 때마다 메모리를 생성할 필요가 없습니다.

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

Java Lambda 함수의 코드 모범 사례

Lambda 함수를 구축할 때 코딩 모범 사례를 사용하려면 다음 목록의 지침을 준수하세요.

  • 핵심 로직에서 Lambda 핸들러를 분리합니다. 이를 통해 단위 테스트를 수행할 수 있는 더 많은 함수를 만들 수 있습니다.

  • 함수 배포 패키지의 종속성을 제어합니다. AWS Lambda 실행 환경에는 여러 라이브러리가 포함되어 있습니다. 최신 기능 및 보안 업데이트를 활성화하려면 Lambda가 주기적으로 이러한 라이브러리를 업데이트해야 합니다. 이러한 업데이트는 Lambda 함수의 동작에 사소한 변화를 가져올 수 있습니다. 함수가 사용하는 종속성을 완전히 제어하려면 모든 종속성을 배포 패키지로 패키징하세요.

  • 종속성의 복잡성을 최소화합니다. 실행 환경 시작 시 빠르게 로드되는 더 단순한 프레임워크가 권장됩니다. 예를 들어 Spring Framework와 같은 더 복잡한 프레임워크보다는 Dagger 또는 Guice 같은 더 단순한 Java 종속성 주입(IoC) 프레임워크를 선호합니다.

  • 배포 패키지 크기를 런타임 필요에 따라 최소화합니다. 이렇게 하면 호출 전에 배포 패키지를 다운로드하고 압축을 풀 때 걸리는 시간이 단축됩니다. Java에서 작성된 함수의 경우, 배포 패키지의 일부로 전체 AWS SDK 라이브러리를 업로드하지 마세요. 대신, 필요한 SDK의 구성 요소를 선택하는 모듈을 선택적으로 활용합니다(예: DynamoDB, Amazon S3 SDK 모듈, Lambda 핵심 라이브러리).

  • 실행 환경 재사용을 활용하여 함수 성능을 향상시킵니다. 함수 핸들러 외부에서 SDK 클라이언트 및 데이터베이스 연결을 초기화하고 정적 자산을 /tmp 디렉토리에 로컬로 캐시합니다. 동일한 함수 인스턴스에서 처리하는 후속 간접 호출은 이러한 리소스를 재사용할 수 있습니다. 이를 통해 함수 실행 시간을 줄여 비용을 절감합니다.

    호출에서 발생할 수 있는 데이터 유출을 방지하려면 실행 환경을 사용하여 사용자 데이터, 이벤트 또는 보안과 관련된 기타 정보를 저장하지 마세요. 함수가 핸들러 내부 메모리에 저장할 수 없는 변경 가능한 상태에 의존하는 경우 각 사용자에 대해 별도의 함수 또는 별도의 함수 버전을 생성하는 것이 좋습니다.

  • 연결 유지 지시문을 사용하여 지속적인 연결을 유지하세요. Lambda는 시간이 지남에 따라 유휴 연결을 제거합니다. 함수를 호출할 때 유휴 연결을 재사용하려고 하면 연결 오류가 발생합니다. 지속적인 연결을 유지하려면 런타임과 관련된 연결 유지 지시문을 사용하세요. 예를 들어, Node.js에서 연결 유지를 이용해 연결 재사용을 참조하세요.

  • 환경 변수를 사용하여 함수에 운영 파라미터를 전달합니다. 예를 들어, Amazon S3 버킷에 기록하는 경우 기록하고 있는 버킷 이름을 하드 코딩하는 대신 환경 변수로 구성합니다.

  • Lambda 함수에서 함수가 자기 자신을 간접적으로 간접 호출하거나 함수를 다시 간접적으로 간접 호출할 수 있는 프로세스를 시작하는 재귀적 간접 호출을 사용하지 마세요. 리커시브 코드를 사용할 경우, 의도하지 않은 함수 호출이 증가하고 비용이 상승할 수 있습니다. 의도치 않게 간접 호출이 대량으로 발생하는 경우 함수의 예약된 동시성을 즉시 0으로 설정하여 코드를 업데이트하는 동안 해당 함수에 대한 모든 간접 호출을 제한합니다.

  • Lambda 함수 코드에는 문서화되지 않은 비공개 API를 사용하지 마세요. AWS Lambda 관리형 런타임의 경우, Lambda는 주기적으로 보안 및 기능 업데이트를 Lambda의 내부 API에 적용합니다. 이러한 내부 API 업데이트는 이전 버전과 호환되지 않으므로 함수가 이러한 비공개 API에 종속성을 갖는 경우 호출 실패와 같은 의도하지 않은 결과를 초래할 수 있습니다. 공개적으로 사용 가능한 API의 목록은 API 레퍼런스를 참조하세요.

  • 멱등성 코드를 작성합니다. 함수에 멱등성 코드를 작성하면 중복 이벤트가 동일한 방식으로 처리됩니다. 코드는 이벤트를 올바르게 검증하고 중복 이벤트를 정상적으로 처리해야 합니다. 자세한 내용은 멱등성 Lambda 함수를 만들려면 어떻게 해야 합니까? 단원을 참조하십시오.

  • Java DNS 캐시를 사용하지 마십시오. Lambda 함수는 이미 DNS 응답을 캐싱하고 있습니다. 다른 DNS 캐시를 사용하는 경우 연결 시간 초과가 발생할 수 있습니다.

    java.util.logging.Logger 클래스는 JVM DNS 캐시를 간접적으로 활성화할 수 있습니다. 기본 설정을 재정의하려면 logger 초기화 전에 networkaddress.cache.ttl을 0으로 설정하십시오. 예시:

    public class MyHandler { // first set TTL property static{ java.security.Security.setProperty("networkaddress.cache.ttl" , "0"); } // then instantiate logger var logger = org.apache.logging.log4j.LogManager.getLogger(MyHandler.class); }
  • 종속성 .jar 파일을 별도의 /lib 디렉터리에 배치하여 Java에서 생성된 배포 패키지의 압축을 푸는 데 Lambda가 소요하는 시간을 단축합니다. 이는 많은 수의 .class 파일이 있는 단일 jar에 모든 함수 코드를 배치하는 것보다 빠릅니다. 자세한 내용은 .zip 또는 JAR 파일 아카이브를 사용하여 Java Lambda 함수 배포 섹션을 참조하세요.