1. Abstract
Amazon Cognito は、ユーザ認証とデータ同期の2つの機能を提供します。データ同期の記事をあまり見かけないので今回はデータ同期の話をします。
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 によるデータ同期を実施してみたいと思います。
2. Create Cognito Identity Pool
AWS Management Console から Identity Pool を作成します。データ同期について実施したいだけなので、 Unauthorized (未認証ゲスト)で利用します。
3. Include Cognito Sync Manager SDK for JavaScript
AWS SDK for JavaScript および Cognito Sync Manager SDK for JavaScript を 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 して同期しています。
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, 2回目読み込み以降は "newValue" という値がセットされていることがわかります。
初回の読み込み時
2回目以降の読み込み時
AWS Management Console
Data sync が動作しデータが保存されたことがわかります。