Evénements Amazon Cognito - Amazon Cognito

Evénements Amazon Cognito

Si vous débutez avec Amazon Cognito Sync, utilisez AWS AppSync. Comme Amazon Cognito Sync, AWS AppSync est un service permettant de synchroniser des données d'application sur différents appareils.

Il permet de synchroniser les données utilisateur telles que des préférences de l'application ou l'état d'un jeu. Il étend également ces capacités en permettant à plusieurs utilisateurs de se synchroniser et de collaborer en temps réel sur des données partagées.

Les événements Amazon Cognito vous permettent d'exécuter une fonction AWS Lambda en réponse à des événements importants dans Amazon Cognito. Amazon Cognito déclenche l'événement Sync Trigger lors de la synchronisation d'un jeu de données. Vous pouvez utiliser cet événement pour effectuer une action lorsqu'un utilisateur met à jour des données. Cette fonction peut évaluer et éventuellement manipuler les données avant d'être stockées dans le cloud et synchronisées avec les autres dispositifs de l'utilisateur. Elle est particulièrement utile pour valider des données provenant d'un dispositif avant qu'elles ne soient synchronisées avec les autres appareils de l'utilisateur, ou pour mettre à jour d'autres valeurs dans l'ensemble de données en fonction des données entrantes (comme l'attribution d'un prix quand un joueur atteint un nouveau niveau).

Les étapes ci-dessous illustrent comment configurer une fonction Lambda qui s'exécute chaque fois qu'un jeu de données Amazon Cognito est synchronisé.

Note

Lorsque vous utilisez des événements Amazon Cognito, vous pouvez uniquement utiliser les informations d'identification obtenues d'Amazon Cognito Identity. Si vous avez une fonction Lambda associée, mais appelez UpdateRecords avec des informations d'identification de compte AWS (informations d'identification de développeur), votre fonction Lambda n'est pas appelée.

Création d'une fonction dans AWS Lambda

Pour intégrer Lambda avec Amazon Cognito, vous devez commencer par créer une fonction dans Lambda. Pour ce faire :

Sélection de la fonction Lambda dans Amazon Cognito

  1. Ouvrez la console Lambda.

  2. Cliquez sur Créer une fonction Lambda.

  3. Sur l'écran Select blueprint, recherchez « cognito-sync-trigger » et sélectionnez cette option.

  4. Sur l'écran Configure event sources, laissez le type de source d'événement sur « Cognito Sync Trigger » dans Event source type, puis sélectionnez votre groupe d'identités. Cliquez sur Next (Suivant).

    Note

    Lorsque vous configurez un déclencheur Amazon Cognito Sync en dehors de la console, vous devez ajouter des autorisations basées sur les ressources Lambda pour autoriser Amazon Cognito à appeler la fonction. Vous pouvez ajouter cette autorisation à partir de la console Lambda (voir Utilisation de politiques basées sur les ressources pour AWS Lambda) ou en utilisant l'opération Lambda AddPermission.

    Exemple de politique basée sur les ressources Lambda

    La politique AWS Lambda suivante basée sur les ressources permet à Amazon Cognito d'appeler d'une manière limitée une fonction Lambda. Amazon Cognito ne peut appeler la fonction que pour le compte du groupe d'identités dans la condition aws:SourceArn et du compte dans la condition aws:SourceAccount.

    { "Version": "2012-10-17", "Id": "default", "Statement": [ { "Sid": "lambda-allow-cognito-my-function", "Effect": "Allow", "Principal": { "Service": "cognito-sync.amazonaws.com" }, "Action": "lambda:InvokeFunction", "Resource": "<your Lambda function ARN>", "Condition": { "StringEquals": { "AWS:SourceAccount": "<your account number>" }, "ArnLike": { "AWS:SourceArn": "<your identity pool ARN>" } } } ] }
  5. Sur l'écran Configurer la fonction, saisissez un nom et une description pour votre fonction. Laissez « Node.js » pour Runtime. Ne modifiez pas le code pour notre exemple. L'exemple par défaut ne modifie pas les données qui sont en cours de synchronisation. Il enregistre uniquement le fait que l'événement Sync Trigger d'Amazon Cognito a eu lieu. Conservez le nom de gestionnaire « index.handler ». Pour l'option Rôle, sélectionnez un rôle IAM qui autorise votre code à accéder à AWS Lambda. Pour modifier les rôles, consultez la console IAM. Ne modifiez pas les paramètres avancés. Cliquez sur Next (Suivant).

  6. Sur l'écran Révision, passez en revue les détails et cliquez sur Create fonction. La page suivante affiche votre nouvelle fonction Lambda.

Maintenant qu'une fonction appropriée est écrite dans Lambda, vous devez choisir cette fonction en tant que gestionnaire de l'événement Sync Trigger d'Amazon Cognito. Les étapes indiquées ci-dessous vous guident tout au long de ce processus.

A partir de la page d'accueil de la console :

  1. Cliquez sur le nom du groupe d'identités pour lequel vous souhaitez configurer des événements Amazon Cognito. La page Dashboard (Tableau de bord) correspondant à votre groupe d'identités s'affiche.

  2. Dans l'angle supérieur droit de la page Tableau de bord, cliquez sur Gérer les identités fédérées. La page Gérer les identités fédérées s'ouvre.

  3. Faites défiler l'écran vers le bas et cliquez sur Cognito Events pour développer cette option.

  4. Dans le menu déroulant Sync Trigger, sélectionnez la fonction Lambda que vous souhaitez déclencher lorsqu'un événement de synchronisation se produit.

  5. Cliquez sur Save Changes (Enregistrer les modifications).

Désormais, la fonction Lambda sera exécutée à chaque synchronisation d'un jeu de données. La section suivante explique comment lire et modifier les données dans votre fonction lorsqu'elles sont en cours de synchronisation.

Écriture d'une fonction Lambda pour des déclencheurs de synchronisation

Les déclencheurs de synchronisation suivent le modèle de programmation suivi par les interfaces du fournisseur de services. Amazon Cognito fournit une entrée à votre fonction Lambda au format JSON suivant.

{ "version": 2, "eventType": "SyncTrigger", "region": "us-east-1", "identityPoolId": "identityPoolId", "identityId": "identityId", "datasetName": "datasetName", "datasetRecords": { "SampleKey1": { "oldValue": "oldValue1", "newValue": "newValue1", "op": "replace" }, "SampleKey2": { "oldValue": "oldValue2", "newValue": "newValue2", "op": "replace" },.. } }

Amazon Cognito attend la valeur de retour de la fonction au même format que l'entrée.

Lorsque vous écrivez des fonctions pour l'événement de déclencheur de synchronisation, observez les points suivants :

  • Quand Amazon Cognito appelle votre fonction Lambda au cours d'une opération UpdateRecords, la fonction doit répondre dans un délai de 5 secondes. Sinon, le service Amazon Cognito Sync génère une exception LambdaSocketTimeoutException. Vous ne pouvez pas augmenter ce délai d'attente.

  • Si vous obtenez une exception LambdaThrottledException, réessayez l'opération de synchronisation pour mettre à jour les enregistrements.

  • Amazon Cognito fournit tous les enregistrements présents dans le jeu de données en tant qu'entrée pour la fonction.

  • Les enregistrements mis à jour par l'utilisateur de l'application ont le champ op défini sur replace. Les enregistrements supprimés ont le champ op défini sur remove.

  • Vous pouvez modifier n'importe quel enregistrement, même si l'utilisateur de l'application ne met pas à jour l'enregistrement.

  • Tous les champs sauf datasetRecords sont en lecture seule. Ne les modifiez pas. Si vous modifiez ces champs, vous ne pouvez pas mettre à jour les enregistrements.

  • Pour modifier la valeur d'un enregistrement, mettez-la à jour et définissez le champ op sur replace.

  • Pour supprimer un enregistrement, définissez le champ op sur remove, ou définissez la valeur sur null.

  • Pour ajouter un enregistrement, ajoutez un nouvel enregistrement dans le tableau datasetRecords.

  • Amazon Cognito ignore tout enregistrement omis dans la réponse quand Amazon Cognito met à jour l'enregistrement.

Exemple de fonction Lambda

L'exemple de fonction Lambda suivant montre comment accéder aux données, les modifier et les supprimer.

console.log('Loading function'); exports.handler = function(event, context) { console.log(JSON.stringify(event, null, 2)); //Check for the event type if (event.eventType === 'SyncTrigger') { //Modify value for a key if('SampleKey1' in event.datasetRecords){ event.datasetRecords.SampleKey1.newValue = 'ModifyValue1'; event.datasetRecords.SampleKey1.op = 'replace'; } //Remove a key if('SampleKey2' in event.datasetRecords){ event.datasetRecords.SampleKey2.op = 'remove'; } //Add a key if(!('SampleKey3' in event.datasetRecords)){ event.datasetRecords.SampleKey3={'newValue':'ModifyValue3', 'op' : 'replace'}; } } context.done(null, event); };