Test local des images de conteneur Lambda - AWS Lambda

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.

Test local des images de conteneur Lambda

Vous pouvez utiliser l’émulateur d’interface d’exécution Lambda pour tester localement une fonction d’image de conteneur avant de la charger sur Amazon Elastic Container Registry (Amazon ECR) et de la déployer sur Lambda. L’émulateur est un proxy pour l’API de l'environnement d'exécution Lambda. Il s’agit d’un serveur Web léger qui convertit les requêtes HTTP en événements JSON à transmettre à la fonction Lambda dans l’image de conteneur.

Les images de base et les images de base uniquement pour le système d’exploitation AWS incluent l'émulateur d'interface d'environnement d'exécution. Si vous utilisez une autre image de base, telle qu’une image Alpine Linux ou Debian, vous pouvez intégrer l’émulateur dans votre image ou l’installer sur votre ordinateur local.

L'émulateur d'interface d'exécution est disponible dans le AWS GitHub référentiel. Il existe des packages distincts pour les architectures x86-64 et arm64.

Lignes directrices pour l’utilisation de l’émulateur d’interface d’exécution

Prenez note des instructions suivantes lors de l’utilisation de l’émulateur d’interface d’environnement d’exécution :

  • Le RIE n’émule pas les configurations de sécurité et d’authentification Lambda, ni l’orchestration Lambda.

  • Lambda fournit un émulateur pour chacune des architectures de l’ensemble des instructions.

  • L’émulateur ne prend pas en charge le suivi AWS X-Ray ou d’autres intégrations Lambda.

Variables d’environnement

L’émulateur d’interface d’environnement d’exécution prend en charge un sous-ensemble de variables d’environnement pour la fonction Lambda dans l’image locale en cours d’exécution.

Si votre fonction utilise des informations d’identification de sécurité, vous pouvez les configurer en définissant les variables d’environnement suivantes :

  • AWS_ACCESS_KEY_ID

  • AWS_SECRET_ACCESS_KEY

  • AWS_SESSION_TOKEN

  • AWS_DEFAULT_REGION

Pour définir le délai d’expiration des fonctions, configurez AWS_LAMBDA_FUNCTION_TIMEOUT. Saisissez le nombre maximal de secondes que vous souhaitez autoriser à la fonction pour son exécution.

L’émulateur ne renseigne pas les variables d’environnement Lambda suivantes. Cependant, vous pouvez les définir pour qu’elles correspondent aux valeurs que vous attendez lorsque la fonction s’exécute dans le service Lambda :

  • AWS_LAMBDA_FUNCTION_VERSION

  • AWS_LAMBDA_FUNCTION_NAME

  • AWS_LAMBDA_FUNCTION_MEMORY_SIZE

Tester des images créées à partir d’images de base AWS

L’image de base AWS pour Lambda inclut l’émulateur d’interface d’environnement d’exécution. Après avoir créé votre image Docker, procédez comme suit pour la tester localement.

  1. Démarrez votre image Docker à l’aide de la commande docker run. Dans cet exemple, docker-image est le nom de l’image et test 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/arm64 plutôt que --platform linux/amd64.

  2. À partir d’une nouvelle fenêtre de terminal, publiez un événement au point de terminaison local.

    Linux/macOS

    Sous Linux et macOS, exécutez la commande curl suivante :

    curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'

    Cette commande invoque la fonction avec un événement vide et renvoie une réponse. Si vous utilisez votre propre code de fonction plutôt que l’exemple de code de fonction, vous pouvez invoquer la fonction avec une charge utile JSON. Exemple :

    curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"payload":"hello world!"}'
    PowerShell

    Dans PowerShell, exécutez la Invoke-WebRequest commande suivante :

    Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{}' -ContentType "application/json"

    Cette commande invoque la fonction avec un événement vide et renvoie une réponse. Si vous utilisez votre propre code de fonction plutôt que l’exemple de code de fonction, vous pouvez invoquer la fonction avec une charge utile JSON. Exemple :

    Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{"payload":"hello world!"}' -ContentType "application/json"
  3. Obtenez l’ID du conteneur.

    docker ps
  4. 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

Test des images créées à partir d’images de base alternatives

Si vous utilisez une autre image de base, telle qu’une image Alpine Linux ou Debian, vous pouvez intégrer l’émulateur dans votre image ou l’installer sur votre ordinateur local.

Création de l’émulateur d’interface d’exécution dans une image

Pour intégrer l’émulateur à votre image
  1. Créez un script et enregistrez-le dans votre répertoire de projets. Définissez les autorisations d’exécution pour le fichier de script.

    Le script vérifie la présence de la variable d’environnement AWS_LAMBDA_RUNTIME_API, qui indique la présence de l’API d’exécution. Si l’API d’environnement d’exécution est présente, le script exécute le client d’interface d’environnement d’exécution. Sinon, le script exécute l’émulateur d’interface d’environnement d’exécution.

    Choisissez votre langage pour voir un exemple de script :

    Node.js

    Dans l’exemple suivant, /usr/local/bin/npx aws-lambda-ric est la commande npx permettant de démarrer le client d’interface d’exécution Node.js.

    Exemple entry_script.sh
    #!/bin/sh if [ -z "${AWS_LAMBDA_RUNTIME_API}" ]; then exec /usr/local/bin/aws-lambda-rie /usr/local/bin/npx aws-lambda-ric $@ else exec /usr/local/bin/npx aws-lambda-ric $@ fi
    Note

    Si vous utilisez Windows, veillez à enregistrer le script avec des fins de ligne LF. Si le script utilise CRLF, vous obtiendrez une erreur de ce type lorsque vous tenterez d’exécuter l’image Docker :

    exec /entry_script.sh: no such file or directory
    Python

    Dans l’exemple suivant, /usr/local/bin/python -m awslambdaric est la commande de l’interpréteur Python pour exécuter le client d’interface d’exécution Python en tant que script.

    Exemple entry_script.sh
    #!/bin/sh if [ -z "${AWS_LAMBDA_RUNTIME_API}" ]; then exec /usr/local/bin/aws-lambda-rie /usr/local/bin/python -m awslambdaric $@ else exec /usr/local/bin/python -m awslambdaric $@ fi
    Note

    Si vous utilisez Windows, veillez à enregistrer le script avec des fins de ligne LF. Si le script utilise CRLF, vous obtiendrez une erreur de ce type lorsque vous tenterez d’exécuter l’image Docker :

    exec /entry_script.sh: no such file or directory
    Java

    Dans l’exemple suivant, /usr/bin/java -cp './*' com.amazonaws.services.lambda.runtime.api.client.AWSLambda définit le chemin de classe vers le client d’interface d’exécution Java.

    Exemple entry_script.sh
    #!/bin/sh if [ -z "${AWS_LAMBDA_RUNTIME_API}" ]; then exec /usr/local/bin/aws-lambda-rie /usr/bin/java -cp './*' com.amazonaws.services.lambda.runtime.api.client.AWSLambda $@ else exec /usr/bin/java -cp './*' com.amazonaws.services.lambda.runtime.api.client.AWSLambda $@ fi
    Note

    Si vous utilisez Windows, veillez à enregistrer le script avec des fins de ligne LF. Si le script utilise CRLF, vous obtiendrez une erreur de ce type lorsque vous tenterez d’exécuter l’image Docker :

    exec /entry_script.sh: no such file or directory
    Go

    Dans l’exemple suivant, /main est le fichier binaire compilé lors de la création de Docker.

    Exemple entry_script.sh
    #!/bin/sh if [ -z "${AWS_LAMBDA_RUNTIME_API}" ]; then exec /usr/local/bin/aws-lambda-rie /main $@ else exec /main $@ fi
    Note

    Si vous utilisez Windows, veillez à enregistrer le script avec des fins de ligne LF. Si le script utilise CRLF, vous obtiendrez une erreur de ce type lorsque vous tenterez d’exécuter l’image Docker :

    exec /entry_script.sh: no such file or directory
    Ruby

    Dans l’exemple suivant, aws_lambda_ric est le client d’interface d’exécution Ruby.

    Exemple entry_script.sh
    #!/bin/sh if [ -z "${AWS_LAMBDA_RUNTIME_API}" ]; then exec /usr/local/bin/aws-lambda-rie aws_lambda_ric $@ else exec aws_lambda_ric $@ fi
    Note

    Si vous utilisez Windows, veillez à enregistrer le script avec des fins de ligne LF. Si le script utilise CRLF, vous obtiendrez une erreur de ce type lorsque vous tenterez d’exécuter l’image Docker :

    exec /entry_script.sh: no such file or directory
  2. Téléchargez l'émulateur d'interface d'exécution pour votre architecture cible depuis GitHub le répertoire de votre projet. Lambda fournit un émulateur pour chacune des architectures de l’ensemble des instructions.

    Linux/macOS
    curl -Lo aws-lambda-rie https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie \ && chmod +x aws-lambda-rie

    Pour installer l'émulateur arm64, remplacez l'URL du GitHub référentiel dans la commande précédente par la suivante :

    https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie-arm64
    PowerShell
    Invoke-WebRequest -Uri https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie -OutFile aws-lambda-rie

    Pour installer l’émulateur arm64, remplacez Uri par ce qui suit :

    https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie-arm64
  3. Ajoutez les lignes suivantes à votre fichier Docker. Le ENTRYPOINT comprend le script que vous avez créé à l’étape 1 et votre gestionnaire de fonction.

    Exemple lignes à ajouter au fichier Docker

    Dans l’exemple suivant, remplacez lambda_function.handler par votre gestionnaire de fonction.

    COPY ./entry_script.sh /entry_script.sh RUN chmod +x /entry_script.sh ADD aws-lambda-rie /usr/local/bin/aws-lambda-rie ENTRYPOINT [ "/entry_script.sh","lambda_function.handler" ]
  4. 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 balise test.

    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.

  5. Démarrez votre image Docker à l’aide de la commande docker run. Dans cet exemple, docker-image est le nom de l’image et test 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/arm64 plutôt que --platform linux/amd64.

  6. À partir d’une nouvelle fenêtre de terminal, publiez un événement au point de terminaison local.

    Linux/macOS

    Sous Linux et macOS, exécutez la commande curl suivante :

    curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'

    Cette commande invoque la fonction avec un événement vide et renvoie une réponse. Si vous utilisez votre propre code de fonction plutôt que l’exemple de code de fonction, vous pouvez invoquer la fonction avec une charge utile JSON. Exemple :

    curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"payload":"hello world!"}'
    PowerShell

    Dans PowerShell, exécutez la Invoke-WebRequest commande suivante :

    Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{}' -ContentType "application/json"

    Cette commande invoque la fonction avec un événement vide et renvoie une réponse. Si vous utilisez votre propre code de fonction plutôt que l’exemple de code de fonction, vous pouvez invoquer la fonction avec une charge utile JSON. Exemple :

    Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{"payload":"hello world!"}' -ContentType "application/json"
  7. Obtenez l’ID du conteneur.

    docker ps
  8. 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

Installer localement l’émulateur d’interface d’exécution

Pour installer l'émulateur d'interface d'exécution sur votre machine locale, téléchargez le package correspondant à votre architecture préférée depuis GitHub. Ensuite, utilisez la commande docker run pour démarrer l’image du conteneur et configurez le --entrypoint sur l’émulateur. Pour de plus amples informations, choisissez les conseils d’utilisation pour votre langage préféré :