Personalización de los flujos de trabajo con Amazon Cognito Events - Amazon Cognito

Personalización de los flujos de trabajo con Amazon Cognito Events

Si es la primera vez que utiliza Amazon Cognito Sync, utilice AWS AppSync. Como Amazon Cognito Sync, AWS AppSync es un servicio destinado a sincronizar los datos de las aplicaciones entre dispositivos.

Con este, se pueden sincronizar los datos de usuarios, como las preferencias de aplicación o el estado del juego. También amplía estas funcionalidades, ya que permite que varios usuarios se sincronicen y colaboren en tiempo real sobre los datos compartidos.

Con Amazon Cognito Events, puede ejecutar una función de AWS Lambda como respuesta a eventos importantes de Amazon Cognito. Amazon Cognito lanza el evento desencadenador de sincronización cuando se sincroniza un conjunto de datos. Puede utilizar el evento disparador de la sincronización para actuar cuando un usuario actualiza los datos. La función puede evaluar y, de forma opcional, manipular los datos antes de que estos se almacenen en la nube y se sincronicen con los demás dispositivos del usuario. Es una función útil para validar los datos que vienen del dispositivo antes de que se sincronicen con los demás dispositivos del usuario o actualizar otros valores del conjunto de datos en función de los datos de entrada, como la emisión de un premio cuando un jugador logra un nivel nuevo.

Siga estos pasos para configurar una función de Lambda que se ejecuta cada vez que se sincroniza un conjunto de datos de Amazon Cognito.

nota

Cuando utilice Amazon Cognito Events, solo puede utilizar las credenciales obtenidas de Amazon Cognito Identity. Si tiene una función de Lambda asociada, pero llama a UpdateRecords con las credenciales de la cuenta de AWS (credenciales de desarrollador), la función de Lambda no se invocará.

Creación de una función en AWS Lambda

Para integrar Lambda en Amazon Cognito, primero debe crear una función en Lambda. Para ello:

Selección de la función de Lambda en Amazon Cognito
  1. Abra la consola Lambda.

  2. Haga clic en Create a Lambda function (Crear una función de Lambda).

  3. En la pantalla Select blueprint, busque "cognito-sync-trigger" y selecciónelo.

  4. En la pantalla Configure event sources, deje el tipo de fuente de evento establecido en "Cognito Sync Trigger" y seleccione su grupo de identidades. Haga clic en Next (Siguiente).

    nota

    Al configurar un desencadenador de Amazon Cognito Sync fuera de la consola, debe agregar permisos basados en recursos de Lambda para permitir que Amazon Cognito invoque la función. Puede agregar este permiso desde la consola de Lambda (consulte Uso de políticas basadas en recursos para AWS Lambda) o mediante el Lambda AddPermission.

    Ejemplo de política basada en recursos de Lambda

    En la siguiente política basada en recursos de AWS Lambda se otorga a Amazon Cognito una capacidad limitada para invocar una función Lambda. Amazon Cognito solo puede invocar la función en nombre del grupo de identidades en la condición aws:SourceArn y en la cuenta en la condición 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. En la pantalla de la función Configure, especifique un nombre y una descripción para su función. Deje Runtime establecido en "Node.js". No cambie el código para el ejemplo. El ejemplo predeterminado no modifica los datos que se están sincronizando. Solo registra el hecho de que se ha producido el evento desencadenador de Amazon Cognito Sync. Deje el nombre del controlador establecido en "index.handler". Para la opción de rol, seleccione un rol de IAM que conceda a su código permiso para acceder a AWS Lambda. Para modificar roles, consulte la consola de IAM. Deje la configuración avanzada sin cambiar. Haga clic en Next (Siguiente).

  6. En la pantalla Review, revise los detalles y haga clic en Create function. En la página siguiente, se muestra la nueva función de Lambda.

Ahora que ya tiene una función adecuada escrita en Lambda, debe elegir esa función como controlador del evento desencadenador de Amazon Cognito Sync. Los pasos siguientes le guiarán por este proceso.

En la página de inicio de la consola:

  1. Haga clic en el nombre del grupo de identidades para el que desee configurar Amazon Cognito Events. Se mostrará la página Dashboard (Panel) de su grupo de identidades.

  2. En la esquina superior derecha de la página Dashboard, haga clic en Manage Federated Identities. Se visualizará la página Manage Federated Identities.

  3. Desplácese hacia abajo y haga clic en Cognito Events para ampliar esta opción.

  4. En el menú desplegable Sync Trigger (Desencadenador de sincronización), seleccione la función de Lambda que desee activar cuando se produzca un evento de sincronización.

  5. Haga clic en Save Changes (Guardar cambios).

Ahora su función de Lambda se ejecutará cada vez que se sincronice un conjunto de datos. En la sección siguiente se explica cómo puede leer y modificar los datos de su función mientras se están sincronizando.

Escritura de una función de Lambda para los desencadenadores de sincronización

Los desencadenadores de sincronización respetan el patrón de programación de la interfaz del proveedor de servicios. Amazon Cognito proporciona datos de entrada con el formato JSON siguiente a su función de Lambda.

{ "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 espera que el valor de retorno de la función tenga el mismo formato que el de entrada.

Al escribir funciones para el evento Sync Trigger, observe lo siguiente:

  • Cuando Amazon Cognito llama a la función de Lambda durante una operación UpdateRecords, esta función debe responder en un plazo máximo de 5 segundos. Si no lo hace, el servicio de Amazon Cognito Sync genera una excepción LambdaSocketTimeoutException. No puede aumentar este valor de tiempo de espera.

  • Si recibe una excepción LambdaThrottledException, intente ejecutar la operación de sincronización de nuevo para actualizar los registros.

  • Amazon Cognito proporciona todos los registros presentes en el conjunto de datos como datos de entrada para la función.

  • Los registros que actualiza el usuario de la aplicación tienen el campo op definido como replace. Los registros eliminados tienen el campo op definido como remove.

  • Puede modificar cualquier registro, aunque el usuario de la aplicación no lo actualice.

  • Todos los campos, salvo datasetRecords, son de solo lectura. No los cambie. Si cambia estos campos, no podrá actualizar los registros.

  • Para modificar el valor de un registro, actualice el valor y defina op como replace.

  • Para eliminar un registro, establezca op en remove o defina un valor nulo.

  • Para añadir un registro, solo tiene que añadir un registro nuevo en la matriz datasetRecords.

  • Amazon Cognito ignora cualquier registro omitido en la respuesta cuando Amazon Cognito actualiza el registro.

Función de Lambda de ejemplo

En la siguiente función de Lambda de ejemplo se muestra cómo acceder, modificar y eliminar datos.

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); };