View a markdown version of this page

Riduci i tempi di avvio dell'SDK per AWS Lambda - AWS SDK for Java 2.x

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Riduci i tempi di avvio dell'SDK per AWS Lambda

Uno degli obiettivi di AWS SDK for Java 2.x è ridurre la latenza di avvio delle funzioni AWS Lambda . L'SDK contiene modifiche che riducono i tempi di avvio, discusse alla fine di questo argomento.

Innanzitutto, questo argomento si concentra sulle modifiche che è possibile apportare per ridurre i tempi di avvio a freddo. Queste includono la modifica della struttura del codice e della configurazione dei client di servizio.

Usa un AWS CRT-based Client HTTP

Per lavorare con AWS Lambda, consigliamo gli scenari AwsCrtHttpClient sincroni e AwsCrtAsyncHttpClient gli scenari asincroni.

L'Configurazione AWS dei client HTTP basati su CRTargomento di questa guida descrive i vantaggi dell'utilizzo dei client HTTP, come aggiungere la dipendenza e come configurarne l'uso da parte dei client di servizio.

Rimuovi le dipendenze inutilizzate dei client HTTP

Oltre all'uso esplicito di un AWS CRT-based client, puoi rimuovere altri client HTTP che l'SDK introduce per impostazione predefinita. Il tempo di avvio di Lambda si riduce quando è necessario caricare un numero inferiore di librerie, quindi è necessario rimuovere tutti gli artefatti inutilizzati che la JVM deve caricare.

Il seguente frammento di un pom.xml file Maven mostra l'esclusione del client HTTP e del client HTTP. Apache-based Netty-based (Questi client non sono necessari quando si utilizza un client.) AWS CRT-based Questo esempio esclude gli artefatti del client HTTP dalla dipendenza del client S3 e li aggiunge per consentire l'aws-crt-clientaccesso ai client HTTP. AWS CRT-based

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

Aggiungi l'<exclusions>elemento a tutte le dipendenze dei client di servizio nel tuo file. pom.xml

Configura i client di servizio per eseguire ricerche rapide

Specifica una regione

Quando crei un client di servizio, chiama il region metodo nel generatore di client di servizio. Questo accorcia il processo di ricerca della regione predefinito dell'SDK che controlla le informazioni in diverse posizioni. Regione AWS

Per mantenere il codice Lambda indipendente dalla regione, utilizza il codice seguente all'interno del metodo. region Questo codice accede alla variabile di AWS_REGION ambiente impostata dal contenitore Lambda.

Region.of(System.getenv(SdkSystemSetting.AWS_REGION.environmentVariable()))
Utilizzo della EnvironmentVariableCredentialProvider

Proprio come il comportamento di ricerca predefinito per le informazioni sulla regione, l'SDK cerca le credenziali in diversi punti. Specificando EnvironmentVariableCredentialProvider quando si crea un client di servizio, si risparmia tempo nel processo di ricerca delle credenziali dell'SDK.

Nota

L'utilizzo di questo provider di credenziali consente di utilizzare il codice nelle Lambda funzioni, ma potrebbe non funzionare su altri sistemi. Amazon EC2

Se intendi utilizzare Lambda SnapStart per Java a un certo punto, dovresti fare affidamento sulla catena di provider di credenziali predefinita per cercare le credenziali. Se si specifica ilEnvironmentVariableCredentialsProvider, la ricerca iniziale delle credenziali funziona, ma quando SnapStart viene attivata, il runtime Java imposta le variabili di ambiente delle credenziali del contenitore. Al momento dell'attivazione, le variabili di ambiente utilizzate dalle variabili di ambiente EnvironmentVariableCredentialsProvider —access key— non sono disponibili per Java SDK.

Il seguente frammento di codice mostra un client di servizio S3 configurato in modo appropriato per l'uso in un ambiente Lambda.

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

Inizializza il client SDK all'esterno del gestore di funzioni Lambda

Consigliamo di inizializzare un client SDK al di fuori del metodo del gestore Lambda. In questo modo, se il contesto di esecuzione viene riutilizzato, l'inizializzazione del client di servizio può essere ignorata. Riutilizzando l'istanza del client e le relative connessioni, le successive invocazioni del metodo handler avvengono più rapidamente.

Nell'esempio seguente, l'S3Clientistanza viene inizializzata nel costruttore utilizzando un metodo factory statico. Se il contenitore gestito dall'ambiente Lambda viene riutilizzato, l'istanza S3Client inizializzata viene riutilizzata.

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

Ridurre al minimo l'iniezione di dipendenze

I framework di iniezione di dipendenza (DI) potrebbero richiedere più tempo per completare il processo di configurazione. Potrebbero inoltre richiedere dipendenze aggiuntive, il cui caricamento richiede tempo.

Se è necessario un framework DI, consigliamo di utilizzare framework DI leggeri come Dagger. https://dagger.dev/dev-guide/

Usa un targeting Maven Archetype AWS Lambda

Il team AWS Java SDK ha sviluppato un modello Maven Archetype per avviare un progetto Lambda con tempi di avvio minimi. Puoi creare un progetto Maven partendo dall'archetipo e sapere che le dipendenze sono configurate in modo adeguato per l'ambiente Lambda.

Per saperne di più sull'archetipo e lavorare su un esempio di implementazione, consulta questo post del blog. https://aws.amazon.com/blogs/developer/bootstrapping-a-java-lambda-application-with-minimal-aws-java-sdk-startup-time-using-maven/

Prendi in considerazione Lambda for Java SnapStart

Se i requisiti di runtime sono compatibili, AWS offre Lambda SnapStart per Java. Lambda SnapStart è una soluzione basata sull'infrastruttura che migliora le prestazioni di avvio per le funzioni Java. Quando si pubblica una nuova versione di una funzione, Lambda la SnapStart inizializza e acquisisce un'istantanea immutabile e crittografata della memoria e dello stato del disco. SnapStart quindi memorizza nella cache l'istantanea per riutilizzarla.

Per trarne il massimo vantaggio dall'avvio SnapStart, utilizza l'SdkWarmUpAPI per riscaldare tutti i client SDK prima che Lambda scatti l'istantanea. L'istantanea acquisisce quindi i client riscaldati, in modo che ogni funzione ripristinata inizi con quelli pronti. Per ulteriori informazioni, consulta Prendi in considerazione la possibilità di riscaldare i client SDK con SdkWarmUp.

Prendi in considerazione la possibilità di riscaldare i client SDK con SdkWarmUp

L'SdkWarmUpAPI inclusa AWS SDK for Java 2.x riscalda i client SDK durante l'inizializzazione dell'applicazione. Di conseguenza, la prima chiamata all'API di servizio è più veloce. Il riscaldamento crea un client e richiama un'operazione per eseguire il percorso di richiesta dell'SDK. Ciò avviene prima che l'applicazione gestisca il traffico reale. Con una sola chiamata, puoi attivare tutti i client SDK sul tuo classpath o solo i client specifici utilizzati dall'applicazione.

Puoi utilizzare l'SdkWarmUpAPI con funzionalità Lambda che riducono i cold start, come Lambda e provisioned concurrency. SnapStart Per ulteriori informazioni sulla configurazione e l'utilizzo, consulta. SdkWarmUp Riscalda i client SDK nel AWS SDK for Java 2.x

Modifiche alla versione 2.x che influiscono sui tempi di avvio

Oltre alle modifiche apportate al codice, la versione 2.x dell'SDK per Java include tre modifiche principali che riducono i tempi di avvio:

Risorse aggiuntive

La AWS Lambda Developer Guide contiene una sezione sulle migliori pratiche per lo sviluppo di funzioni Lambda che non sono specifiche per Java.

Per un esempio di creazione di un'applicazione nativa per il cloud in Java che utilizza AWS Lambda, consulta il contenuto di questo workshop. Il workshop ha discusso dell'ottimizzazione delle prestazioni e di altre best practice.

Puoi prendere in considerazione l'utilizzo di immagini statiche compilate in anticipo per ridurre la latenza di avvio. Ad esempio, puoi utilizzare l'SDK per Java 2.x e Maven per creare un'immagine nativa GraalVM. Configura un progetto GraalVM Native Image che utilizza AWS SDK for Java 2.x