Amazon Cognito イベント - Amazon Cognito

Amazon Cognito イベント

Amazon Cognito Sync を初めて使用する場合は、AWS AppSync を使用してください。Amazon Cognito Sync と同様に、AWS AppSync はデバイス間でアプリケーションデータを同期化するためのサービスです。

このサービスは、アプリの設定やゲームステートといったユーザーデータの同期化を可能にします。また、複数のユーザーが同期し、共有されたデータでリアルタイムにコラボレートできるようにすることで、これらの機能を拡張します。

Amazon Cognito Events は、Amazon Cognito Sync での重要なイベントへの対応として AWS Lambda 関数を実行することを可能にします。Amazon Cognito は、データセットが同期されるときに Sync Trigger イベントを生成します。Sync Trigger イベントを使用して、ユーザーがデータを更新するときにアクションを実行できます。この関数は、クラウド内に保存し、ユーザーの他のデバイスに同期する前にデータを評価して、オプションで操作できます。これは、ユーザーの他のデバイスに対して同期する前に、デバイスから受信するデータを検証したり、プレーヤーが新しいレベルに達したときに賞を与えるなど、受信データに基づいてデータセットの他の値を更新する場合に役立ちます。

以下のステップでは、Amazon Cognito のデータセットが同期されるたびに実行される Lambda 関数のセットアップ手順を説明します。

注記

Amazon Cognito イベントを使用するときは、Amazon Cognito ID から取得した認証情報しか使用できません。関連付けられた Lambda 関数があっても、AWS アカウントの認証情報 (デベロッパー認証情報) を使用して UpdateRecords を呼び出すと、Lambda 関数は呼び出されません。

AWS Lambda で関数の作成

Lambda を Amazon Cognito と統合するには、最初に Lambda で関数を作成する必要があります。これを行うには、以下の手順を実行します。

Amazon Cognito での Lambda 関数の選択

  1. Lambda コンソールを開きます。

  2. [Create a Lambda function] (Lambda 関数の作成) をクリックします。

  3. [Select blueprint] (設計図の選択) 画面で、「cognito-sync-trigger」を検索して選択します。

  4. [Configure event sources] (イベントソースの設定) 画面で、イベントソースのタイプを [Cognito Sync Trigger] に設定し、ID プールを選択します。[Next] (次へ) をクリックします。

    注記

    Amazon Cognito Sync トリガーをコンソール外で設定する場合、Amazon Cognito が関数を呼び出せるように、Lambda リソースベースの権限を追加する必要があります。この許可は、Lambda コンソール(「Using resource-based policies for AWS Lambda」を参照)から追加するか、Lambda AddPermission オペレーションを使用して追加できます。

    Lambda リソースベースのポリシーの例

    次の AWS Lambda リソースベースのポリシーは、Amazon Cognito に Lambda 関数を呼び出す制限付きの機能を付与します。Amazon Cognitoは、条件 aws:SourceArn のID プールと条件 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. [Configure function] (関数の設定) 画面で、関数の名前と説明を入力します。[Runtime] (ランタイム) を「Node.js」に設定したままにします。コードは、例では変更しないまま使用します。デフォルトの例では、同期中のデータに変更を加えません。コードは、Amazon Cognito Sync Trigger イベントが発生したことのみを記録します。[Handler] (ハンドラ) の名前は「index.handler」設定のままにしておきます。[Role] (ロール) については、AWS Lambda にアクセスするためのコード許可を付与する IAM ロールを選択します。ロールを変更する方法については、「IAM コンソール」を参照してください。[Advanced settings] (詳細設定) は変更しないまま使用します。[Next] (次へ) をクリックします。

  6. [Review] (確認) 画面で詳細を確認し、[Create function] (関数の作成) をクリックします。次のページに新しい Lambda 関数が表示されます。

Lambda で適切な関数を作成したところで、この関数を Amazon Cognito Sync Trigger イベントのハンドラとして選択する必要があります。以下のステップで、このプロセスについて説明します。

コンソールのホームページから、以下の操作を行います。

  1. Amazon Cognito イベントをセットアップする ID プールの名前をクリックします。ID プールのダッシュボードページが表示されます。

  2. ダッシュボードページの右上にある [Manage Federated Identities] (フェデレーティッド ID の管理) をクリックします。[Manage Federated Identities] (フェデレーティッド ID の管理) ページが表示されます。

  3. スクロールダウンし、[Cognito Events] (Cognito イベント) をクリックして展開します。

  4. [Sync Trigger] ドロップダウンメニューで、Sync イベントが発生したときにトリガーする Lambda 関数を選択します。

  5. [Save Changes] (変更の保存) をクリックします。

これで、データセットが同期されるたびに Lambda 関数が実行されるようになります。次のセクションでは、同期中に関数のデータの読み取りと修正を行う方法について説明します。

Sync trigger 用の Lambda 関数の記述

Sync Trigger は、サービスプロバイダインタフェースが使用するプログラミングパラダイムに従います。Amazon Cognito は、Lambda 関数に対して以下の JSON 形式の入力を提供します。

{ "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 では、関数の戻り値が入力と同じ形式であることが想定されています。

Sync Trigger イベント用の関数を記述するときは、次の点に注意してください。

  • Amazon Cognito が、UpdateRecords の実行時に Lambda 関数を呼び出すと、関数は 5 秒以内に応答する必要があります。応答しない場合、Amazon Cognito Sync サービスが LambdaSocketTimeoutException 例外をスローします。このタイムアウト値を大きくすることはできません。

  • LambdaThrottledException 例外を取得した場合は、同期オペレーションをもう一度実行して、レコードを更新します。

  • Amazon Cognito は、データセットに存在するすべてのレコードを関数に提供します。

  • アプリユーザーが更新するレコードには、op フィールドが replace として設定されています。削除されたレコードには、op フィールドが remove として設定されています。

  • アプリユーザーがレコードを更新していない場合でも、任意のレコードを変更できます。

  • datasetRecords を除くすべてのフィールドは読み取り専用です。それらを変更しないでください。これらのフィールドを変更すると、レコードを更新することはできません。

  • レコードの値を変更するには、値を更新し、opreplace に設定します。

  • レコードを削除するには、opremove に設定するか、値を null に設定します。

  • レコードを追加するには、datasetRecords 配列に新しいレコードを追加します。

  • Amazon Cognito は、Amazon Cognito がレコードを更新するときに、レスポンス内の省略されたレコードを無視します。

サンプル 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); };