[Amazon Cognito] JavaScript でデータ同期する

# 1. Abstract
[Amazon Cognito](http://aws.amazon.com/jp/cognito/) は、ユーザ認証とデータ同期の２つの機能を提供します。データ同期の記事をあまり見かけないので今回はデータ同期の話をします。

**1.ユーザ認証**
Facebook／Google／Amazon といったIDプロバイダでのユーザ認証、もしくは未認証でのゲストを扱えます。

**2.データ同期**　**←今回はコレ★**
ネットワーク状況を考慮せずとも、簡単に AWS 上に任意のデータを同期し保存することできます。

※環境
us-east-1 リージョン
Google Chrome

***

AWS Management Console から Cognito の Identity Pool を作成すると、iOS, Android, .NET の Starter Code が表示される（ダウンロードもできる）のですぐに開始できますが、**JavaScript についての言及がありません**。

この記事ではブラウザから **JavaScript によるデータ同期を実施**してみたいと思います。

![Screen_Shot_2014-12-19_at_11_17_56_PM.png](https://qiita-image-store.s3.amazonaws.com/0/19485/260defaa-6537-35b5-86f6-cf40451d1cc8.png)

# 2. Create Cognito Identity Pool
AWS Management Console から Identity Pool を作成します。データ同期について実施したいだけなので、 Unauthorized (未認証ゲスト)で利用します。

![Pasted_Image_12_19_14__11_35_PM.png](https://qiita-image-store.s3.amazonaws.com/0/19485/2f76b50f-713d-6498-3af0-4c993e4a6615.png)
↓↓↓
![Screen_Shot_2014-12-19_at_11_16_43_PM.png](https://qiita-image-store.s3.amazonaws.com/0/19485/6755afc8-2631-15da-3496-e1a2e471db51.png)

# 3. Include Cognito Sync Manager SDK for JavaScript
AWS SDK for JavaScript および [Cognito Sync Manager SDK for JavaScript](https://github.com/aws/amazon-cognito-js) を HTML にインクルードします。

```html:index.html
<script src="https://sdk.amazonaws.com/js/aws-sdk-2.1.4.min.js"></script>
<script src="js/amazon-cognito.min.js"></script>
```

# 4. Source code and Execution result
CognitoSyncClient を生成し、データセットを操作するスクリプトを記述します。

ページ読み込み時には、Dataset を Create もしくは Open のうえ、Key:"myData" のデータを Console.log() に表示します。また読み込み時には、Key:"myData" の Value に "newValue" という文字列を put して同期しています。

```js:index.html
var client = null; 
AWS.config.region = 'us-east-1';
var cognitoParams = {
    AccountId: 'AWS_ACCOUNT_ID',
    IdentityPoolId: 'IDENITY_POOL_ID',
    RoleArn: 'arn:aws:iam::xxxx:UNAUTHENTICATED_ROLE_ARN'
};
 
AWS.config.credentials = new AWS.CognitoIdentityCredentials(cognitoParams);
AWS.config.credentials.get(function() {
    client = new CognitoSyncManager();

    client.openOrCreateDataset("myDatasetName", function(err, dataset) {
        dataset.get('myData', function(err, value) {
            console.log('myData = ' + value);
        });

        dataset.put('myData', 'newValue', function(err, record) {
            if ( !err ) {
                dataset.synchronize({
                    onSuccess: function(dataset, newRecords) {
                        console.log("Data saved successfully.");
                    },
                    onFailure: function(err) {
                        console.log("Error occured.");
                    },
                    onConflict: function(dataset, conflicts, callback) {
                        var resolved = [];
                        for (var i=0; i < conflicts.length; i++) {
                            resolved.push(conflicts[i].resolveWithRemoteRecord());
                        }
                        dataset.resolve(resolved, function(err) {
                            callback(true);
                        });
                    },
                    onDatasetDeleted: function(dataset, datasetName, callback) {
                        return callback(true);
                    },
                    onDatasetMerged: function(dataset, datasetNames, callback) {
                        return callback(false); 
                    }
                });
            }
        });
    }
});
```
ソースコードはここに置いときます。
https://gist.github.com/shimy/ed319fc37ccdd61a4af3

###Result
ページ初回読み込み時には、データはありませんので undefined, ２回目読み込み以降は "newValue" という値がセットされていることがわかります。

**初回の読み込み時**
![Screen_Shot_2014-12-20_at_1_08_14_AM.png](https://qiita-image-store.s3.amazonaws.com/0/19485/40ed3e8f-d30e-d64b-c358-177df3440880.png)
　
　
**２回目以降の読み込み時**
![Screen_Shot_2014-12-20_at_1_08_28_AM.png](https://qiita-image-store.s3.amazonaws.com/0/19485/0d58972c-a72c-1ef1-232c-394c6db261ef.png)
　
　
**AWS Management Console**
Data sync が動作しデータが保存されたことがわかります。

![Screen Shot 2014-12-20 at 1.32.46 AM.png](https://qiita-image-store.s3.amazonaws.com/0/19485/f63e03f8-b2b9-19e9-d571-a164b6f6ce9d.png)
　
　
#免責
こちらは個人の意見で会社とは関係ありません。