Utilisation de Lambda avec AWS CLI - AWS Lambda

Utilisation de Lambda avec AWS CLI

Vous pouvez utiliser l'AWS Command Line Interface pour gérer les fonctions et les autres ressources d'AWS Lambda. L'AWS CLI utilise l'AWS SDK for Python (Boto) pour interagir avec l'API Lambda. Vous pouvez l'utiliser pour en savoir plus sur l'API, et appliquer ces connaissances pour générer des applications qui utilisent Lambda avec le kit SDK AWS.

Dans ce didacticiel, vous gérez et appelez des fonctions Lambda avec la AWS CLI. Pour plus d'informations, consultez Qu'est-ce que l'AWS CLI? dans le AWS Command Line InterfaceGuide de l'utilisateur.

Prérequis

Ce didacticiel suppose que vous avez quelques connaissances des opérations Lambda de base et de la console Lambda. Si vous ne l'avez pas encore fait, suivez les instructions de Créer une fonction Lambda à l'aide de la console.

Pour effectuer les étapes suivantes, vous devez disposer d'un terminal de ligne de commande ou d'un shell pour exécuter des commandes. Les commandes et la sortie attendue sont répertoriées dans des blocs distincts :

aws --version

Vous devriez voir la sortie suivante:

aws-cli/2.0.57 Python/3.7.4 Darwin/19.6.0 exe/x86_64

Pour les commandes longues, un caractère d'échappement (\) est utilisé pour les fractionner en plusieurs lignes.

Sur Linux et macOS, utilisez votre gestionnaire de shell et de package préféré.

Note

Sous Windows, certaines commandes CLI Bash que vous utilisez couramment avec Lambda (par exemple zip) ne sont pas prises en charge par les terminaux intégrés du système d'exploitation. Installez le sous-système Windows pour Linux afin d'obtenir une version intégrée à Windows d'Ubuntu et Bash. Les exemples de commandes CLI de ce guide utilisent le formatage Linux. Les commandes qui incluent des documents JSON en ligne doivent être reformatées si vous utilisez la CLI Windows.

Ce didacticiel utilise l’AWS Command Line Interface (AWS CLI) pour appeler les opérations d'API de service. Pour installer l’AWS CLI, consultez Installation de l’AWS CLI dans le Guide de l’utilisateur AWS Command Line Interface.

Créer le rôle d'exécution

Créez le rôle d'exécution qui donne à votre fonction l'autorisation d'accéder aux ressources AWS. Pour créer un rôle d'exécution avec AWS CLI, utilisez la commande create-role.

Dans l'exemple suivant, vous spécifiez la politique d'approbation en ligne. Les exigences relatives à l'échappement des guillemets dans la chaîne JSON varient en fonction de votre shell.

aws iam create-role --role-name lambda-ex --assume-role-policy-document '{"Version": "2012-10-17","Statement": [{ "Effect": "Allow", "Principal": {"Service": "lambda.amazonaws.com"}, "Action": "sts:AssumeRole"}]}'

Vous pouvez également définir la politique d'approbation pour le rôle à l'aide d'un fichier JSON. Dans l'exemple suivant, le fichier trust-policy.json se trouve dans le répertoire actuel. Cette stratégie d'approbation permet à Lambda d'utiliser les autorisations du rôle en donnant au principal de service lambda.amazonaws.com l'autorisation d'appeler l'action AWS Security Token Service (AWS STS) AssumeRole.

Exemple trust-policy.json
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
aws iam create-role --role-name lambda-ex --assume-role-policy-document file://trust-policy.json

Vous devriez voir la sortie suivante :

{ "Role": { "Path": "/", "RoleName": "lambda-ex", "RoleId": "AROAQFOXMPL6TZ6ITKWND", "Arn": "arn:aws:iam::123456789012:role/lambda-ex", "CreateDate": "2020-01-17T23:19:12Z", "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] } } }

Pour ajouter des autorisations au rôle, utilisez la commande attach-policy-to-role. Commencez par ajouter la stratégie gérée AWSLambdaBasicExecutionRole.

aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole

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

Créer la fonction

L'exemple suivant consigne les valeurs des variables d'environnement et l'objet d'événement.

Exemple index.js
exports.handler = async function(event, context) { console.log("ENVIRONMENT VARIABLES\n" + JSON.stringify(process.env, null, 2)) console.log("EVENT\n" + JSON.stringify(event, null, 2)) return context.logStreamName }
Pour créer la fonction
  1. Copiez l'exemple de code dans un fichier nommé index.js.

  2. Créez un package de déploiement.

    zip function.zip index.js
  3. Créez une fonction Lambda à l'aide de la commande create-function. Remplacez le texte en surbrillance dans l'ARN du rôle par votre ID de compte.

    aws lambda create-function --function-name my-function \ --zip-file fileb://function.zip --handler index.handler --runtime nodejs18.x \ --role arn:aws:iam::123456789012:role/lambda-ex

    Vous devriez voir la sortie suivante:

    { "FunctionName": "my-function", "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function", "Runtime": "nodejs18.x", "Role": "arn:aws:iam::123456789012:role/lambda-ex", "Handler": "index.handler", "CodeSha256": "FpFMvUhayLkOoVBpNuNiIVML/tuGv2iJQ7t0yWVTU8c=", "Version": "$LATEST", "TracingConfig": { "Mode": "PassThrough" }, "RevisionId": "88ebe1e1-bfdf-4dc3-84de-3017268fa1ff", ... }

Pour obtenir les journaux pour un appel à partir de la ligne de commande, utilisez l'option --log-type. La réponse inclut un champ LogResult qui contient jusqu'à 4 Ko de journaux codés en base64 provenant de l'appel.

aws lambda invoke --function-name my-function out --log-type Tail

Vous devriez voir la sortie suivante:

{ "StatusCode": 200, "LogResult": "U1RBUlQgUmVxdWVzdElkOiA4N2QwNDRiOC1mMTU0LTExZTgtOGNkYS0yOTc0YzVlNGZiMjEgVmVyc2lvb...", "ExecutedVersion": "$LATEST" }

Vous pouvez utiliser l'utilitaire base64 pour décoder les journaux.

aws lambda invoke --function-name my-function out --log-type Tail \ --query 'LogResult' --output text | base64 -d

Vous devriez voir la sortie suivante:

START RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8 Version: $LATEST "AWS_SESSION_TOKEN": "AgoJb3JpZ2luX2VjELj...", "_X_AMZN_TRACE_ID": "Root=1-5d02e5ca-f5792818b6fe8368e5b51d50;Parent=191db58857df8395;Sampled=0"",ask/lib:/opt/lib", END RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8 REPORT RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8 Duration: 79.67 ms Billed Duration: 80 ms Memory Size: 128 MB Max Memory Used: 73 MB

L'utilitaire base64 est disponible sur Linux, MacOS et Ubuntu sous Windows. Pour MacOS, la commande est base64 -D.

Pour obtenir des événements de journaux complets à partir de la ligne de commande, vous pouvez inclure le nom du flux de journaux dans la sortie de votre fonction, comme illustré dans l'exemple précédent. L'exemple de script suivant appelle une fonction nommée my-function et télécharge les cinq derniers événement de journaux.

Exemple Script get-logs.sh

Cet exemple nécessite que my-function renvoie un ID de flux de journal.

#!/bin/bash aws lambda invoke --function-name my-function --cli-binary-format raw-in-base64-out --payload '{"key": "value"}' out sed -i'' -e 's/"//g' out sleep 15 aws logs get-log-events --log-group-name /aws/lambda/my-function --log-stream-name $(cat out) --limit 5

Le script utilise sed pour supprimer les guillemets du fichier de sortie et attend 15 secondes pour permettre la mise à disposition des journaux. La sortie comprend la réponse de Lambda, ainsi que la sortie de la commande get-log-events.

./get-logs.sh

Vous devriez voir la sortie suivante :

{ "StatusCode": 200, "ExecutedVersion": "$LATEST" } { "events": [ { "timestamp": 1559763003171, "message": "START RequestId: 4ce9340a-b765-490f-ad8a-02ab3415e2bf Version: $LATEST\n", "ingestionTime": 1559763003309 }, { "timestamp": 1559763003173, "message": "2019-06-05T19:30:03.173Z\t4ce9340a-b765-490f-ad8a-02ab3415e2bf\tINFO\tENVIRONMENT VARIABLES\r{\r \"AWS_LAMBDA_FUNCTION_VERSION\": \"$LATEST\",\r ...", "ingestionTime": 1559763018353 }, { "timestamp": 1559763003173, "message": "2019-06-05T19:30:03.173Z\t4ce9340a-b765-490f-ad8a-02ab3415e2bf\tINFO\tEVENT\r{\r \"key\": \"value\"\r}\n", "ingestionTime": 1559763018353 }, { "timestamp": 1559763003218, "message": "END RequestId: 4ce9340a-b765-490f-ad8a-02ab3415e2bf\n", "ingestionTime": 1559763018353 }, { "timestamp": 1559763003218, "message": "REPORT RequestId: 4ce9340a-b765-490f-ad8a-02ab3415e2bf\tDuration: 26.73 ms\tBilled Duration: 27 ms \tMemory Size: 128 MB\tMax Memory Used: 75 MB\t\n", "ingestionTime": 1559763018353 } ], "nextForwardToken": "f/34783877304859518393868359594929986069206639495374241795", "nextBackwardToken": "b/34783877303811383369537420289090800615709599058929582080" }

Mettre à jour la fonction

Après avoir créé une fonction, vous pouvez configurer des fonctionnalités supplémentaires pour la fonction, telles que des déclencheurs, un accès au réseau et un accès au système de fichiers. Vous pouvez également ajuster des ressources associées à la fonction, telles que la mémoire et la simultanéité. Ces configurations s'appliquent aux fonctions définies en tant qu'archives de fichiers .zip et en tant qu'images conteneurs.

Utiliser la commande mise à jour de la fonction-configuration pour configurer les fonctions. L'exemple suivant définit la mémoire de la fonction à 256 Mo.

Exemple Commande update-function-configuration
aws lambda update-function-configuration \ --function-name my-function \ --memory-size 256

Répertorier les fonctions Lambda dans votre compte

Exécutez la commande list-functions suivante de l'AWS CLI pour récupérer la liste des fonctions que vous avez créées.

aws lambda list-functions --max-items 10

Vous devriez voir la sortie suivante:

{ "Functions": [ { "FunctionName": "cli", "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function", "Runtime": "nodejs18.x", "Role": "arn:aws:iam::123456789012:role/lambda-ex", "Handler": "index.handler", ... }, { "FunctionName": "random-error", "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:random-error", "Runtime": "nodejs18.x", "Role": "arn:aws:iam::123456789012:role/lambda-role", "Handler": "index.handler", ... }, ... ], "NextToken": "eyJNYXJrZXIiOiBudWxsLCAiYm90b190cnVuY2F0ZV9hbW91bnQiOiAxMH0=" }

En réponse, Lambda renvoie une liste de maximum 10 fonctions. S'il existe plus de fonctions à récupérer, NextToken fournit un marqueur que vous pourrez utiliser dans la demande list-functions suivante. La commande list-functionsAWS CLI suivante est un exemple qui illustre le paramètre --starting-token.

aws lambda list-functions --max-items 10 --starting-token eyJNYXJrZXIiOiBudWxsLCAiYm90b190cnVuY2F0ZV9hbW91bnQiOiAxMH0=

Récupérer une fonction Lambda

La commande get-function de la CLI Lambda renvoie les métadonnées de la fonction Lambda et une URL présignée que vous pouvez utiliser pour télécharger le package de déploiement de la fonction.

aws lambda get-function --function-name my-function

Vous devriez voir la sortie suivante:

{ "Configuration": { "FunctionName": "my-function", "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function", "Runtime": "nodejs18.x", "Role": "arn:aws:iam::123456789012:role/lambda-ex", "CodeSha256": "FpFMvUhayLkOoVBpNuNiIVML/tuGv2iJQ7t0yWVTU8c=", "Version": "$LATEST", "TracingConfig": { "Mode": "PassThrough" }, "RevisionId": "88ebe1e1-bfdf-4dc3-84de-3017268fa1ff", ... }, "Code": { "RepositoryType": "S3", "Location": "https://awslambda-us-east-2-tasks.s3.us-east-2.amazonaws.com/snapshots/123456789012/my-function-4203078a-b7c9-4f35-..." } }

Pour plus d'informations, consultez GetFunction.

Nettoyage

Exécutez la commande delete-function suivante pour supprimer la fonction my-function.

aws lambda delete-function --function-name my-function

Supprimez le rôle IAM que vous avez créé dans la console IAM. Pour plus d'informations sur la suppression de rôle, consultez Suppression de rôles ou de profils d'instance dans le Guide de l'utilisateur IAM.