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é.
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
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
-
Copiez l'exemple de code dans un fichier nommé
index.js
. -
Créez un package de déploiement.
zip function.zip index.js
-
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-exVous 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 Windowsbase64 -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
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-functions
AWS 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.