

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Kurangi waktu startup SDK untuk AWS Lambda
<a name="lambda-optimize-starttime"></a>

Salah satu tujuannya AWS SDK for Java 2.x adalah untuk mengurangi latensi startup untuk AWS Lambda fungsi. SDK berisi perubahan yang mengurangi waktu startup, yang dibahas di akhir topik ini.

Pertama, topik ini berfokus pada perubahan yang dapat Anda lakukan untuk mengurangi waktu mulai dingin. Ini termasuk membuat perubahan dalam struktur kode Anda dan dalam konfigurasi klien layanan.

## Gunakan klien HTTP AWS berbasis CRT
<a name="lambda-quick-url"></a>

Untuk bekerja dengan AWS Lambda, kami merekomendasikan skenario [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)untuk sinkron dan [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)untuk skenario asinkron.

[Konfigurasikan AWS klien HTTP berbasis CRT](http-configuration-crt.md)Topik dalam panduan ini menjelaskan manfaat menggunakan klien HTTP, cara menambahkan ketergantungan, dan cara mengonfigurasi penggunaannya oleh klien layanan. 

## Hapus dependensi klien HTTP yang tidak digunakan
<a name="lambda-quick-remove-deps"></a>

Seiring dengan penggunaan eksplisit klien AWS berbasis CRT, Anda dapat menghapus klien HTTP lain yang dibawa SDK secara default. Waktu startup Lambda berkurang ketika lebih sedikit pustaka yang perlu dimuat, jadi Anda harus menghapus artefak yang tidak terpakai yang perlu dimuat JVM.

Cuplikan berikut dari `pom.xml` file Maven menunjukkan pengecualian klien HTTP berbasis Apache dan klien HTTP berbasis Netty. (Klien ini tidak diperlukan saat Anda menggunakan klien AWS berbasis CRT.) Contoh ini mengecualikan artefak klien HTTP dari ketergantungan klien S3 dan menambahkan `aws-crt-client` artefak untuk memungkinkan akses ke klien HTTP berbasis CRT. AWS 

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

**catatan**  
Tambahkan `<exclusions>` elemen ke semua dependensi klien layanan di file Anda`pom.xml`.

## Konfigurasikan klien layanan untuk memintas pencarian
<a name="lambda-quick-clients"></a>

**Tentukan wilayah**  
Saat Anda membuat klien layanan, panggil `region` metode pada pembuat klien layanan. Ini memintas [proses pencarian Wilayah](region-selection.md#default-region-provider-chain) default SDK yang memeriksa beberapa tempat untuk informasi. Wilayah AWS   
Untuk menjaga kode Lambda independen dari wilayah, gunakan kode berikut di dalam metode. `region` Kode ini mengakses variabel `AWS_REGION` lingkungan yang ditetapkan oleh wadah Lambda.  

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

**Gunakan `EnvironmentVariableCredentialProvider`**  
Sama seperti perilaku pencarian default untuk informasi Wilayah, SDK mencari kredensional di beberapa tempat. Dengan menentukan [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)kapan Anda membangun klien layanan, Anda menghemat waktu dalam proses pencarian SDK untuk kredensi.  
Menggunakan penyedia kredensi ini memungkinkan kode untuk digunakan dalam Lambda fungsi, tetapi mungkin tidak berfungsi pada Amazon EC2 atau sistem lain.  
Jika Anda berniat menggunakan [Lambda SnapStart untuk Java](#lambda-quick-snapstart) di beberapa titik, Anda harus mengandalkan rantai penyedia kredensi default untuk mencari kredensil. Jika Anda menentukan`EnvironmentVariableCredentialsProvider`, pencarian kredensial awal berfungsi, tetapi ketika SnapStart diaktifkan, [runtime Java menetapkan variabel lingkungan kredensi kontainer](https://docs.aws.amazon.com/lambda/latest/dg/snapstart-activate.html#snapstart-credentials). Pada aktivasi, variabel lingkungan yang digunakan oleh variabel lingkungan kunci `EnvironmentVariableCredentialsProvider` akses — tidak tersedia untuk Java SDK.

Cuplikan kode berikut menunjukkan klien layanan S3 yang dikonfigurasi dengan tepat untuk digunakan di lingkungan Lambda.

```
S3Client s3Client = S3Client.builder()
    .region(Region.of(System.getenv(SdkSystemSetting.AWS_REGION.environmentVariable())))
    .credentialsProvider(EnvironmentVariableCredentialsProvider.create())
    .httpClient(AwsCrtHttpClient.builder().build())
    .build();
```

## Inisialisasi klien SDK di luar penangan fungsi Lambda
<a name="lambda-quick-initialize"></a>

Sebaiknya inisialisasi klien SDK di luar metode penangan Lambda. Dengan cara ini, jika konteks eksekusi digunakan kembali, inisialisasi klien layanan dapat dilewati. Dengan menggunakan kembali instance klien dan koneksinya, pemanggilan berikutnya dari metode handler terjadi lebih cepat.

Dalam contoh berikut, `S3Client` instance diinisialisasi dalam konstruktor menggunakan metode pabrik statis. Jika wadah yang dikelola oleh lingkungan Lambda digunakan kembali, instance yang diinisialisasi `S3Client` akan digunakan kembali.

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

## Minimalkan injeksi ketergantungan
<a name="lambda-quick-di"></a>

Kerangka kerja injeksi ketergantungan (DI) mungkin membutuhkan waktu tambahan untuk menyelesaikan proses penyiapan. Mereka mungkin juga memerlukan dependensi tambahan, yang membutuhkan waktu untuk memuat.

Jika kerangka kerja DI diperlukan, kami sarankan menggunakan kerangka kerja DI ringan seperti [Dagger](https://dagger.dev/dev-guide/).

## Gunakan penargetan Maven Archetype AWS Lambda
<a name="lambda-quick-maven"></a>

Tim AWS Java SDK telah mengembangkan [template Maven Archetype](https://github.com/aws/aws-sdk-java-v2/tree/master/archetypes/archetype-lambda) untuk mem-bootstrap proyek Lambda dengan waktu startup minimal. Anda dapat membangun proyek Maven dari pola dasar dan mengetahui bahwa dependensi dikonfigurasi sesuai untuk lingkungan Lambda. 

[Untuk mempelajari lebih lanjut tentang arketipe dan bekerja melalui contoh penyebaran, lihat posting blog ini.](https://aws.amazon.com/blogs/developer/bootstrapping-a-java-lambda-application-with-minimal-aws-java-sdk-startup-time-using-maven/)

## Pertimbangkan Lambda SnapStart untuk Java
<a name="lambda-quick-snapstart"></a>

Jika persyaratan runtime Anda kompatibel, AWS tawarkan [ SnapStart Lambda](https://docs.aws.amazon.com/lambda/latest/dg/snapstart.html) untuk Java. Lambda SnapStart adalah solusi berbasis infrastruktur yang meningkatkan kinerja startup untuk fungsi Java. Saat Anda mempublikasikan versi baru suatu fungsi, Lambda SnapStart menginisialisasinya dan mengambil snapshot memori dan status disk yang tidak dapat diubah dan terenkripsi. SnapStart kemudian menyimpan snapshot untuk digunakan kembali.

## Perubahan versi 2.x yang memengaruhi waktu startup
<a name="example-client-configuration"></a>

Selain perubahan yang Anda buat pada kode Anda, SDK for Java versi 2.x mencakup tiga perubahan utama yang mengurangi waktu startup:
+ Penggunaan [jackson-jr](https://github.com/FasterXML/jackson-jr), yang merupakan pustaka serialisasi yang meningkatkan waktu inisialisasi
+ Penggunaan pustaka [java.time](https://docs.oracle.com/javase/8/docs/api/index.html?java/time.html) untuk objek tanggal dan waktu, yang merupakan bagian dari JDK
+ Penggunaan [SLF4j untuk fasad penebangan](https://www.slf4j.org/)

## Sumber daya tambahan
<a name="lambda-quick-resources"></a>

Panduan AWS Lambda Pengembang berisi [bagian tentang praktik terbaik](https://docs.aws.amazon.com/lambda/latest/dg/best-practices.html) untuk mengembangkan fungsi Lambda yang tidak spesifik untuk Java.

Untuk contoh membangun aplikasi cloud-native di Java yang menggunakan AWS Lambda, lihat konten [lokakarya](https://github.com/aws-samples/aws-lambda-java-workshop) ini. Optimalisasi kinerja diskusi lokakarya dan praktik terbaik lainnya.

Anda dapat mempertimbangkan untuk menggunakan gambar statis yang dikompilasi sebelumnya untuk mengurangi latensi startup. Misalnya, Anda dapat menggunakan SDK for Java 2.x dan Maven untuk [membuat](setup-project-graalvm.md) gambar asli GraalVM.