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 Node.js avec des images conteneurs
Il existe trois méthodes pour créer une image de conteneur pour une fonction Lambda Node.js :
-
Utilisation d'une image AWS de base pour Node.js
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
AWS Les images de base réservées
au système d'exploitation contiennent 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 Node.js dans l’image. -
Utilisation d'une image non AWS basique
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 Node.js 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
AWS images de base pour Node.js
AWS fournit les images de base suivantes pour Node.js :
| Balises | Environnement d’exécution | Système d’exploitation | Dockerfile | Obsolescence |
|---|---|---|---|---|
22 |
Node.js 22 | Amazon Linux 2023 | Dockerfile pour Node.js 22 sur GitHub |
30 avril 2027 |
20 |
Node.js 20 | Amazon Linux 2023 | Dockerfile pour Node.js 2.0 sur GitHub |
30 avril 2026 |
Référentiel Amazon ECR : gallery.ecr. aws/lambda/nodejs
Les images de base de Node.js 20 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. AL2Le 023 offre plusieurs avantages par rapport à Amazon Linux 2, notamment un encombrement de déploiement réduit et des versions mises à jour de bibliothèques telles queglibc.
AL2Les images basées sur le format 023 utilisent microdnf (lien symbolique sous formednf) comme gestionnaire de packages au lieu deyum, qui est le gestionnaire de packages par défaut dans Amazon Linux 2. microdnfest une implémentation autonome de. dnf Pour obtenir la liste des packages inclus dans les images AL2 basées sur la version 023, 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 AL2 023 et Amazon Linux 2, consultez Présentation du runtime Amazon Linux 2023 AWS Lambda
Note
Pour exécuter des images AL2 basées sur 023 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 AWS de base pour Node.js
Pour exécuter la procédure indiquée dans cette section, vous devez satisfaire aux exigences suivantes :
Pour créer une image de conteneur à partir d'une image AWS de base pour Node.js
-
Créez un répertoire pour le projet, puis passez à ce répertoire.
mkdir example cd example -
Créez un nouveau projet Node.js avec
npm. Appuyez surEnterpour accepter les options par défaut fournies dans l’expérience interactive.npm init -
Créez un nouveau fichier appelé
index.js. Vous pouvez ajouter l’exemple de code de fonction suivant au fichier pour le tester, ou utiliser le vôtre.Exemple Gestionnaire CommonJS
exports.handler = async (event) => { const response = { statusCode: 200, body: JSON.stringify('Hello from Lambda!'), }; return response; }; -
Si votre fonction dépend de bibliothèques autres que celles-ci AWS SDK pour JavaScript, utilisez npm
pour les ajouter à votre package. -
Créez un nouveau Dockerfile avec la configuration suivante :
-
Définir la propriété
FROMsur l’URI de l’image de base. -
Utilisez la commande COPY pour copier le code de la fonction et les dépendances de l’environnement d’exécution dans
{LAMBDA_TASK_ROOT}, une variable d’environnement définie par Lambda. -
Définir l’argument
CMDpour 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 rootlorsqu’aucune instructionUSERn’est fournie.Exemple Dockerfile
FROMpublic.ecr.aws/lambda/nodejs:22# Copy function code COPYindex.js${LAMBDA_TASK_ROOT} # Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile) CMD [ "index.handler" ] -
-
Générez l’image Docker à l’aide de la commande docker build
. L’exemple suivant nomme l’image docker-imageet lui donne la balisetest. Pour rendre votre image compatible avec Lambda, vous devez utiliser l'--provenance=falseoption.docker buildx build --platform linux/amd64 --provenance=false -tdocker-image:test.Note
La commande spécifie l’option
--platform linux/amd64pour 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 ARM64 d'instructions, veillez à modifier la commande pour utiliser l'--platform linux/arm64option à la place.
-
Démarrez votre image Docker à l’aide de la commande docker run. Dans cet exemple,
docker-imageest le nom de l’image ettestest la balise.docker run --platform linux/amd64 -p 9000:8080docker-image:testCette 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 ARM64 d'instructions, veillez à utiliser l'
--platform linux/option au lieu dearm64--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 3766c4ab331cpar l’ID du conteneur de l’étape précédente.docker kill3766c4ab331c
Pour charger l’image sur Amazon RIE et créer la fonction Lambda
-
Exécutez la get-login-password
commande pour authentifier la CLI Docker auprès de votre registre Amazon ECR. -
Définissez la
--regionvaleur à l' Région AWS endroit où vous souhaitez créer le référentiel Amazon ECR. -
111122223333Remplacez-le par votre Compte AWS identifiant.
aws ecr get-login-password --regionus-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-namehello-world--regionus-east-1--image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLENote
Le référentiel Amazon ECR doit être Région AWS identique à 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:testest 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’repositoryUrique vous avez copié. Assurez-vous d’inclure:latestà la fin de l’URI.
docker tag docker-image:test<ECRrepositoryUri>:latestExemple :
docker tagdocker-image:test111122223333.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 push111122223333.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-namehello-world\ --package-type Image \ --code ImageUri=111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \ --rolearn:aws:iam::111122223333:role/lambda-exNote
Vous pouvez créer une fonction en utilisant une image d'un autre AWS compte, à condition que l'image se trouve dans la même région que la fonction Lambda. Pour de plus amples informations, veuillez consulter Autorisations entre comptes Amazon ECR.
-
Invoquer la fonction.
aws lambda invoke --function-namehello-worldresponse.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 fonction, vous devez créer à nouveau l'image, télécharger la nouvelle image dans le référentiel Amazon ECR, puis utiliser la 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 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-namehello-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 leAPI de runtime, qui gère l’interaction entre Lambda et votre code de fonction.
Installez le client d’interface d’exécution Node.js
npm install aws-lambda-ric
Vous pouvez également télécharger le client d'interface d'exécution Node.js
L'exemple suivant montre comment créer une image de conteneur pour Node.js à l'aide d'une image non AWS basique. L’exemple Dockerfile utilise une image de base bookworm. Le Dockerfile inclut le client d’interface d’exécution.
Pour exécuter la procédure indiquée dans cette section, vous devez satisfaire aux exigences suivantes :
Pour créer une image de conteneur à partir d'une image non AWS basique
-
Créez un répertoire pour le projet, puis passez à ce répertoire.
mkdir example cd example -
Créez un nouveau projet Node.js avec
npm. Appuyez surEnterpour accepter les options par défaut fournies dans l’expérience interactive.npm init -
Créez un nouveau fichier appelé
index.js. Vous pouvez ajouter l’exemple de code de fonction suivant au fichier pour le tester, ou utiliser le vôtre.Exemple Gestionnaire CommonJS
exports.handler = async (event) => { const response = { statusCode: 200, body: JSON.stringify('Hello from Lambda!'), }; return response; }; -
Créez un nouveau fichier Docker. Le Dockerfile suivant utilise une image de base
bookwormau lieu d’une image de base AWS. Le Dockerfile inclut le client d’interface d’exécution, ce qui rend l’image compatible avec Lambda. Le Dockerfile utilise une création à plusieurs étapes . La première étape crée une image de génération, qui est un environnement Node.js standard dans lequel les dépendances de la fonction sont installées. La deuxième étape crée une image plus fine qui inclut le code de la fonction et ses dépendances. Cela permet de réduire la taille de l’image finale. -
Définissez la propriété
FROMpour l’identifiant de l’image de base. -
Utilisez la commande
COPYpour copier le code de la fonction et les dépendances de l’exécution. -
Définissez le
ENTRYPOINTsur 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
CMDpour 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 rootlorsqu’aucune instructionUSERn’est fournie.Exemple Dockerfile
# Define custom function directory ARG FUNCTION_DIR="/function" FROMnode:20-bookwormas build-image # Include global arg in this stage of the build ARG FUNCTION_DIR # Install build dependencies RUN apt-get update && \ apt-get install -y \ g++ \ make \ cmake \ unzip \ libcurl4-openssl-dev # Copy function code RUN mkdir -p ${FUNCTION_DIR} COPY . ${FUNCTION_DIR} WORKDIR ${FUNCTION_DIR} # Install Node.js dependencies RUN npm install # Install the runtime interface client RUN npm install aws-lambda-ric # Grab a fresh slim copy of the image to reduce the final size FROMnode:20-bookworm-slim# Required for Node runtimes which use npm@8.6.0+ because # by default npm writes logs under /home/.npm and Lambda fs is read-only ENV NPM_CONFIG_CACHE=/tmp/.npm # Include global arg in this stage of the build ARG FUNCTION_DIR # Set working directory to function root directory WORKDIR ${FUNCTION_DIR} # Copy in the built dependencies COPY --from=build-image ${FUNCTION_DIR} ${FUNCTION_DIR} # Set runtime interface client as default command for the container runtime ENTRYPOINT ["/usr/local/bin/npx", "aws-lambda-ric"] # Pass the name of the function handler as an argument to the runtime CMD ["index.handler"] -
-
Générez l’image Docker à l’aide de la commande docker build
. L’exemple suivant nomme l’image docker-imageet lui donne la balisetest. Pour rendre votre image compatible avec Lambda, vous devez utiliser l'--provenance=falseoption.docker buildx build --platform linux/amd64 --provenance=false -tdocker-image:test.Note
La commande spécifie l’option
--platform linux/amd64pour 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 ARM64 d'instructions, veillez à modifier la commande pour utiliser l'--platform linux/arm64option à la place.
Utilisez l’émulateur d’interface d’exécution
Pour installer et exécuter l’émulateur d’interface d’exécution sur votre ordinateur local
-
Depuis le répertoire de votre projet, exécutez la commande suivante pour télécharger l'émulateur d'interface d'exécution (architecture x86-64) GitHub et l'installer sur votre machine locale.
-
Démarrez votre image Docker à l’aide de la commande docker run. Remarques :
-
docker-imageest le nom de l’image ettestest la balise. -
/usr/local/bin/npx aws-lambda-ric index.handlerest leENTRYPOINTsuivi duCMDdepuis 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 ARM64 d'instructions, veillez à utiliser l'
--platform linux/option au lieu dearm64--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 3766c4ab331cpar l’ID du conteneur de l’étape précédente.docker kill3766c4ab331c
Pour charger l’image sur Amazon RIE et créer la fonction Lambda
-
Exécutez la get-login-password
commande pour authentifier la CLI Docker auprès de votre registre Amazon ECR. -
Définissez la
--regionvaleur à l' Région AWS endroit où vous souhaitez créer le référentiel Amazon ECR. -
111122223333Remplacez-le par votre Compte AWS identifiant.
aws ecr get-login-password --regionus-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-namehello-world--regionus-east-1--image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLENote
Le référentiel Amazon ECR doit être Région AWS identique à 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:testest 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’repositoryUrique vous avez copié. Assurez-vous d’inclure:latestà la fin de l’URI.
docker tag docker-image:test<ECRrepositoryUri>:latestExemple :
docker tagdocker-image:test111122223333.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 push111122223333.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-namehello-world\ --package-type Image \ --code ImageUri=111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \ --rolearn:aws:iam::111122223333:role/lambda-exNote
Vous pouvez créer une fonction en utilisant une image d'un autre AWS compte, à condition que l'image se trouve dans la même région que la fonction Lambda. Pour de plus amples informations, veuillez consulter Autorisations entre comptes Amazon ECR.
-
Invoquer la fonction.
aws lambda invoke --function-namehello-worldresponse.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 fonction, vous devez créer à nouveau l'image, télécharger la nouvelle image dans le référentiel Amazon ECR, puis utiliser la 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 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-namehello-world\ --image-uri111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest\ --publish