Didacticiel – Publication d'un runtime personnalisé - AWS Lambda

Didacticiel – Publication d'un runtime personnalisé

Dans ce didacticiel, vous allez créer une fonction Lambda avec un runtime personnalisé. Vous commencez par inclure le runtime dans le package de déploiement de la fonction. Ensuite, vous le migrez vers une couche que vous gérez indépendamment de la fonction. Enfin, vous partagez la couche du runtime en mettant à jour sa stratégie d'autorisations basée sur les ressources.

Prérequis

Ce didacticiel suppose que vous avez quelques connaissances de la console Lambda et des opérations Lambda de base. Si ça n'est pas déjà fait, suivez les instructions de Mise en route avec AWS Lambda pour créer votre première fonction Lambda.

Pour suivre les procédures décrites dans ce manuel, vous aurez besoin d'un shell ou d'un terminal de ligne de commande pour exécuter des commandes. Les commandes sont affichées dans les listes précédées d'un symbole d'invite ($) et du nom du répertoire actuel, le cas échéant :

~/lambda-project$ this is a command this is output

Pour les commandes longues, un caractère d'échappement (\) est utilisé afin de fractionner la commande sur plusieurs lignes.

Sur Linux et macOS, utilisez votre gestionnaire de shell et de package préféré. Sur Windows 10, vous pouvez installer le sous-système Windows pour Linux afin d'obtenir une version intégrée à Windows d'Ubuntu et Bash.

Vous avez besoin d'un rôle IAM pour créer une fonction Lambda. Ce rôle doit avoir l'autorisation d'envoyer des journaux à CloudWatch Logs et d'accéder aux services AWS utilisés par votre fonction. Si vous n'avez pas de rôle pour le développement de fonctions, créez-en un.

Pour créer un rôle d'exécution

  1. Ouvrez la page Rôles dans la console IAM.

  2. Choisissez Créer un rôle.

  3. Créez un rôle avec les propriétés suivantes :

    • Entité de confianceLambda.

    • AutorisationsAWSLambdaBasicExecutionRole.

    • Nom de rôlelambda-role.

    La stratégie AWSLambdaBasicExecutionRole possède les autorisations dont la fonction a besoin pour écrire des journaux dans CloudWatch Logs.

Création d'une fonction

Créez une fonction Lambda avec un runtime personnalisé. Cet exemple comprend deux fichiers, un fichier bootstrap de runtime et un gestionnaire de fonctions. Tous deux sont mis en œuvre en Bash.

Le runtime charge un script de fonction à partir du package de déploiement. Il utilise deux variables pour localiser le script. LAMBDA_TASK_ROOT lui indique où le package a été extrait et _HANDLER inclut le nom du script.

Exemple amorçage

#!/bin/sh set -euo pipefail # Initialization - load function handler source $LAMBDA_TASK_ROOT/"$(echo $_HANDLER | cut -d. -f1).sh" # Processing while true do HEADERS="$(mktemp)" # Get an event. The HTTP request will block until one is received EVENT_DATA=$(curl -sS -LD "$HEADERS" -X GET "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/next") # Extract request ID by scraping response headers received above REQUEST_ID=$(grep -Fi Lambda-Runtime-Aws-Request-Id "$HEADERS" | tr -d '[:space:]' | cut -d: -f2) # Execute the handler function from the script RESPONSE=$($(echo "$_HANDLER" | cut -d. -f2) "$EVENT_DATA") # Send the response curl -X POST "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/$REQUEST_ID/response" -d "$RESPONSE" done

Après avoir chargé le script, le runtime traite les événements dans une boucle. Il utilise l'API du runtime pour récupérer un événement d'appel dans Lambda, transmet l'événement au gestionnaire, puis renvoie la réponse à Lambda. Pour obtenir l'ID de la demande, le runtime enregistre les en-têtes à partir de la réponse de l'API dans un fichier temporaire et lit l'en-tête Lambda-Runtime-Aws-Request-Id à partir du fichier.

Note

Les runtimes ont d'autres responsabilités, notamment la gestion des erreurs et la fourniture d'informations de contexte au gestionnaire. Pour plus d'informations, consultez Création d'un runtime personnalisé.

Le script définit une fonction de gestionnaire qui accepte les données des événements, la consigne dans stderr, puis la renvoie.

Exemple function.sh

function handler () { EVENT_DATA=$1 echo "$EVENT_DATA" 1>&2; RESPONSE="Echoing request: '$EVENT_DATA'" echo $RESPONSE }

Enregistrez les deux fichiers dans un répertoire de projet nommé runtime-tutorial.

runtime-tutorial ├ bootstrap └ function.sh

Rendez les fichiers exécutables et ajoutez-les dans une archive ZIP.

runtime-tutorial$ chmod 755 function.sh bootstrap runtime-tutorial$ zip function.zip function.sh bootstrap adding: function.sh (deflated 24%) adding: bootstrap (deflated 39%)

Créez une fonction nommée bash-runtime.

runtime-tutorial$ aws lambda create-function --function-name bash-runtime \ --zip-file fileb://function.zip --handler function.handler --runtime provided \ --role arn:aws:iam::123456789012:role/lambda-role { "FunctionName": "bash-runtime", "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:bash-runtime", "Runtime": "provided", "Role": "arn:aws:iam::123456789012:role/lambda-role", "Handler": "function.handler", "CodeSha256": "mv/xRv84LPCxdpcbKvmwuuFzwo7sLwUO1VxcUv3wKlM=", "Version": "$LATEST", "TracingConfig": { "Mode": "PassThrough" }, "RevisionId": "2e1d51b0-6144-4763-8e5c-7d5672a01713", ... }

Appelez la fonction et vérifiez la réponse.

runtime-tutorial$ aws lambda invoke --function-name bash-runtime --payload '{"text":"Hello"}' response.txt { "StatusCode": 200, "ExecutedVersion": "$LATEST" } runtime-tutorial$ cat response.txt Echoing request: '{"text":"Hello"}'

Créer une couche

Pour séparer le code du runtime du code de la fonction, créez une couche qui contient uniquement le runtime. Les couches vous permettent de développer les dépendances de votre fonction de manière indépendante et peuvent réduire l'utilisation du stockage lorsque vous utilisez la même couche avec plusieurs fonctions.

Créez une archive de couche qui contient le fichier bootstrap.

runtime-tutorial$ zip runtime.zip bootstrap adding: bootstrap (deflated 39%)

Créez une couche à l'aide de la commande publish-layer-version.

runtime-tutorial$ aws lambda publish-layer-version --layer-name bash-runtime --zip-file fileb://runtime.zip { "Content": { "Location": "https://awslambda-us-west-2-layers.s3.us-west-2.amazonaws.com/snapshots/123456789012/bash-runtime-018c209b...", "CodeSha256": "bXVLhHi+D3H1QbDARUVPrDwlC7bssPxySQqt1QZqusE=", "CodeSize": 584, "UncompressedCodeSize": 0 }, "LayerArn": "arn:aws:lambda:us-west-2:123456789012:layer:bash-runtime", "LayerVersionArn": "arn:aws:lambda:us-west-2:123456789012:layer:bash-runtime:1", "Description": "", "CreatedDate": "2018-11-28T07:49:14.476+0000", "Version": 1 }

Cela crée la première version de la couche.

Mettre à jour la fonction

Pour utiliser la couche de runtime avec la fonction, configurez la fonction pour utiliser la couche et supprimez le code du runtime de la fonction.

Mettez à jour la configuration de la fonction pour extraire la couche.

runtime-tutorial$ aws lambda update-function-configuration --function-name bash-runtime \ --layers arn:aws:lambda:us-west-2:123456789012:layer:bash-runtime:1 { "FunctionName": "bash-runtime", "Layers": [ { "Arn": "arn:aws:lambda:us-west-2:123456789012:layer:bash-runtime:1", "CodeSize": 584, "UncompressedCodeSize": 679 } ] ... }

Cela ajoute le runtime à la fonction dans le répertoire /opt. Lambda utilise ce runtime, mais uniquement si vous le supprimez du package de déploiement de la fonction. Mettez à jour le code de la fonction de façon à inclure uniquement le script du gestionnaire.

runtime-tutorial$ zip function-only.zip function.sh adding: function.sh (deflated 24%) runtime-tutorial$ aws lambda update-function-code --function-name bash-runtime --zip-file fileb://function-only.zip { "FunctionName": "bash-runtime", "CodeSize": 270, "Layers": [ { "Arn": "arn:aws:lambda:us-west-2:123456789012:layer:bash-runtime:7", "CodeSize": 584, "UncompressedCodeSize": 679 } ] ... }

Appelez la fonction pour vérifier qu'elle fonctionne avec la couche du runtime.

runtime-tutorial$ aws lambda invoke --function-name bash-runtime --payload '{"text":"Hello"}' response.txt { "StatusCode": 200, "ExecutedVersion": "$LATEST" } runtime-tutorial$ cat response.txt Echoing request: '{"text":"Hello"}'

Mettre à jour le runtime

Pour enregistrer des informations sur l'environnement d'exécution, mettez à jour le script du runtime pour générer les variables d'environnement.

Exemple amorçage

#!/bin/sh set -euo pipefail echo "## Environment variables:" env # Initialization - load function handler source $LAMBDA_TASK_ROOT/"$(echo $_HANDLER | cut -d. -f1).sh" ...

Créez une deuxième version de la couche avec le nouveau code.

runtime-tutorial$ zip runtime.zip bootstrap updating: bootstrap (deflated 39%) runtime-tutorial$ aws lambda publish-layer-version --layer-name bash-runtime --zip-file fileb://runtime.zip

Configurez la fonction pour utiliser la nouvelle version de la couche.

runtime-tutorial$ aws lambda update-function-configuration --function-name bash-runtime \ --layers arn:aws:lambda:us-west-2:123456789012:layer:bash-runtime:2

Partager la couche

Ajoutez une instruction d'autorisation dans la couche de votre runtime afin de la partager avec d'autres comptes.

runtime-tutorial$ aws lambda add-layer-version-permission --layer-name bash-runtime --version-number 2 \ --principal "*" --statement-id publish --action lambda:GetLayerVersion { "Statement": "{\"Sid\":\"publish\",\"Effect\":\"Allow\",\"Principal\":\"*\",\"Action\":\"lambda:GetLayerVersion\",\"Resource\":\"arn:aws:lambda:us-west-2:123456789012:layer:bash-runtime:2\"}", "RevisionId": "9d5fe08e-2a1e-4981-b783-37ab551247ff" }

Vous pouvez ajouter plusieurs instructions qui accordent, chacune, une autorisation à un compte unique, aux comptes d'une organisation ou à tous les comptes.

Nettoyage

Supprimez chaque version de la couche.

runtime-tutorial$ aws lambda delete-layer-version --layer-name bash-runtime --version-number 1 runtime-tutorial$ aws lambda delete-layer-version --layer-name bash-runtime --version-number 2

Étant donné que la fonction contient une référence à la version 2 de la couche, elle existe toujours dans Lambda. La fonction continue de fonctionner, mais les fonctions ne peuvent plus être configurées pour utiliser la version supprimée. Si vous modifiez ensuite la liste des couches sur la fonction, vous devez spécifier une nouvelle version ou omettre la couche supprimée.

Supprimez la fonction de didacticiel à l'aide de la commande delete-function.

runtime-tutorial$ aws lambda delete-function --function-name bash-runtime