Tengo un diseño de arquitectura en el que uso Cognito para la administración de usuarios (correo electrónico, número de teléfono son los únicos atributos) y luego uso DynamoDB para sincronizar también a los usuarios, de modo que pueda hacer que el usuario de AppSync consulte y obtenga información del usuario.
Necesito alguna forma de sincronizar los usuarios de DynamoDB con los usuarios de Cognito. En este momento, tengo un disparador lambda posterior a la confirmación del usuario para ejecutar inserciones en DynamoDB en la confirmación del nuevo usuario para toda la información anterior, PERO:
¿Cuál es la arquitectura ideal para mantener sincronizados a Cognito y DynamoDB?
Yo tuve el mismo problema. Guardo el correo electrónico, el nombre de la familia y el nombre dado en cognito como parte del proceso de registro. Luego, los usuarios pueden cambiar cualquiera de estos campos en cualquier momento.
No pude encontrar una forma de realizar un seguimiento de estos cambios, ya que la documentación no indica ningún activador lambda de este tipo para los eventos de sincronización. Sin embargo, dado que el idToken contiene los atributos del usuario en mi caso, debe actualizarse solo después de que el usuario realice un cambio. Así que probé esto y descubrí que el activador Pre-Token se invoca cada vez que hay un cambio en los atributos del usuario para que pueda regenerar un nuevo token. Esa lambda contiene la siguiente carga útil
{ version: '1', triggerSource: 'TokenGeneration_RefreshTokens', region: 'XXX', userPoolId: '', userName: 'XXX', callerContext: { awsSdkVersion: 'aws-sdk-unknown-unknown', clientId: 'XXX' }, request: { userAttributes: { sub: 'XXX', email_verified: 'false', 'cognito:user_status': 'CONFIRMED', 'cognito:email_alias': 'user1@mailinator.com', given_name: 'Name', family_name: 'New', email: 'user1@mailinator.com' }, groupConfiguration: { groupsToOverride: [], iamRolesToOverride: [], preferredRole: null } }, response: { claimsOverrideDetails: null } }Así que actualizo los registros en dynamodb en este mismo lambda. Sin embargo, no estoy 100% seguro porque la documentación no dice nada sobre este caso de uso y el disparador previo al token. Pruébalo y verás.
Consideraría no sincronizar estos detalles con DynamoDb. Puede consultar Cognito de la misma manera que una base de datos para buscar/obtener usuarios. La forma en que hacemos esto es que usamos el sub de Cognito (el id) para el ID de usuario de DynamoDb para que sea muy fácil obtener datos de DynamoDb para un usuario en particular. La tabla db es más una tabla de información complementaria como la que está utilizando para mantener datos de usuario adicionales. En mi opinión, será mucho más fácil: entonces no necesita lidiar con nada relacionado con los cambios de correo electrónico.
Por ejemplo, tenemos una sincronización de aplicaciones de administrador que se usa para cuenta/usuario. Para encontrar o mutar a un usuario, generalmente usamos un Lambda que llama a los métodos de Cognito .