

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon Cognito イベントによるワークフローのカスタマイズ
<a name="cognito-events"></a>

****  
Amazon Cognito Sync を初めて使用する場合は、[AWS AppSync](https://aws.amazon.com/appsync/) を使用してください。Amazon Cognito Sync と同様に、 AWS AppSync はデバイス間でアプリケーションデータを同期するためのサービスです。  
このサービスは、アプリの設定やゲームステートといったユーザーデータの同期化を可能にします。また、複数のユーザーが同期し、共有されたデータでリアルタイムにコラボレートできるようにすることで、これらの機能を拡張します。

Amazon Cognito Events では、Amazon Cognito の重要なイベントに応じて 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 コンソールを開きます。

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

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

1. [Configure event sources] (イベントソースの設定) 画面で、イベントソースのタイプを [Cognito Sync Trigger] に設定し、ID プールを選択します。[Next] (次へ) をクリックします。
**注記**  
Amazon Cognito Sync トリガーをコンソール外で設定する場合、Amazon Cognito が関数を呼び出せるように、Lambda リソースベースの権限を追加する必要があります。このアクセス許可は、Lambda コンソール (「 [リソースベースのポリシーの使用 AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/access-control-resource-based.html)」を参照) または Lambda [AddPermission](https://docs.aws.amazon.com/lambda/latest/dg/API_AddPermission.html) オペレーションを使用して追加できます。  
**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": "arn:{{aws}}:lambda:{{us-east-1}}:{{111122223333}}:function:{{MyFunction}}",
               "Condition": {
                   "StringEquals": {
                       "AWS:SourceAccount": "{{111122223333}}"
                   },
                   "ArnLike": {
                       "AWS:SourceArn": "arn:{{aws}}:cognito-identity:{{us-east-1}}:{{111122223333}}:identitypool/{{us-east-1:abcdefg-1234-5678-910a-0e8443553f95}}"
                   }
               }
           }
       ]
   }
   ```

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

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

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

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

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

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

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

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

1. [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 を除くすべてのフィールドは読み取り専用です。それらを変更しないでください。これらのフィールドを変更すると、レコードを更新することはできません。
+ レコードの値を変更するには、値を更新し、`op` を `replace` に設定します。
+ レコードを削除するには、`op` を `remove` に設定するか、値を 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);
};
```