Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Réduisez le temps de SDK démarrage pour AWS Lambda
L'un des objectifs du AWS SDK for Java 2.x est de réduire la latence de démarrage des AWS Lambda fonctions. SDKcontient des modifications qui réduisent le temps de démarrage, qui sont abordées à la fin de cette rubrique.
Tout d'abord, cette rubrique se concentre sur les modifications que vous pouvez apporter pour réduire les temps de démarrage à froid. Il s'agit notamment de modifier la structure de votre code et la configuration des clients de service.
Utiliser un HTTP client AWS CRT basé
Pour travailler avec AWS Lambda, nous recommandons l'utilisation AwsCrtHttpClient
AwsCrtAsyncHttpClient
La Configuration de HTTP clients AWS CRT basés sur la configuration rubrique de ce guide décrit les avantages de l'utilisation des HTTP clients, comment ajouter la dépendance et comment configurer leur utilisation par les clients de service.
Supprimer les dépendances HTTP client inutilisées
Outre l'utilisation explicite d'un client AWS CRT basé, vous pouvez supprimer les autres HTTP clients qu'il SDK introduit par défaut. Le temps de démarrage de Lambda est réduit lorsque moins de bibliothèques doivent être chargées. Vous devez donc supprimer tous les JVM artefacts inutilisés à charger.
L'extrait de pom.xml
fichier Maven suivant montre l'exclusion du client basé sur Apache et du HTTP client basé sur Netty. HTTP (Ces clients ne sont pas nécessaires lorsque vous utilisez un client AWS CRT basé.) Cet exemple exclut les artefacts du HTTP client de la dépendance du client S3 et ajoute l'aws-crt-client
artefact pour autoriser l'accès aux HTTP clients AWS CRT basés.
<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>
Note
Ajoutez l'<exclusions>
élément à toutes les dépendances des clients de service dans votre pom.xml
fichier.
Configuration des clients de service pour des recherches de raccourcis
- Spécifiez une région
-
Lorsque vous créez un client de service, appelez la
region
méthode dans le générateur de clients de services. Cela raccourcit le processus SDK de recherche de région par défaut qui vérifie les Région AWS informations à plusieurs endroits.Pour que le code Lambda reste indépendant de la région, utilisez le code suivant dans la
region
méthode. Ce code accède à la variable d'AWS_REGION
environnement définie par le conteneur Lambda.Region.of(System.getenv(SdkSystemSetting.AWS_REGION.environmentVariable()))
- Utilisation de la
EnvironmentVariableCredentialProvider
-
Tout comme le comportement de recherche par défaut pour les informations de région, les SDK informations d'identification sont recherchées à plusieurs endroits. En spécifiant le
EnvironmentVariableCredentialProvider
moment où vous créez un client de service, vous gagnez du temps dans le processus SDK de recherche des informations d'identification. Note
L'utilisation de ce fournisseur d'informations d'identification permet d'utiliser le code dans Lambda les fonctions, mais risque de ne pas fonctionner sur Amazon EC2 d'autres systèmes.
Si vous avez l'intention d'utiliser Lambda SnapStart pour Java à un moment donné, vous devez vous fier à la chaîne de fournisseurs d'informations d'identification par défaut pour rechercher des informations d'identification. Si vous spécifiez le
EnvironmentVariableCredentialsProvider
, la recherche initiale des informations d'identification fonctionne, mais lorsqu'elle SnapStart est activée, le moteur d'exécution Java définit les variables d'environnement des informations d'identification du conteneur. Lors de l'activation, les variables d'environnement utilisées par les variablesEnvironmentVariableCredentialsProvider
d'environnement à clé d'accès ne sont pas disponibles pour Java. SDK
L'extrait de code suivant montre un client de service S3 correctement configuré pour être utilisé dans un environnement Lambda.
S3Client s3Client = S3Client.builder() .region(Region.of(System.getenv(SdkSystemSetting.AWS_REGION.environmentVariable()))) .credentialsProvider(EnvironmentVariableCredentialsProvider.create()) .httpClient(AwsCrtHttpClient.builder().build()) .build();
Initialiser le SDK client en dehors du gestionnaire de fonctions Lambda
Nous recommandons d'initialiser un SDK client en dehors de la méthode du gestionnaire Lambda. Ainsi, si le contexte d'exécution est réutilisé, l'initialisation du client de service peut être ignorée. En réutilisant l'instance cliente et ses connexions, les appels ultérieurs de la méthode du gestionnaire se produisent plus rapidement.
Dans l'exemple suivant, l'S3Client
instance est initialisée dans le constructeur à l'aide d'une méthode d'usine statique. Si le conteneur géré par l'environnement Lambda est réutilisé, l'instance initialisée S3Client
est réutilisée.
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. } }
Minimiser l'injection de dépendance
Les frameworks d'injection de dépendances (DI) peuvent prendre plus de temps pour terminer le processus de configuration. Ils peuvent également nécessiter des dépendances supplémentaires, dont le chargement prend du temps.
Si un framework DI est nécessaire, nous vous recommandons d'utiliser des frameworks DI légers tels que Dagger
Utilisez un archétype de ciblage Maven AWS Lambda
L'SDKéquipe AWS Java a développé un modèle Maven Archetype
Pour en savoir plus sur l'archétype et travailler sur un exemple de déploiement, consultez ce billet de blog
Pensez à Lambda SnapStart pour Java
Si vos exigences d'exécution sont compatibles, AWS Lambda SnapStart pour Java est disponible. Lambda SnapStart est une solution basée sur l'infrastructure qui améliore les performances de démarrage des fonctions Java. Lorsque vous publiez une nouvelle version d'une fonction, Lambda l' SnapStart initialise et prend un instantané chiffré immuable de l'état de la mémoire et du disque. SnapStart met ensuite en cache l'instantané pour le réutiliser.
Modifications de la version 2.x qui affectent le temps de démarrage
Outre les modifications que vous apportez à votre code, la version 2.x de SDK pour Java inclut trois modifications principales qui réduisent le temps de démarrage :
-
Utilisation de jackson-jr
, une bibliothèque de sérialisation qui améliore le temps d'initialisation -
Utilisation des bibliothèques java.time
pour les objets de date et d'heure, qui font partie du JDK -
Utilisation du SLF4j
pour une façade en bois
Ressources supplémentaires
Le Guide du AWS Lambda développeur contient une section sur les meilleures pratiques pour le développement de fonctions Lambda qui n'est pas spécifique à Java.
Pour un exemple de création d'une application native pour le cloud en Java qui utilise AWS Lambda, consultez le contenu de cet atelier
Vous pouvez envisager d'utiliser des images statiques compilées à l'avance afin de réduire le temps de latence au démarrage. Par exemple, vous pouvez utiliser SDK for Java 2.x et Maven pour créer une image native de GraalVM.