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.
Déployer des fonctions Lambda en Java avec des images conteneurs
Il existe trois méthodes pour créer une image de conteneur pour une fonction Lambda Java :
-
Utilisation d’une image de base AWS pour Java
Les images de base AWS sont préchargées avec une exécution du langage, un client d’interface d’exécution pour gérer l’interaction entre Lambda et votre code de fonction, et un émulateur d’interface d’exécution pour les tests locaux.
-
Utilisation d'une image de base AWS uniquement pour le système d'exploitation
Les images de base de système d’exploitation AWS
fournit des images de base contenant une distribution Amazon Linux et l'émulateur d'interface d'exécution . Ces images sont couramment utilisées pour créer des images de conteneur pour les langages compilés, tels que Go et Rust, et pour une langue ou une version linguistique pour laquelle Lambda ne fournit pas d'image de base, comme Node.js 19. Vous pouvez également utiliser des images de base uniquement pour le système d'exploitation pour implémenter un environnement d'exécution personnalisé. Pour rendre l’image compatible avec Lambda, vous devez inclure le client d’interface d’exécution pour Java dans l’image. -
Utilisation d’une image de base non-AWS
Vous pouvez utiliser une autre image de base à partir d’un autre registre de conteneur, comme Alpine Linux ou Debian. Vous pouvez également utiliser une image personnalisée créée par votre organisation. Pour rendre l’image compatible avec Lambda, vous devez inclure le client d’interface d’exécution pour Java dans l’image.
Astuce
Pour réduire le temps nécessaire à l’activation des fonctions du conteneur Lambda, consultez Utiliser des générations en plusieurs étapes
Cette page explique comment créer, tester et déployer des images de conteneur pour Lambda.
Rubriques
Images de base AWS pour Java
AWS fournit les images de base suivantes pour Java :
Balises | Environnement d’exécution | Système d’exploitation | Dockerfile | Obsolescence |
---|---|---|---|---|
21 |
Java 21 | Amazon Linux 2023 | Dockerfile pour Java 21 sur GitHub |
Non planifié |
17 |
Java 17 | Amazon Linux 2 | Dockerfile pour Java 17 sur GitHub |
Non planifié |
11 |
Java 11 | Amazon Linux 2 | Dockerfile pour Java 11 sur GitHub |
Non planifié |
8.al2 |
Java 8 | Amazon Linux 2 | Dockerfile pour Java 8 sur GitHub |
Non planifié |
Référentiel Amazon ECR : gallery.ecr.aws/lambda/java
Les images de base de Java 21 et versions ultérieures sont basées sur l’image de conteneur minimale Amazon Linux 2023. Les images de base antérieures utilisaient Amazon Linux 2. AL2023 offre plusieurs avantages par rapport à Amazon Linux2, notamment un encombrement de déploiement réduit et des versions mises à jour de bibliothèques telles que glibc
.
Les images basées sur AL2023 utilisent microdnf
(lié par un lien symbolique comme dnf
) comme gestionnaire de packages au lieu de yum
, qui est le gestionnaire de packages par défaut dans Amazon Linux 2. microdnf
est une implémentation autonome de dnf
. Pour obtenir la liste des packages inclus dans les images basées sur AL2023, reportez-vous aux colonnes Conteneur minimal de la section Comparaison des packages installés sur les images de conteneurs Amazon Linux 2023. Pour plus d’informations sur les différences entre AL2023 et Amazon Linux 2, consultez Introducing the Amazon Linux 2023 runtime for AWS Lambda
Note
Pour exécuter des images basées sur AL2023 localement, y compris avec AWS Serverless Application Model (AWS SAM), vous devez utiliser Docker version 20.10.10 ou ultérieure.
Utilisation d’une image de base AWS pour Java
Pour exécuter la procédure indiquée dans cette section, vous devez satisfaire aux exigences suivantes :
-
Java (par exemple, Amazon Corretto
) -
Docker
(version minimale 20.10.10 pour les images de base de Java 21 et versions ultérieures)
-
Démarrez votre image Docker à l’aide de la commande docker run. Dans cet exemple,
docker-image
est le nom de l’image ettest
est la balise.docker run --platform linux/amd64 -p 9000:8080
docker-image
:test
Cette commande exécute l'image en tant que conteneur et crée un point de terminaison local à
localhost:9000/2015-03-31/functions/function/invocations
.Note
Si vous avez créé l’image Docker pour l’architecture du jeu d’instructions ARM64, veillez à utiliser l’option
--platform linux/
plutôt quearm64
--platform linux/
.amd64
-
À partir d’une nouvelle fenêtre de terminal, publiez un événement au point de terminaison local.
-
Obtenez l’ID du conteneur.
docker ps
-
Utilisez la commande docker kill
pour arrêter le conteneur. Dans cette commande, remplacez 3766c4ab331c
par l’ID du conteneur de l’étape précédente.docker kill
3766c4ab331c
Pour charger l’image sur Amazon RIE et créer la fonction Lambda
-
Exécutez la commande get-login-password
pour authentifier la CLI Docker auprès de votre registre Amazon ECR. -
Définissez la valeur
--region
sur la Région AWS où vous voulez créer le référentiel Amazon ECR. -
Remplacez
111122223333
par votre ID Compte AWS.
aws ecr get-login-password --region
us-east-1
| docker login --username AWS --password-stdin111122223333
.dkr.ecr.us-east-1
.amazonaws.com -
-
Créez un référentiel dans Amazon ECR à l’aide de la commande create-repository
. aws ecr create-repository --repository-name
hello-world
--regionus-east-1
--image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLENote
Le référentiel Amazon ECR doit être dans la même Région AWS que la fonction Lambda.
En cas de succès, vous obtenez une réponse comme celle-ci :
{ "repository": { "repositoryArn": "arn:aws:ecr:us-east-1:111122223333:repository/hello-world", "registryId": "111122223333", "repositoryName": "hello-world", "repositoryUri": "111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world", "createdAt": "2023-03-09T10:39:01+00:00", "imageTagMutability": "MUTABLE", "imageScanningConfiguration": { "scanOnPush": true }, "encryptionConfiguration": { "encryptionType": "AES256" } } }
-
Copiez le
repositoryUri
à partir de la sortie de l’étape précédente. -
Exécutez la commande docker tag
pour étiqueter votre image locale dans votre référentiel Amazon ECR en tant que dernière version. Dans cette commande : -
docker-image:test
est le nom et la balisede votre image Docker. Il s’agit du nom et de la balise de l’image que vous avez spécifiés dans la commande docker build
. -
Remplacez
<ECRrepositoryUri>
par l’repositoryUri
que vous avez copié. Assurez-vous d’inclure:latest
à la fin de l’URI.
docker tag docker-image:test
<ECRrepositoryUri>
:latestExemple :
docker tag
docker-image
:test
111122223333
.dkr.ecr.us-east-1
.amazonaws.com/hello-world
:latest -
-
Exécutez la commande docker push
pour déployer votre image locale dans le référentiel Amazon ECR. Assurez-vous d’inclure :latest
à la fin de l’URI du référentiel.docker push
111122223333
.dkr.ecr.us-east-1
.amazonaws.com/hello-world
:latest -
Créez un rôle d’exécution pour la fonction, si vous n’en avez pas déjà un. Vous aurez besoin de l’Amazon Resource Name (ARN) du rôle à l’étape suivante.
-
Créez la fonction Lambda. Pour
ImageUri
, indiquez l’URI du référentiel mentionné précédemment. Assurez-vous d’inclure:latest
à la fin de l’URI.aws lambda create-function \ --function-name
hello-world
\ --package-type Image \ --code ImageUri=111122223333
.dkr.ecr.us-east-1
.amazonaws.com/hello-world
:latest \ --rolearn:aws:iam::111122223333:role/lambda-ex
Note
Vous pouvez créer une fonction à l’aide d’une image dans un compte AWS différent, à condition que l’image soit dans la même région que la fonction Lambda. Pour en savoir plus, consultez Autorisations ECR multi-comptes Amazon.
-
Invoquer la fonction.
aws lambda invoke --function-name
hello-world
response.jsonVous devriez obtenir une réponse comme celle-ci :
{ "ExecutedVersion": "$LATEST", "StatusCode": 200 }
-
Pour voir la sortie de la fonction, consultez le fichier
response.json
.
Pour mettre à jour le code de la fonction, vous devez recréer l’image, charger la nouvelle image dans le référentiel Amazon ECR, puis utiliser la commande update-function-code
Lambda résout l’étiquette d’image en hachage d’image spécifique. Cela signifie que si vous pointez la balise d’image qui a été utilisée pour déployer la fonction vers une nouvelle image dans Amazon ECR, Lambda ne met pas automatiquement à jour la fonction pour utiliser la nouvelle image.
Pour déployer la nouvelle image sur la même fonction Lambda, vous devez utiliser la commande update-function-code--publish
crée une version de la fonction à l’aide de l’image du conteneur mise à jour.
aws lambda update-function-code \ --function-name
hello-world
\ --image-uri111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
\ --publish
Utilisation d’une autre image de base avec le client d’interface d’exécution
Si vous utilisez une image de base uniquement pour le système d’exploitation ou une autre image de base, vous devez inclure le client d'interface d'exécution dans votre image. Le client d’interface d’exécution étend leUtilisation de l’API de l’environnement d’exécution Lambda pour des environnements d’exécution personnalisés, qui gère l’interaction entre Lambda et votre code de fonction.
Installez le client d’interface d’exécution pour Java dans votre Dockerfile ou en tant que dépendance dans votre projet. Par exemple, pour installer le client d’interface d’exécution à l’aide du gestionnaire de packages Maven, ajoutez ce qui suit à votre fichier pom.xml
:
<dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-runtime-interface-client</artifactId> <version>2.3.2</version> </dependency>
Pour plus de détails sur le package, consultez Client d’interface d’exécution AWS Lambda
L’exemple suivant montre comment créer une image de conteneur pour Java à l’aide d’une image Amazon Corretto
Pour exécuter la procédure indiquée dans cette section, vous devez satisfaire aux exigences suivantes :
-
Java (par exemple, Amazon Corretto
)
-
Créez un projet Maven. Les paramètres suivants sont obligatoires :
-
groupId : l’espace de noms complet du package de votre application.
-
artifactId : le nom de votre projet. Cette valeur devient le nom du répertoire de votre projet.
-
-
Ouvrez le répertoire du projet.
cd
myapp
-
Ouvrez le fichier
pom.xml
et remplacez le contenu par ce qui suit. Ce fichier inclut aws-lambda-java-runtime-interface-clienten tant que dépendance. Vous pouvez également installer le client de l’interface d’exécution dans le Dockerfile. Toutefois, l’approche la plus simple consiste à inclure la bibliothèque en tant que dépendance. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>example</groupId> <artifactId>hello-lambda</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>hello-lambda</name> <url>http://maven.apache.org</url> <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>com.amazonaws</groupId> <artifactId>
aws-lambda-java-runtime-interface-client
</artifactId> <version>2.3.2
</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>3.1.2</version> <executions> <execution> <id>copy-dependencies</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project> -
Ouvrez le répertoire
et trouvez le fichiermyapp
/src/main/java/com/example/myapp
App.java
. Il s’agit du code de la fonction Lambda. Remplacez le code par ce qui suit.Exemple gestionnaire de fonctions
package example; public class App { public static String sayHello() { return "Hello world!"; } }
-
La commande
mvn -B archetype:generate
de l’étape 1 a également généré un cas de test fictif dans le répertoiresrc/test
. Pour les besoins de ce tutoriel, passez outre l’exécution des tests en supprimant l’intégralité de ce répertoire/test
généré. -
Retournez au répertoire racine du projet, puis créez un nouveau Dockerfile. L’exemple de Dockerfile suivant utilise une image Amazon Corretto
. Amazon Corretto est une distribution sans coût, multiplateforme et prête à la production d’OpenJDK. -
Définissez la propriété
FROM
sur l’URI de l’image de base. -
Définissez le
ENTRYPOINT
sur le module que vous souhaitez que le conteneur Docker exécute lorsqu’il démarre. Dans ce cas, le module est le client d’interface d’exécution. -
Définir l’argument
CMD
pour le gestionnaire de la fonction Lambda.
Notez que l’exemple de Dockerfile n’inclut pas d’instruction USER
. Lorsque vous déployez une image de conteneur sur Lambda, Lambda définit automatiquement un utilisateur Linux par défaut disposant d’autorisations de moindre privilège. Ceci est différent du comportement standard de Docker qui est défini par défaut par l’utilisateur root
lorsqu’aucune instructionUSER
n’est fournie.Exemple Dockerfile
FROM
public.ecr.aws/amazoncorretto/amazoncorretto:21
as base # Configure the build environment FROM base as build RUN yum install -y maven WORKDIR /src # Cache and copy dependencies ADD pom.xml . RUN mvn dependency:go-offline dependency:copy-dependencies # Compile the function ADD . . RUN mvn package # Copy the function artifact and dependencies onto a clean base FROM base WORKDIR /function COPY --from=build /src/target/dependency/*.jar ./ COPY --from=build /src/target/*.jar ./ # Set runtime interface client as default command for the container runtime ENTRYPOINT [ "/usr/bin/java", "-cp", "./*", "com.amazonaws.services.lambda.runtime.api.client.AWSLambda
" ] # Pass the name of the function handler as an argument to the runtime CMD [ "example.App::sayHello
" ] -
-
Générez l’image Docker à l’aide de la commande docker build
. L’exemple suivant nomme l’image docker-image
et lui donne la balisetest
.docker build --platform linux/amd64 -t
docker-image
:test
.Note
La commande spécifie l’option
--platform linux/amd64
pour garantir la compatibilité de votre conteneur avec l’environnement d’exécution Lambda, quelle que soit l’architecture de votre machine de génération. Si vous avez l’intention de créer une fonction Lambda à l’aide de l’architecture du jeu d’instructions ARM64, veillez à modifier la commande pour utiliser plutôt l’option--platform linux/arm64
.
Utilisez l’émulateur d’interface d’exécution
Pour installer et exécuter l’émulateur d’interface d’exécution sur votre ordinateur local
-
À partir du répertoire de projets, exécutez la commande suivante pour télécharger l’émulateur d’interface d’exécution (architecture x86-64) à partir de GitHub et l’installer sur votre ordinateur local.
-
Démarrez votre image Docker à l’aide de la commande docker run. Notez ce qui suit :
-
docker-image
est le nom de l’image ettest
est la balise. -
/usr/bin/java -cp './*' com.amazonaws.services.lambda.runtime.api.client.AWSLambda example.App::sayHello
est leENTRYPOINT
suivi duCMD
depuis votre Dockerfile.
Cette commande exécute l’image en tant que conteneur et crée un point de terminaison local à
localhost:9000/2015-03-31/functions/function/invocations
.Note
Si vous avez créé l’image Docker pour l’architecture du jeu d’instructions ARM64, veillez à utiliser l’option
--platform linux/
plutôt quearm64
--platform linux/
.amd64
-
-
Publiez un événement au point de terminaison local.
-
Obtenez l’ID du conteneur.
docker ps
-
Utilisez la commande docker kill
pour arrêter le conteneur. Dans cette commande, remplacez 3766c4ab331c
par l’ID du conteneur de l’étape précédente.docker kill
3766c4ab331c
Pour charger l’image sur Amazon RIE et créer la fonction Lambda
-
Exécutez la commande get-login-password
pour authentifier la CLI Docker auprès de votre registre Amazon ECR. -
Définissez la valeur
--region
sur la Région AWS où vous voulez créer le référentiel Amazon ECR. -
Remplacez
111122223333
par votre ID Compte AWS.
aws ecr get-login-password --region
us-east-1
| docker login --username AWS --password-stdin111122223333
.dkr.ecr.us-east-1
.amazonaws.com -
-
Créez un référentiel dans Amazon ECR à l’aide de la commande create-repository
. aws ecr create-repository --repository-name
hello-world
--regionus-east-1
--image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLENote
Le référentiel Amazon ECR doit être dans la même Région AWS que la fonction Lambda.
En cas de succès, vous obtenez une réponse comme celle-ci :
{ "repository": { "repositoryArn": "arn:aws:ecr:us-east-1:111122223333:repository/hello-world", "registryId": "111122223333", "repositoryName": "hello-world", "repositoryUri": "111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world", "createdAt": "2023-03-09T10:39:01+00:00", "imageTagMutability": "MUTABLE", "imageScanningConfiguration": { "scanOnPush": true }, "encryptionConfiguration": { "encryptionType": "AES256" } } }
-
Copiez le
repositoryUri
à partir de la sortie de l’étape précédente. -
Exécutez la commande docker tag
pour étiqueter votre image locale dans votre référentiel Amazon ECR en tant que dernière version. Dans cette commande : -
docker-image:test
est le nom et la balisede votre image Docker. Il s’agit du nom et de la balise de l’image que vous avez spécifiés dans la commande docker build
. -
Remplacez
<ECRrepositoryUri>
par l’repositoryUri
que vous avez copié. Assurez-vous d’inclure:latest
à la fin de l’URI.
docker tag docker-image:test
<ECRrepositoryUri>
:latestExemple :
docker tag
docker-image
:test
111122223333
.dkr.ecr.us-east-1
.amazonaws.com/hello-world
:latest -
-
Exécutez la commande docker push
pour déployer votre image locale dans le référentiel Amazon ECR. Assurez-vous d’inclure :latest
à la fin de l’URI du référentiel.docker push
111122223333
.dkr.ecr.us-east-1
.amazonaws.com/hello-world
:latest -
Créez un rôle d’exécution pour la fonction, si vous n’en avez pas déjà un. Vous aurez besoin de l’Amazon Resource Name (ARN) du rôle à l’étape suivante.
-
Créez la fonction Lambda. Pour
ImageUri
, indiquez l’URI du référentiel mentionné précédemment. Assurez-vous d’inclure:latest
à la fin de l’URI.aws lambda create-function \ --function-name
hello-world
\ --package-type Image \ --code ImageUri=111122223333
.dkr.ecr.us-east-1
.amazonaws.com/hello-world
:latest \ --rolearn:aws:iam::111122223333:role/lambda-ex
Note
Vous pouvez créer une fonction à l’aide d’une image dans un compte AWS différent, à condition que l’image soit dans la même région que la fonction Lambda. Pour en savoir plus, consultez Autorisations ECR multi-comptes Amazon.
-
Invoquer la fonction.
aws lambda invoke --function-name
hello-world
response.jsonVous devriez obtenir une réponse comme celle-ci :
{ "ExecutedVersion": "$LATEST", "StatusCode": 200 }
-
Pour voir la sortie de la fonction, consultez le fichier
response.json
.
Pour mettre à jour le code de la fonction, vous devez recréer l’image, charger la nouvelle image dans le référentiel Amazon ECR, puis utiliser la commande update-function-code
Lambda résout l’étiquette d’image en hachage d’image spécifique. Cela signifie que si vous pointez la balise d’image qui a été utilisée pour déployer la fonction vers une nouvelle image dans Amazon ECR, Lambda ne met pas automatiquement à jour la fonction pour utiliser la nouvelle image.
Pour déployer la nouvelle image sur la même fonction Lambda, vous devez utiliser la commande update-function-code--publish
crée une version de la fonction à l’aide de l’image du conteneur mise à jour.
aws lambda update-function-code \ --function-name
hello-world
\ --image-uri111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
\ --publish