AWS Lambda를 위한 SDK 시작 시간 단축
AWS SDK for Java 2.x 의 목표 중 하나는 AWS Lambda 함수의 시작 지연 시간을 줄이는 것입니다. SDK에는 시작 시간을 줄이는 변경 사항이 포함되어 있으며, 이에 대해서는 이 항목의 마지막 부분에서 설명합니다.
먼저, 이 항목에서는 콜드 스타트 시간을 줄이기 위해 적용할 수 있는 변경 사항에 초점을 맞춥니다. 여기에는 코드 구조 및 서비스 클라이언트 구성 변경이 포함됩니다.
AWS CRT 기반 HTTP 클라이언트 사용
AWS Lambda로 작업하려면 동기식 시나리오의 경우 AwsCrtHttpClientAwsCrtAsyncHttpClient
이 가이드의 AWS CRT 기반 HTTP 클라이언트 구성 주제에서는 HTTP 클라이언트 사용 시 이점, 종속성을 추가하는 방법, 서비스 클라이언트에서 이를 사용하도록 구성하는 방법을 설명합니다.
사용하지 않는 HTTP 클라이언트 종속성을 제거
AWS CRT 기반 클라이언트를 명시적으로 사용하는 것과 함께 SDK에서 기본적으로 제공하는 다른 HTTP 클라이언트를 제거할 수 있습니다. 로드해야 하는 라이브러리 수가 적을수록 Lambda 시작 시간이 단축되므로 JVM이 로드해야 하는 사용되지 않은 아티팩트를 제거해야 합니다.
Maven pom.xml 파일의 다음 코드 조각은 Apache 기반 HTTP 클라이언트와 Netty 기반 HTTP 클라이언트의 제외를 보여줍니다. (이 클라이언트는 AWS CRT 기반 클라이언트를 사용할 때 필요하지 않습니다.) 이 예제에서는 S3 클라이언트 종속성에서 HTTP 클라이언트 아티팩트를 제외하고 AWS CRT 기반 HTTP 클라이언트에 대한 액세스를 허용하는 aws-crt-client 아티팩트를 추가합니다.
<project> <properties> <aws.java.sdk.version>2.27.21</aws.java.sdk.version> <properties> <dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>bom</artifactId> <version>${aws.java.sdk.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>aws-crt-client</artifactId> </dependency> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>s3</artifactId> <exclusions> <exclusion> <groupId>software.amazon.awssdk</groupId> <artifactId>netty-nio-client</artifactId> </exclusion> <exclusion> <groupId>software.amazon.awssdk</groupId> <artifactId>apache-client</artifactId> </exclusion> </exclusions> </dependency> </dependencies> </project>
참고
pom.xml 파일의 모든 서비스 클라이언트 종속성에 <exclusions> 요소를 추가합니다.
바로가기 검색이 가능하도록 서비스 클라이언트를 구성
- 리전 지정
-
서비스 클라이언트를 생성할 때는 서비스 클라이언트 빌더에서
region메서드를 호출하세요. 이렇게 하면 여러 곳에서 AWS 리전 정보를 확인하는 SDK의 기본 리전 조회 프로세스가 단축됩니다.Lambda 코드를 리전과 독립적으로 유지하려면
region메서드 내에서 다음 코드를 사용하세요. 이 코드는 Lambda 컨테이너에서 설정한AWS_REGION환경 변수에 액세스합니다.Region.of(System.getenv(SdkSystemSetting.AWS_REGION.environmentVariable())) EnvironmentVariableCredentialProvider사용-
리전 정보에 대한 기본 조회 동작과 마찬가지로 SDK는 여러 위치에서 자격 증명을 찾습니다. 서비스 클라이언트를 구축할 때
EnvironmentVariableCredentialProvider를 지정하면 자격 증명용 SDK의 조회 프로세스에서 시간을 절약할 수 있습니다. 참고
이 자격 증명 공급자를 사용하면 Lambda 함수에서 코드를 사용할 수 있지만, Amazon EC2 또는 기타 시스템에서는 이 기능이 작동하지 않을 수 있습니다.
어느 시점에서 Lambda SnapStart for Java를 사용하려는 경우 기본 자격 증명 공급자 체인을 사용하여 자격 증명을 조회해야 합니다.
EnvironmentVariableCredentialsProvider를 지정하면 초기 자격 증명 조회가 작동하지만 SnapStart가 활성화되면 Java 런타임이 컨테이너 자격 증명 환경 변수를 설정합니다. 활성화 시EnvironmentVariableCredentialsProvider(액세스 키 환경 변수)에서 사용하는 환경 변수는 Java SDK에서 사용할 수 없습니다.
다음 코드 조각은 Lambda 환경에서 사용하도록 적절하게 구성된 S3 서비스 클라이언트를 보여줍니다.
S3Client s3Client = S3Client.builder() .region(Region.of(System.getenv(SdkSystemSetting.AWS_REGION.environmentVariable()))) .credentialsProvider(EnvironmentVariableCredentialsProvider.create()) .httpClient(AwsCrtHttpClient.builder().build()) .build();
Lambda 함수 핸들러 외부에서 SDK 클라이언트 초기화
Lambda 핸들러 메서드 외부에서 SDK 클라이언트를 초기화하는 것이 좋습니다. 이렇게 하면 실행 컨텍스트를 재사용하는 경우 서비스 클라이언트의 초기화를 건너뛸 수 있습니다. 클라이언트 인스턴스와 해당 연결을 재사용하면 핸들러 메서드의 후속 호출이 더 빠르게 발생합니다.
다음 예제에서는 정적 팩토리 메서드를 사용하여 생성자에서 S3Client 인스턴스를 초기화합니다. Lambda 환경에서 관리하는 컨테이너를 재사용하는 경우 초기화된 S3Client 인스턴스가 재사용됩니다.
public class App implements RequestHandler<Object, Object> { private final S3Client s3Client; public App() { s3Client = DependencyFactory.s3Client(); } @Override public Object handle Request(final Object input, final Context context) { ListBucketResponse response = s3Client.listBuckets(); // Process the response. } }
종속성 주입을 최소화
종속성 주입(DI) 프레임워크는 설정 프로세스를 완료하는 데 시간이 더 걸릴 수 있습니다. 또한 추가 종속성이 필요할 수 있으며, 이 경우 로드하는 데 시간이 걸립니다.
DI 프레임워크가 필요한 경우 Dagger
AWS Lambda를 대상으로 하는 Maven 아키타입 사용
AWS Java SDK 팀은 시작 시간을 최소화하면서 Lambda 프로젝트를 부트스트랩할 수 있는 Maven Archetype
아키타입에 대해 자세히 알아보고 예제 배포를 진행하려면 이 블로그 게시물
Java용 Lambda SnapStart를 고려
런타임 요구 사항이 호환되는 경우 AWS에서 Java용 Lambda SnapStart를 제공합니다. Lambda SnapStart는 Java 기능의 시작 성능을 향상시키는 인프라 기반 솔루션입니다. 새 버전의 함수를 게시하면 Lambda SnapStart가 이를 초기화하고 메모리 및 디스크 상태에 대한 변경이 불가능하고 암호화된 스냅샷을 생성합니다. 그런 다음 SnapStart는 재사용을 위해 스냅샷을 캐싱합니다.
시작 시간에 영향을 미치는 버전 2.x 변경 사항
코드 변경 사항 외에도 SDK for Java 버전 2.x에는 시작 시간을 줄이는 세 가지 주요 변경 사항이 포함되어 있습니다.
-
초기화 시간을 개선하는 직렬화 라이브러리인 jackson-jr
을 사용 -
JDK의 일부인 날짜 및 시간 객체에 대해 java.time
라이브러리를 사용 -
로깅 facade에 Slf4j
를 사용
추가 리소스
AWS Lambda 개발자 안내서에는 Java에만 국한되지 않는 Lambda 함수 개발을 위한 모범 사례에 대한 단원이 포함되어 있습니다.
AWS Lambda를 사용하는 Java로 클라우드 네이티브 애플리케이션을 구축하는 예제는 이 워크숍 콘텐츠
시작 대기 시간을 줄이기 위해 미리 컴파일된 정적 이미지를 사용하는 것을 고려할 수 있습니다. 예를 들어 Java 2.x 및 Maven용 SDK를 사용하여 GraalVM 네이티브 이미지를 빌드할 수 있습니다.