

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

# 의 SDK 시작 시간 단축 AWS Lambda
<a name="lambda-optimize-starttime"></a>

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

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

## AWS CRT 기반 HTTP 클라이언트 사용
<a name="lambda-quick-url"></a>

작업의 경우 동기식 시나리오[https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/crt/AwsCrtHttpClient.html](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/crt/AwsCrtHttpClient.html)의 경우 AWS Lambda, 비동기식 시나리오의 [https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/crt/AwsCrtAsyncHttpClient.html](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/http/crt/AwsCrtAsyncHttpClient.html) 경우를 사용하는 것이 좋습니다.

이 가이드의 [AWS CRT 기반 HTTP 클라이언트 구성](http-configuration-crt.md) 주제에서는 HTTP 클라이언트 사용 시 이점, 종속성을 추가하는 방법, 서비스 클라이언트에서 이를 사용하도록 구성하는 방법을 설명합니다.

## 사용하지 않는 HTTP 클라이언트 종속성을 제거
<a name="lambda-quick-remove-deps"></a>

 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>` 요소를 추가합니다.

## 바로가기 검색이 가능하도록 서비스 클라이언트를 구성
<a name="lambda-quick-clients"></a>

**리전 지정**  
서비스 클라이언트를 생성할 때는 서비스 클라이언트 빌더에서 `region` 메서드를 호출하세요. 이렇게 하면 여러 위치에서 AWS 리전 정보를 확인하는 SDK의 기본 [리전 조회 프로세스가](region-selection.md#default-region-provider-chain) 단축됩니다.  
Lambda 코드를 리전과 독립적으로 유지하려면 `region` 메서드 내에서 다음 코드를 사용하세요. 이 코드는 Lambda 컨테이너에서 설정한 `AWS_REGION` 환경 변수에 액세스합니다.  

```
Region.of(System.getenv(SdkSystemSetting.AWS_REGION.environmentVariable()))
```

**`EnvironmentVariableCredentialProvider` 사용**  
리전 정보에 대한 기본 조회 동작과 마찬가지로 SDK는 여러 위치에서 자격 증명을 찾습니다. 서비스 클라이언트를 구축할 때 [https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/EnvironmentVariableCredentialsProvider.html](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/auth/credentials/EnvironmentVariableCredentialsProvider.html)를 지정하면 자격 증명용 SDK의 조회 프로세스에서 시간을 절약할 수 있습니다.  
이 자격 증명 공급자를 사용하면 코드를 Lambda 함수에 사용할 수 있지만 Amazon EC2 또는 다른 시스템에서는 작동하지 않을 수 있습니다.  
어느 시점에서 [Lambda SnapStart for Java](#lambda-quick-snapstart)를 사용하려는 경우 기본 자격 증명 공급자 체인을 사용하여 자격 증명을 조회해야 합니다. `EnvironmentVariableCredentialsProvider`를 지정하면 초기 자격 증명 조회가 작동하지만 SnapStart가 활성화되면 [Java 런타임이 컨테이너 자격 증명 환경 변수를 설정](https://docs.aws.amazon.com/lambda/latest/dg/snapstart-activate.html#snapstart-credentials)합니다. 활성화 시 `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 클라이언트 초기화
<a name="lambda-quick-initialize"></a>

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.
    }
}
```

## 종속성 주입을 최소화
<a name="lambda-quick-di"></a>

종속성 주입(DI) 프레임워크는 설정 프로세스를 완료하는 데 시간이 더 걸릴 수 있습니다. 또한 추가 종속성이 필요할 수 있으며, 이 경우 로드하는 데 시간이 걸립니다.

DI 프레임워크가 필요한 경우 [Dagger](https://dagger.dev/dev-guide/)와 같은 가벼운 DI 프레임워크를 사용하는 것이 좋습니다.

## Maven Archetype 타겟팅 사용 AWS Lambda
<a name="lambda-quick-maven"></a>

 AWS Java SDK 팀은 시작 시간을 최소화하면서 Lambda 프로젝트를 부트스트랩하기 위해 [Maven Archetype](https://github.com/aws/aws-sdk-java-v2/tree/master/archetypes/archetype-lambda) 템플릿을 개발했습니다. 아키타입에서 Maven 프로젝트를 구축하고 종속성이 Lambda 환경에 적합하게 구성되어 있는지 알 수 있습니다.

아키타입에 대해 자세히 알아보고 예제 배포를 진행하려면 이 [블로그 게시물](https://aws.amazon.com/blogs/developer/bootstrapping-a-java-lambda-application-with-minimal-aws-java-sdk-startup-time-using-maven/)을 참조하세요.

## Java용 Lambda SnapStart를 고려
<a name="lambda-quick-snapstart"></a>

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

## 시작 시간에 영향을 미치는 버전 2.x 변경 사항
<a name="example-client-configuration"></a>

코드 변경 사항 외에도 SDK for Java 버전 2.x에는 시작 시간을 줄이는 세 가지 주요 변경 사항이 포함되어 있습니다.
+ 초기화 시간을 개선하는 직렬화 라이브러리인 [jackson-jr](https://github.com/FasterXML/jackson-jr)을 사용
+ JDK의 일부인 날짜 및 시간 객체에 대해 [java.time](https://docs.oracle.com/javase/8/docs/api/index.html?java/time.html) 라이브러리를 사용
+ 로깅 facade에 [Slf4j](https://www.slf4j.org/)를 사용

## 추가 리소스
<a name="lambda-quick-resources"></a>

 AWS Lambda 개발자 안내서에는 Java 전용이 아닌 Lambda 함수를 개발하기 위한 [모범 사례에 대한 섹션](https://docs.aws.amazon.com/lambda/latest/dg/best-practices.html)이 포함되어 있습니다.

가 사용하는 Java에서 클라우드 네이티브 애플리케이션을 빌드하는 예제는이 [워크숍 콘텐츠를](https://github.com/aws-samples/aws-lambda-java-workshop) AWS Lambda참조하세요. 워크숍에서는 성능 최적화 및 기타 모범 사례에 대해 논의합니다.

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