SDK 시작 시간 단축 AWS Lambda - AWS SDK for Java 2.x

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

SDK 시작 시간 단축 AWS Lambda

의 목표 중 하나는 AWS Lambda 함수의 시작 지연 시간을 줄이는 것입니다. AWS SDK for Java 2.x SDK에는 시작 시간을 줄이는 변경 사항이 포함되어 있으며, 이에 대해서는 이 항목의 마지막 부분에서 설명합니다.

먼저, 이 항목에서는 콜드 스타트 시간을 줄이기 위해 적용할 수 있는 변경 사항에 초점을 맞춥니다. 여기에는 코드 구조 및 서비스 클라이언트 구성 변경이 포함됩니다.

SDK의 UrlConnectionHttpClient 사용

동기 시나리오의 경우 Java 2.x용 SDK는 JDK의 HTTP 클라이언트 클래스를 기반으로 하는 UrlConnectionHttpClient 클래스를 제공합니다. UrlConnectionHttpClient는 이미 클래스 경로에 있는 클래스를 기반으로 하기 때문에 추가 종속성을 로드할 필요가 없습니다.

Lambda 프로젝트에 UrlConnectionHttpClient를 추가하고 사용을 구성하는 방법에 대한 자세한 내용은 URL 연결 기반 HTTP 클라이언트 구성을 참조하세요.

참고

SDK의 ApacheHttpClient와 비교할 때 UrlConnectionHttpClient에는 몇 가지 기능 제한이 있습니다. ApacheHttpClient는 SDK의 기본 비동기 HTTP 클라이언트입니다. 예를 들어 UrlConnectionHttpClient에서는 HTTP PATCH 메서드를 지원하지 않습니다.

일부 AWS API 작업에는 PATCH 요청이 필요합니다. 이러한 작업 이름은 일반적으로 Update*로 시작합니다. 다음은 몇 가지 예제입니다.

를 사용할 수 있는 UrlConnectionHttpClient 경우 먼저 사용 중인 API 참조를 참조하십시오. AWS 서비스 필요한 작업이 PATCH 작업을 사용하는지 확인하세요.

SDK의 AwsCrtAsyncHttpClient 사용

AwsCrtAsyncHttpClient는 SDK에서 Lambda 시작 시간을 단축하기 위한 비동기식 대응책입니다.

AwsCrtAsyncHttpClient는 비동기식 비차단 HTTP 클라이언트입니다. C 프로그래밍 언어로 작성된 AWS Common Runtime의 Java 바인딩을 기반으로 구축되었습니다. AWS 커먼 런타임 개발의 목표 중 하나는 빠른 성능입니다.

이 가이드의 HTTP 클라이언트 구성 단원에는 Lambda 프로젝트에 AwsCrtAsyncHttpClient를 추가하고 사용을 구성하는 방법에 대한 정보가 있습니다.

사용하지 않는 HTTP 클라이언트 종속성을 제거

UrlConnectionHttpClient 또는 AwsCrtAsyncHttpClient를 명시적으로 사용하는 것과 함께 SDK에서 기본적으로 제공하는 다른 HTTP 클라이언트를 제거할 수 있습니다. 로드해야 하는 라이브러리 수가 적을수록 Lambda 시작 시간이 단축되므로 JVM이 로드해야 하는 사용되지 않은 아티팩트를 제거해야 합니다.

Maven pom.xml 파일의 다음 코드 조각은 Apache 기반 HTTP 클라이언트와 Netty 기반 HTTP 클라이언트의 제외를 보여줍니다. (UrlConnectionHttpClient를 사용할 때는 이러한 클라이언트가 필요하지 않습니다.) 이 예제에서는 S3 클라이언트 종속성에서 HTTP 클라이언트 아티팩트를 제외하고 UrlConnectionHttpClient 클래스를 가져오는 url-connection-client 아티팩트를 추가합니다.

<project> <properties> <aws.java.sdk.version>2.17.290</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>url-connection-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>

AwsCrtAsyncHttpClient를 사용하는 경우 url-connection-client에 대한 종속성을 aws-crt-client에 대한 종속성으로 바꾸세요.

참고

pom.xml 파일의 모든 서비스 클라이언트 종속성에 <exclusions> 요소를 추가합니다.

바로가기 검색이 가능하도록 서비스 클라이언트를 구성

리전 지정

서비스 클라이언트를 생성할 때는 서비스 클라이언트 빌더에서 region 메서드를 호출하세요. 이렇게 하면 여러 곳에서 정보를 확인하는 SDK의 기본 지역 조회 프로세스가 단축됩니다. AWS 리전

Lambda 코드를 리전과 독립적으로 유지하려면 region 메서드 내에서 다음 코드를 사용하세요. 이 코드는 Lambda 컨테이너에서 설정한 AWS_REGION 환경 변수에 액세스합니다.

Region.of(System.getenv(SdkSystemSetting.AWS_REGION.environmentVariable()))
EnvironmentVariableCredentialProvider 사용

리전 정보에 대한 기본 조회 동작과 마찬가지로 SDK는 여러 위치에서 자격 증명을 찾습니다. 서비스 클라이언트를 빌드할 때 EnvironmentVariableCredentialProvider를 지정하면 SDK의 조회 프로세스에서 시간을 절약할 수 있습니다.

참고

이 자격 증명 공급자를 사용하면 코드를 Lambda 함수에서 사용할 수 있지만 다른 시스템에서는 작동하지 않을 수 있습니다. Amazon EC2

다음 코드 조각은 Lambda 환경에서 사용하도록 적절하게 구성된 S3 서비스 클라이언트를 보여줍니다.

S3Client client = S3Client.builder() .region(Region.of(System.getenv(SdkSystemSetting.AWS_REGION.environmentVariable()))) .credentialsProvider(EnvironmentVariableCredentialsProvider.create()) .httpClient(UrlConnectionHttpClient.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와 같은 가벼운 DI 프레임워크를 사용하는 것이 좋습니다.

Maven 아키타이프 타겟팅 사용 AWS Lambda

AWS Java SDK 팀은 시작 시간을 최소화하면서 Lambda 프로젝트를 부트스트랩할 수 있는 Maven Archetype 템플릿을 개발했습니다. 아키타입에서 Maven 프로젝트를 구축하고 종속성이 Lambda 환경에 적합하게 구성되어 있는지 알 수 있습니다.

아키타입에 대해 자세히 알아보고 예제 배포를 진행하려면 이 블로그 게시물을 참조하세요.

자바용 SnapStart Lambda를 고려해 보세요

런타임 요구 사항이 호환되는 경우 Java용 SnapStart Lambda를 AWS 제공합니다. SnapStart Lambda는 Java 함수의 시작 성능을 향상시키는 인프라 기반 솔루션입니다. 새 버전의 함수를 게시하면 SnapStart Lambda는 함수를 초기화하고 메모리 및 디스크 상태에 대한 변경 불가능하고 암호화된 스냅샷을 생성합니다. SnapStart 그런 다음 재사용을 위해 스냅샷을 캐싱합니다.

시작 시간에 영향을 미치는 버전 2.x 변경 사항

코드 변경 사항 외에도 SDK for Java 버전 2.x에는 시작 시간을 줄이는 세 가지 주요 변경 사항이 포함되어 있습니다.

  • 초기화 시간을 개선하는 직렬화 라이브러리인 jackson-jr을 사용

  • JDK의 일부인 날짜 및 시간 객체에 대해 java.time 라이브러리를 사용

  • 로깅 facade에 Slf4j를 사용

추가적인 리소스

AWS Lambda 개발자 안내서에는 Java에만 국한되지 않는 Lambda 함수 개발을 위한 모범 사례에 대한 섹션이 포함되어 있습니다.

를 사용하는 Java로 클라우드 네이티브 애플리케이션을 구축하는 예제는 이 워크숍 AWS Lambda콘텐츠를 참조하십시오. 워크숍에서는 성능 최적화 및 기타 모범 사례에 대해 논의합니다.

시작 대기 시간을 줄이기 위해 미리 컴파일된 정적 이미지를 사용하는 것을 고려할 수 있습니다. 예를 들어 Java 2.x 및 Maven용 SDK를 사용하여 GraalVM 네이티브 이미지를 빌드할 수 있습니다.