Didacticiel : utilisation de Lambda avec Amazon SQS - 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.

Didacticiel : utilisation de Lambda avec Amazon SQS

Dans ce didacticiel, vous créerez une fonction Lambda qui consomme les messages d’une file d’attente Amazon Simple Queue Service (Amazon SQS). La fonction Lambda s’exécute chaque fois qu’un nouveau message est ajouté à la file d’attente. La fonction écrit les messages dans un flux Amazon CloudWatch Logs. Le diagramme suivant montre les ressources AWS utilisées pour compléter ce tutoriel.

Schéma montrant le message Amazon SQS, la fonction Lambda et le flux CloudWatch Logs

Pour compléter ce didacticiel, effectuez les tâches suivantes :

  1. Créez une fonction Lambda qui écrit des messages dans CloudWatch Logs.

  2. Créer une file d’attente Amazon SQS.

  3. Créez un mappage des sources d’événements Lambda. Le mappage des sources d’événements lit la file d’attente Amazon SQS et invoque votre fonction Lambda lorsqu’un nouveau message est ajouté.

  4. Testez la configuration en ajoutant des messages à votre file d’attente et surveillez les résultats dans CloudWatch Logs.

Prérequis

Si vous n‘avez pas de compte Compte AWS, procédez comme suit pour en créer un.

Pour s‘inscrire à un Compte AWS
  1. Ouvrez https://portal.aws.amazon.com/billing/signup.

  2. Suivez les instructions en ligne.

    Dans le cadre de la procédure d‘inscription, vous recevrez un appel téléphonique et vous saisirez un code de vérification en utilisant le clavier numérique du téléphone.

    Lorsque vous souscrivez à un Compte AWS, un Utilisateur racine d'un compte AWS est créé. Par défaut, seul l‘utilisateur racine a accès à l‘ensemble des Services AWS et des ressources de ce compte. La meilleure pratique de sécurité consiste à attribuer un accès administratif à un utilisateur, et à utiliser uniquement l‘utilisateur racine pour effectuer les tâches nécessitant un accès utilisateur racine.

AWS vous envoie un e-mail de confirmation lorsque le processus d‘inscription est terminé. Vous pouvez afficher l‘activité en cours de votre compte et gérer votre compte à tout moment en accédant à https://aws.amazon.com/ et en choisissant Mon compte.

Une fois que vous vous êtes inscrit à un Compte AWS, sécurisez l’Utilisateur racine d'un compte AWS, activez AWS IAM Identity Center et créez un utilisateur administratif afin de ne pas utiliser l’utilisateur root pour les tâches quotidiennes.

Sécurisation de votre Utilisateur racine d'un compte AWS
  1. Connectez-vous à la AWS Management Console en tant que propriétaire du compte en sélectionnant Root user (Utilisateur racine) et en saisissant votre adresse e-mail Compte AWS. Sur la page suivante, saisissez votre mot de passe.

    Pour obtenir de l‘aide pour vous connecter en utilisant l‘utilisateur racine, consultez Connexion en tant qu‘utilisateur racine dans le Guide de l‘utilisateur Connexion à AWS.

  2. Activez l‘authentification multifactorielle (MFA) pour votre utilisateur racine.

    Pour obtenir des instructions, consultez Activation d‘un dispositif MFA virtuel pour l‘utilisateur racine de votre Compte AWS (console) dans le Guide de l‘utilisateur IAM.

Création d’un utilisateur doté d’un accès administratif
  1. Activez IAM Identity Center.

    Pour obtenir des instructions, consultez Activation d’AWS IAM Identity Center dans le Guide de l’utilisateur AWS IAM Identity Center.

  2. Dans IAM Identity Center, octroyez un accès administratif à un utilisateur.

    Pour un didacticiel sur l’utilisation de l’Répertoire IAM Identity Center comme source d’identité, consultez Configuration de l’accès utilisateur avec l’Répertoire IAM Identity Center par défaut dans le Guide de l’utilisateur AWS IAM Identity Center.

Connexion en tant qu‘utilisateur doté d’un accès administratif
  • Pour vous connecter avec votre utilisateur IAM Identity Center, utilisez l‘URL de connexion qui a été envoyée à votre adresse e-mail lorsque vous avez créé l‘utilisateur IAM Identity Center.

    Pour obtenir de l‘aide pour vous connecter à l‘aide d‘un utilisateur IAM Identity Center, consultez Connexion au portail d‘accès AWS dans le Guide de l‘utilisateur Connexion à AWS.

Attribution d’un accès à d’autres utilisateurs
  1. Dans IAM Identity Center, créez un ensemble d’autorisations qui respecte la bonne pratique consistant à appliquer les autorisations de moindre privilège.

    Pour obtenir des instructions, consultez Création d’un ensemble d’autorisations dans le Guide de l’utilisateur AWS IAM Identity Center.

  2. Attribuez des utilisateurs à un groupe, puis attribuez un accès par authentification unique au groupe.

    Pour obtenir des instructions, consultez Ajout de groupes dans le Guide de l’utilisateur AWS IAM Identity Center.

Si vous n’avez pas encore installé le AWS Command Line Interface, suivez les étapes de la rubrique Installation ou mise à jour de la dernière version de la AWS CLI pour l’installer.

Ce tutoriel nécessite un terminal de ligne de commande ou un shell pour exécuter les commandes. Sous 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.

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

Étape 1 : créer le rôle d’exécution

Un rôle d’exécution est un rôle AWS Identity and Access Management (IAM) qui accorde à la fonction Lambda l’autorisation d’accéder aux Services AWS et aux ressources. Pour permettre à votre fonction de lire les éléments d’Amazon SQS, attachez la politique d’autorisations AWSLambdaSQSQueueExecutionRole.

Pour créer un rôle d’exécution et attacher une politique d’autorisations Amazon SQS
  1. Ouvrez la page Rôles de la console IAM.

  2. Sélectionnez Créer un rôle.

  3. Pour Type d’entité de confiance, choisissez Service AWS.

  4. Pour Cas d’utilisation, choisissez Lambda.

  5. Choisissez Suivant.

  6. Dans le champ de recherche Politiques d’autorisations, saisissez AWSLambdaSQSQueueExecutionRole.

  7. Sélectionnez la politique AWSLambdaSQSQueueExecutionRole, puis choisissez Suivant.

  8. Sous Détails du rôle, pour Nom du rôle, saisissez lambda-sqs-role, puis sélectionnez Créer un rôle.

Après la création du rôle, notez l’Amazon Resource Name (ARN) de votre rôle d’exécution. Vous en aurez besoin dans les étapes suivantes.

Créer la fonction

Étape 2 : créer la fonction Lambda

Créez une fonction Lambda qui traite vos messages Amazon SQS. Le code de la fonction enregistre le corps du message Amazon SQS dans les journaux CloudWatch.

Ce didacticiel utilise l’exécution Node.js 18.x, mais nous avons également fourni des exemples de code dans d’autres langages d’exécution. Vous pouvez sélectionner l’onglet dans la zone suivante pour voir le code de l’exécution qui vous intéresse. Le code JavaScript que vous allez utiliser dans cette étape se trouve dans le premier exemple affiché dans l’onglet JavaScript.

.NET
AWS SDK for .NET
Note

Il y en a plus sur GitHub. Trouvez l’exemple complet et découvrez comment le configurer et l’exécuter dans le référentiel d’exemples sans serveur.

Utilisation d’un événement SQS avec Lambda en utilisant .NET.

// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 using Amazon.Lambda.Core; using Amazon.Lambda.SQSEvents; // Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class. [assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))] namespace SqsIntegrationSampleCode { public async Task FunctionHandler(SQSEvent evnt, ILambdaContext context) { foreach (var message in evnt.Records) { await ProcessMessageAsync(message, context); } context.Logger.LogInformation("done"); } private async Task ProcessMessageAsync(SQSEvent.SQSMessage message, ILambdaContext context) { try { context.Logger.LogInformation($"Processed message {message.Body}"); // TODO: Do interesting work based on the new message await Task.CompletedTask; } catch (Exception e) { //You can use Dead Letter Queue to handle failures. By configuring a Lambda DLQ. context.Logger.LogError($"An error occurred"); throw; } } }
Go
Kit SDK for Go V2
Note

Il y en a plus sur GitHub. Trouvez l’exemple complet et découvrez comment le configurer et l’exécuter dans le référentiel d’exemples sans serveur.

Consommation d’un événement SQS avec Lambda à l’aide de Go.

// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 package integration_sqs_to_lambda import ( "fmt" "github.com/aws/aws-lambda-go/events" "github.com/aws/aws-lambda-go/lambda" ) func handler(event events.SQSEvent) error { for _, record := range event.Records { err := processMessage(record) if err != nil { return err } } fmt.Println("done") return nil } func processMessage(record events.SQSMessage) error { fmt.Printf("Processed message %s\n", record.Body) // TODO: Do interesting work based on the new message return nil } func main() { lambda.Start(handler) }
Java
SDK pour Java 2.x
Note

Il y en a plus sur GitHub. Trouvez l’exemple complet et découvrez comment le configurer et l’exécuter dans le référentiel d’exemples sans serveur.

Utilisation d’un événement SQS avec Lambda à l’aide de Java.

// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; import com.amazonaws.services.lambda.runtime.events.SQSEvent; import com.amazonaws.services.lambda.runtime.events.SQSEvent.SQSMessage; public class Function implements RequestHandler<SQSEvent, Void> { @Override public Void handleRequest(SQSEvent sqsEvent, Context context) { for (SQSMessage msg : sqsEvent.getRecords()) { processMessage(msg, context); } context.getLogger().log("done"); return null; } private void processMessage(SQSMessage msg, Context context) { try { context.getLogger().log("Processed message " + msg.getBody()); // TODO: Do interesting work based on the new message } catch (Exception e) { context.getLogger().log("An error occurred"); throw e; } } }
JavaScript
Kit SDK pour JavaScript (v3)
Note

Il y en a plus sur GitHub. Trouvez l’exemple complet et découvrez comment le configurer et l’exécuter dans le référentiel d’exemples sans serveur.

Utilisation d’un événement SQS avec Lambda en utilisant JavaScript.

// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 exports.handler = async (event, context) => { for (const message of event.Records) { await processMessageAsync(message); } console.info("done"); }; async function processMessageAsync(message) { try { console.log(`Processed message ${message.body}`); // TODO: Do interesting work based on the new message await Promise.resolve(1); //Placeholder for actual async work } catch (err) { console.error("An error occurred"); throw err; } }

Utilisation d’un événement SQS avec Lambda en utilisant TypeScript.

// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { SQSEvent, Context, SQSHandler, SQSRecord } from "aws-lambda"; export const functionHandler: SQSHandler = async ( event: SQSEvent, context: Context ): Promise<void> => { for (const message of event.Records) { await processMessageAsync(message); } console.info("done"); }; async function processMessageAsync(message: SQSRecord): Promise<any> { try { console.log(`Processed message ${message.body}`); // TODO: Do interesting work based on the new message await Promise.resolve(1); //Placeholder for actual async work } catch (err) { console.error("An error occurred"); throw err; } }
PHP
Kit SDK pour PHP
Note

Il y en a plus sur GitHub. Trouvez l’exemple complet et découvrez comment le configurer et l’exécuter dans le référentiel d’exemples sans serveur.

Consommation d’un événement SQS avec Lambda à l’aide de PHP.

// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 <?php # using bref/bref and bref/logger for simplicity use Bref\Context\Context; use Bref\Event\InvalidLambdaEvent; use Bref\Event\Sqs\SqsEvent; use Bref\Event\Sqs\SqsHandler; use Bref\Logger\StderrLogger; require __DIR__ . '/vendor/autoload.php'; class Handler extends SqsHandler { private StderrLogger $logger; public function __construct(StderrLogger $logger) { $this->logger = $logger; } /** * @throws InvalidLambdaEvent */ public function handleSqs(SqsEvent $event, Context $context): void { foreach ($event->getRecords() as $record) { $body = $record->getBody(); // TODO: Do interesting work based on the new message } } } $logger = new StderrLogger(); return new Handler($logger);
Python
SDK pour Python (Boto3)
Note

Il y en a plus sur GitHub. Trouvez l’exemple complet et découvrez comment le configurer et l’exécuter dans le référentiel d’exemples sans serveur.

Utilisation d’un événement SQS avec Lambda à l’aide de Python.

# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 def lambda_handler(event, context): for message in event['Records']: process_message(message) print("done") def process_message(message): try: print(f"Processed message {message['body']}") # TODO: Do interesting work based on the new message except Exception as err: print("An error occurred") raise err
Ruby
Kit SDK pour Ruby
Note

Il y en a plus sur GitHub. Trouvez l’exemple complet et découvrez comment le configurer et l’exécuter dans le référentiel d’exemples sans serveur.

Utilisation d’un événement SQS avec Lambda à l’aide de Ruby.

# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 def lambda_handler(event:, context:) event['Records'].each do |message| process_message(message) end puts "done" end def process_message(message) begin puts "Processed message #{message['body']}" # TODO: Do interesting work based on the new message rescue StandardError => err puts "An error occurred" raise err end end
Rust
SDK pour Rust
Note

Il y en a plus sur GitHub. Trouvez l’exemple complet et découvrez comment le configurer et l’exécuter dans le référentiel d’exemples sans serveur.

Consommation d’un événement SQS avec Lambda à l’aide de Rust.

// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 use aws_lambda_events::event::sqs::SqsEvent; use lambda_runtime::{run, service_fn, Error, LambdaEvent}; async fn function_handler(event: LambdaEvent<SqsEvent>) -> Result<(), Error> { event.payload.records.iter().for_each(|record| { // process the record tracing::info!("Message body: {}", record.body.as_deref().unwrap_or_default()) }); Ok(()) } #[tokio::main] async fn main() -> Result<(), Error> { tracing_subscriber::fmt() .with_max_level(tracing::Level::INFO) // disable printing the name of the module in every log line. .with_target(false) // disabling time is handy because CloudWatch will add the ingestion time. .without_time() .init(); run(service_fn(function_handler)).await }
Pour créer une fonction Lambda Node.js.
  1. Créez un répertoire pour le projet, puis passez à ce répertoire.

    mkdir sqs-tutorial cd sqs-tutorial
  2. Copiez l’exemple de code JavaScript dans un nouveau fichier nommé index.js.

  3. Créez un package de déploiement à l’aide de la commande zip suivante.

    zip function.zip index.js
  4. Créez une fonction Lambda à l’aide de la commande AWS CLI create-function. Pour le paramètre role, entrez l’ARN du rôle d’exécution que vous avez créé précédemment.

    Note

    La fonction Lambda et la file d’attente Amazon SQS doivent se trouver dans la même Région AWS.

    aws lambda create-function --function-name ProcessSQSRecord \ --zip-file fileb://function.zip --handler index.handler --runtime nodejs18.x \ --role arn:aws:iam::111122223333:role/lambda-sqs-role

Tester la fonction

Étape 3 : tester la fonction Lambda

Invoquez manuellement votre fonction Lambda à l’aide de la commande invoke AWS CLI et d’un exemple d’événement Amazon SQS.

Pour invoquer la fonction Lambda avec un exemple d’événement
  1. Enregistrez le JSON suivant en tant que fichier nommé input.json. Ce JSON simule un événement qu’Amazon SQS pourrait envoyer à votre fonction Lambda, où "body" contient le message réel de la file d’attente. Dans cet exemple, le message est "test".

    Exemple Événement Amazon SQS

    Il s’agit d’un événement de test : vous n’avez pas besoin de modifier le message ou le numéro de compte.

    { "Records": [ { "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d", "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...", "body": "test", "attributes": { "ApproximateReceiveCount": "1", "SentTimestamp": "1545082649183", "SenderId": "AIDAIENQZJOLO23YVJ4VO", "ApproximateFirstReceiveTimestamp": "1545082649185" }, "messageAttributes": {}, "md5OfBody": "098f6bcd4621d373cade4e832627b4f6", "eventSource": "aws:sqs", "eventSourceARN": "arn:aws:sqs:us-east-1:111122223333:my-queue", "awsRegion": "us-east-1" } ] }
  2. Exécutez la commande AWS CLI invoquer suivante. Cette commande renvoie les journaux CloudWatch dans la réponse. Pour de plus amples informations sur la récupération des journaux, veuillez consulter Accédez aux journaux avec le AWS CLI.

    aws lambda invoke --function-name ProcessSQSRecord --payload file://input.json out --log-type Tail \ --query 'LogResult' --output text --cli-binary-format raw-in-base64-out | base64 --decode

    L’option cli-binary-format est obligatoire si vous utilisez AWS CLI version 2. Pour faire de ce paramètre le paramètre par défaut, exécutez aws configure set cli-binary-format raw-in-base64-out. Pour plus d’informations, consultez les options de ligne de commande globales prises en charge par l’AWS CLI dans le Guide de l’utilisateur AWS Command Line Interface version 2.

  3. Recherchez le journal INFO dans la réponse. C’est ici que la fonction Lambda enregistre le corps du message. Vous devriez voir des journaux qui ressemblent à ceci :

    2023-09-11T22:45:04.271Z 348529ce-2211-4222-9099-59d07d837b60 INFO Processed message test 2023-09-11T22:45:04.288Z 348529ce-2211-4222-9099-59d07d837b60 INFO done

Créez une file d’attente Amazon SQS.

Étape 4 : créer la file d’attente Amazon SQS

Créez une file d’attente Amazon SQS que la fonction Lambda peut utiliser en tant que source d’événement. La fonction Lambda et la file d’attente Amazon SQS doivent se trouver dans la même Région AWS.

Pour créer une file d’attente
  1. Ouvrez la console Amazon SQS.

  2. Choisissez Créez une file d’attente.

  3. Entrez un nom pour la queue. Conservez les paramètres par défaut de toutes les autres options.

  4. Choisissez Créez une file d’attente.

Une fois la file d’attente créée, notez son ARN. Vous en aurez besoin à l’étape suivante lorsque vous associerez la file d’attente à votre fonction Lambda.

Configurer la source de l’événement

Étape 5 : configurer le mappage des sources d’événements

Connectez la file d’attente Amazon SQS à votre fonction Lambda en créant un mappage des sources d’événements. Le mappage des sources d’événements lit la file d’attente Amazon SQS et invoque votre fonction Lambda lorsqu’un nouveau message est ajouté.

Pour créer un mappage entre votre file d’attente Amazon SQS et votre fonction Lambda, exécutez la commande la commande AWS CLI create-event-source-mapping. Exemple :

aws lambda create-event-source-mapping --function-name ProcessSQSRecord --batch-size 10 \ --event-source-arn arn:aws:sqs:us-east-1:111122223333:my-queue

Pour obtenir la liste de vos mappages des sources d’événements, utilisez la commande list-event-source-mappings. Exemple :

aws lambda list-event-source-mappings --function-name ProcessSQSRecord

Envoyer un message de test

Étape 6 : envoyer un message de test
Pour envoyer un message Amazon SQS à la fonction Lambda
  1. Ouvrez la console Amazon SQS.

  2. Choisissez la queue que vous avez créée précédemment.

  3. Choisissez Envoyer et recevoir des messages.

  4. Sous Corps du message, entrez un message de test, tel que « ceci est un message de test ».

  5. Choisissez Send Message (Envoyer un message).

Lambda interroge la file d’attente concernant les mises à jour. Lorsqu’il y a un nouveau message, Lambda invoque votre fonction avec ces nouvelles données d’événement de la file d’attente. Si le gestionnaire de la fonction revient sans exception, Lambda considère le message comme traité avec succès et commence à lire de nouveaux messages dans la file d’attente. Après avoir traité un message avec succès, Lambda le supprime automatiquement de la file d’attente. Si le gestionnaire renvoie une exception, Lambda considère que le traitement du lot de messages a échoué et invoque la fonction avec le même lot de messages.

Consulter les journaux de CloudWatch

Étape 6 : envoyer un message de test
Pour confirmer que la fonction a traité le message
  1. Ouvrez la page Functions (Fonctions) de la console Lambda.

  2. Choisissez la fonction ProcessSQSRecord.

  3. Sélectionnez Monitor (Surveiller).

  4. Choisissez Afficher les journaux CloudWatch.

  5. Dans la console CloudWatch, choisissez le Flux de journaux pour la fonction.

  6. Recherchez le journal INFO. C’est ici que la fonction Lambda enregistre le corps du message. Vous devriez voir le message que vous avez envoyé depuis la file d’attente Amazon SQS. Exemple :

    2023-09-11T22:49:12.730Z b0c41e9c-0556-5a8b-af83-43e59efeec71 INFO Processed message this is a test message.

Nettoyage de vos ressources

Vous pouvez maintenant supprimer les ressources que vous avez créées pour ce didacticiel, sauf si vous souhaitez les conserver. En supprimant des ressources AWS que vous n’utilisez plus, vous évitez les frais superflus pour votre Compte AWS.

Pour supprimer le rôle d’exécution
  1. Ouvrez la page Roles (Rôles) de la console IAM.

  2. Sélectionnez le rôle d’exécution que vous avez créé.

  3. Sélectionnez Delete (Supprimer).

  4. Saisissez le nom du rôle dans le champ de saisie de texte et choisissez Delete (Supprimer).

Pour supprimer la fonction Lambda
  1. Ouvrez la page Functions (Fonctions) de la console Lambda.

  2. Sélectionnez la fonction que vous avez créée.

  3. Sélectionnez Actions, Supprimer.

  4. Saisissez delete dans la zone de saisie de texte et choisissez Delete (Supprimer).

Pour supprimer la file d’attente Amazon SQS
  1. Connectez-vous à l’AWS Management Console et ouvrez la console Amazon SQS à l’adresse https://console.aws.amazon.com/sqs/.

  2. Sélectionnez la file d’attente que vous avez créée.

  3. Choisissez Supprimer.

  4. Saisissez confirm dans le champ de saisie de texte.

  5. Sélectionnez Supprimer.