Amazon Cognito
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

Amazon Cognito 事件

注意

如果您是 Amazon Cognito Sync 的新用户,请使用 AWS AppSync。与 Amazon Cognito Sync 相似,AWS AppSync 是一项在不同设备之间同步应用程序数据的新服务。

它使应用程序首选项或游戏状态等用户数据能够实现同步。它还允许多名用户针对共享数据进行实时同步和协作,从而扩展了这些功能。

Amazon Cognito 事件让您能够执行 AWS Lambda 函数,以响应 Amazon Cognito 中的重要事件。当数据集得到同步时,Amazon Cognito 会引发同步触发事件。当用户更新数据时,您可以使用同步触发事件采取行动。该函数可以评估并有选择性地操作数据,然后,数据才会存储到云中并同步到用户的其他设备。这有利于在来自设备的数据同步到用户的其他设备之前对其进行验证,或者基于传入数据更新数据集中的其他值,如在玩家达到新级别时颁发奖励。

以下步骤将引导您设置每次 Amazon Cognito 数据集同步时都会执行的 Lambda 函数。

注意

使用 Amazon Cognito 事件时,您只能使用从 Amazon Cognito 身份 获取的凭证。如果您有关联的 Lambda 函数,但您通过 AWS 账户凭证(开发人员凭证)调用 UpdateRecords,则不会调用 Lambda 函数。

在 AWS Lambda 中创建函数

要将 Lambda 与 Amazon Cognito 集成,您首先需要在 Lambda 中创建函数。为此,请执行以下操作:

在 Amazon Cognito 中选择 Lambda 函数

  1. 打开 Lambda 控制台。

  2. 单击“Create a Lambda function”。

  3. 在“Select blueprint”屏幕上,搜索并选择“cognito-sync-trigger”。

  4. 在“Configure event sources”屏幕上,将“Event source type”设置保留为“Cognito Sync Trigger”,并选择您的身份池。单击 Next。

  5. 在“Configure function”屏幕上,输入函数的名称和描述。将“Runtime”设置保留为“Node.js”。 在我们的示例中保留原来的代码。默认示例没有更改正在同步的数据。它只记录发生了 Amazon Cognito 同步触发事件这一事实。将“Handler name”设置保留为“index.handler”。 对于“Role”,选择一个授权您的代码访问 AWS Lambda 的 IAM 角色。要修改角色,请参阅 IAM 控制台。将“Advanced”设置保留不变。单击 Next。

  6. 在“Review”屏幕上,查看详细信息,并单击“Create function”。下一页面将显示您的新 Lambda 函数。

现在,Lambda 中已经写入了相应的函数,您需要选择该函数作为 Amazon Cognito Sync 触发事件的处理程序。以下步骤将指导您完成此过程。

从控制台主页:

  1. 单击要为其设置 Amazon Cognito 事件的身份池的名称。此时将显示身份池的“控制面板”页。

  2. 在 Dashboard 页的右上角,单击 Manage Federated Identities。出现 Manage Federated Identities 页。

  3. 向下滚动,并单击“Cognito Events”,以将其展开。

  4. 在“Sync Trigger”下拉菜单中,选择您希望在同步事件发生时触发的 Lambda 函数。

  5. 单击 Save Changes。

现在,您的 Lambda 函数将在每次数据集同步时执行。下一部分将介绍如何在数据同步时读取和修改函数中的数据。

编写同步触发的 Lambda 函数

同步触发遵循服务提供商接口编程范例。Amazon Cognito 将按照以下 JSON 格式为您的 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 预计函数的返回值与输入格式相同。下面提供了完整示例。

编写同步触发事件的函数时,应记住以下关键点:

  • 在 UpdateRecords 过程中调用 Lambda 函数时,该函数必须在 5 秒内响应。如果没有,则 Amazon Cognito 同步服务将引发 LambdaSocketTimeoutException 异常。这个超时值无法增加。

  • 如果您收到 LambdaThrottledException 异常,则应重新尝试同步操作 (更新记录)。

  • Amazon Cognito 将提供数据集中出现的所有记录,以作为函数的输入。

  • 对于应用程序用户更新的记录,其“op”字段将设置为“replace”;对于删除的记录,其“op”字段将设置为“remove”。

  • 您可以修改任何记录,即使应用程序用户未进行更新,也是如此。

  • 除 datasetRecords 之外的所有字段只能读取,不应更改。更改这些字段将导致记录更新失败。

  • 要修改记录的值,只需更新该值并将“op”设置为“replace”。

  • 要删除记录,将“op”设置为“remove”,或将该值设置为空。

  • 要添加记录,只需将新记录添加到 datasetRecords 数组。

  • 更新时将忽略响应中省略的所有记录。

示例 Lambda 函数

以下是显示如何访问、修改和删除数据的示例 Lambda 函数。

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